前言#
数ヶ月前に、Windows Terminal を使いやすくする方法という記事を書きました。その記事では、oh-my-posh のインストール、Nerd フォントをインストールして oh-my-posh のフォントアイコンが表示されない問題を解決すること、ssh 接続が長時間操作されないと自動的に切断される問題を解決すること、フォーカスモードを起動すること、煩わしい起動時の著作権情報を削除すること、デフォルトで管理者として起動することなどについて紹介しました。実際には見た目を良くするだけで、使いやすさにはあまり改善がありませんでしたが、今日は再び WT をアップグレードします。
必要なツールのインストール#
まず、Windows Terminal は必須です。次に PowerShell をインストールする必要があります。これらは Microsoft Store からダウンロードしてインストールできます。以下の画像を参照してください。Microsoft Store が開かない場合は、ネットワークを確認してください。一般的にはネットワークの問題です。
oh-my-posh のインストールについてはここでは触れませんが、以前の記事を参照してください。最後に、niをインストールします。これは antfu が開発したコマンドラインツールで、コマンド操作を簡素化し、パッケージマネージャーを自動的に選択します。使ったことがない方はぜひ試してみてください。ドキュメントに従ってコマンドを一行入力すればインストールできますが、Windows で使用する場合はエイリアスの衝突問題が発生する可能性があります。解決策については後述します。
探索プロセスと原理の概要#
Windows Terminal を使って開発を試みたいと思います。Windows Terminal はデフォルトでPowerShell
、cmd
、wsl bash
をスクリプトツールとして使用できます。Windows 環境にいるので、PowerShell を尊重する必要があります。そこで、wt のデフォルトシェルを先ほどインストールした Microsoft Store の PowerShell に変更します。以下の画像を参照してください。
実は最初のインスピレーションは、antfuのライブ配信を見ているときに、彼がコマンドラインで見たこともないような非常に短いコマンドを入力していくつかの操作を実行しているのを見て、私は混乱しました。最後に、彼がシェルにいくつかのエイリアスを設定していることに気づき、GitHub で彼の zsh の設定ファイル設定ファイルをオープンソースにしていることを知りました(Mac ユーザーは喜ぶでしょう、直接コピーできます😂)。しかし、Mac を買うお金がない私は、Windows Terminal で同様の機能を実現するにはどうすればよいのか、試行を始めました。
windows powershell set user alias
というキーワードで検索すると、通常 Google はMicrosoft 公式ドキュメントを提供しますが、このドキュメントはスクリプト内で一時的なエイリアスを設定する方法しか教えていません。永久エイリアスを設定するにはどうすればよいのでしょうか?実際、「エイリアス」というもの、つまりalias
は、ほとんどすべてのスクリプト言語には「永久エイリアス」(Permanent alias)が存在しません。Linux bash や Cmder などのスクリプトツールを使用すると、ターミナルを開くとシステムがデフォルトでスクリプトファイルを実行します(bash はユーザーディレクトリの.bashrc
、Cmder はconfig/user_aliases.cmd
です)。そのようなスクリプトファイルにはエイリアスの定義が含まれています。これが、Linux 系システムで.bashrc
を変更した後、再ログインする必要がある理由や、source .bashrc
を実行する理由です。
したがって、PowerShell が起動時に実行するファイルを変更すればよいのです。多くのフォーラムでは、デフォルトで実行されるスクリプトは$Home\Documents\profile.ps1
、つまりC:\Users\あなたのユーザー名\Documents\profile.ps1
だと言われていますが、これは正しくありません。最良の方法は、まず PowerShell を起動し、次にecho $profile
を実行することです。そうすると得られるファイルパスが PowerShell のデフォルト実行ファイルパスになります。また、ここで注意が必要なのは、以前の記事で設定した後、今日再インストールした PowerShell を wt のデフォルトシェルに設定した場合、再度設定が必要です。なぜなら、この Microsoft Store の PowerShell と Windows に付属の Windows PowerShell は異なるバージョンであり、同じ設定ファイルを共有しないからです。おおよそのパスは以下の通りです:
その後、このファイルを作成すれば良いのです。
ファイル内にエイリアス設定の文を記述します。再度注意ですが、エイリアスが指すコマンドに空白が含まれている場合、New-Alias
コマンドを使用することはできません。空白を含むコマンドを引用符で囲んでも効果はありません。では、どうすればよいのでしょうか?GPT に尋ねたところ、正しい方法はfunction
を使用することだとわかりました。つまり、定義したいコマンドを関数として定義すれば良いのです。
ファイルを保存し、PowerShell を再起動すると、予期せずにFile xxxxxxx\Microsoft.PowerShell_profile.ps1 cannot be loaded because running scripts is disabled on this system.
というエラーが表示されるはずです。このリンクによると、このような状況が発生するのは、Windows システムが悪意のあるスクリプトの自動実行を防ぐために、デフォルトでスクリプトの自動実行を許可していないためです。したがって、自分が制御できると確信している場合は、管理者として PowerShell でSet-ExecutionPolicy RemoteSigned
を実行すれば良いのです。
再度 PowerShell を再起動すると、カスタムエイリアスが有効になっていることに気づくはずです。
エイリアスの衝突解決と引数の最適化#
上記の操作を行った後、設定したエイリアスが確かに使用できることに気づくでしょうが、一部のエイリアスが PowerShell に元々存在するエイリアスと衝突する可能性があります。例えばni
、gp
、gcm
などです。今後も多くの衝突が発生する可能性があります。私たちの解決策は、それらを強制的に削除することです。設定ファイルに以下のコードを追加してください:
Remove-Alias -Name ni -Force
Remove-Alias -Name gp -Force
Remove-Alias -Name gcm -Force
よし、衝突問題は解決しましたが、最後にもう一つの問題があります。それは、引数を渡す必要があるエイリアスコマンドを使用する際に、引数が渡せないことです。引数が必要ない場合は気にしなくて大丈夫です。私たちは、コマンドの後に自動変数$args
を追加するだけで、エイリアス関数が引数を受け取れるようにします。これは、現在のスクリプト、関数、またはスクリプトブロックの未宣言の引数の配列を含みます。簡単に言うと、事前に定義されていない引数をすべてキャッチします。例えば、以下のようになります:
function gcl { git clone $args }
function gst { git stash $args }
function grm { git rm $args }
function gmv { git mv $args }
もしもう少し強度を上げて、より高いカスタマイズ性が必要な場合は、以下のように自分で引数とプロンプトを定義することもできます:
function gcm {
param (
[Parameter(Mandatory=$true)]
[string]$message
)
if (-not $message) {
Write-Host "Error: You must provide a commit message." -ForegroundColor Red
return
}
git commit -m $message
}
要するに、遊び方はたくさんありますので、皆さんはゆっくり研究してください。私が現在使用している設定ファイルをお見せします。テーマを変更したい場合は、ドキュメントを参照して、お好みのテーマを見つけて、最初の行の設定で json テーマファイル名を変更してください。他に問題がある場合は、以前の記事を参考にしてください。
oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\montys.omp.json | Invoke-Expression
cls
function s { nr start }
function d { nr dev }
function b { nr build }
function t { nr test }
function lint { nr lint }
function release { nr release }
function gs { git status }
function gp { git push }
function gpf { git push --force }
function gpl { git pull --rebase }
function gcl { git clone $args }
function gst { git stash $args }
function grm { git rm $args }
function gmv { git mv $args }
function main { git checkout main }
function gco { git checkout $args }
function gcob { git checkout -b $args }
function gb { git branch }
function gbd { git branch -d $args }
function gbD { git branch -D $args }
function grb { git rebase $args }
function grbc { git rebase --continue }
function gme { git merge $args}
function gl { git log }
function glo { git log --oneline --graph }
function ga { git add }
function gA { git add -A }
function gc { git commit }
function gcm {
param (
[Parameter(Mandatory=$true)]
[string]$message
)
if (-not $message) {
Write-Host "Error: You must provide a commit message." -ForegroundColor Red
return
}
git commit -m $message
}
function gca { git commit -a }
function gcam { git commit -am $args }
function l { cls }
function q { exit }
function fuck { shutdown /s /f /t 0 }
Remove-Alias -Name ni -Force
Remove-Alias -Name gp -Force
Remove-Alias -Name gcm -Force
楽しんでください。