前半にターミナルの見た目や操作をかっこよくする方法を紹介して、
後半に PowerShell のコーディング環境を快適にする内容を書きました。
この記事で書くこと
- 最新版 PowerShell 7 のインストール
- 標準で入っているのは Windows PowerShell 5.x のため、最新版をインストールします。
- ターミナルやエディタのセットアップ手順
- Windows Terminal, Visual Studio Code では、標準で入っている Windows PowerShell 5.x を使っているので 7 に切り替えます。
- その他、便利ツールの導入方法
- プロンプトのカスタマイズ(Oh My Posh)、ターミナルの入力補完機能(PSReadLine, carapace)、改良版 cd(zoxide)、Windows 版 sudo(gsudo)を使います。
- コーディング環境の整備
- Visual Studio Code に PowerShell 拡張機能をれて、PowerShell 7 に切り替えます。
この記事で書かないこと
- WindowsTerminal のインストール手順
- 最新の Windows 11 であればデフォルトで入っています。
ない場合はWindows Terminal | Microsoft Storeからインストール可能です。 - WinGet のインストール手順
- こちらも最新の Windows 11 であれば標準でバンドルされています。
ない場合は、アプリ インストーラー | Microsoft Storeからインストールしてください。 - WinGet 以外でのインストール手順
- Scoop や Chocolatey でも同様にインストールできますが、この記事では WinGet に統一しました。
- WSL 上でのセットアップ手順
- Windows と同様に WSL 上でも PowerShell 環境は構築できますが、長くなるので割愛しました。
最新版 PowerShell 7 のインストール
PowerShell 環境の構築を始める前に、PowerShell スクリプト (.ps1) を実行できるようにするため、実行ポリシーを変更します。
PowerShell のデフォルト実行ポリシーは、セキュリティ強化のため、Restricted に設定されています。
これは、PowerShell スクリプトの実行を一切許可しない最も厳格な設定です。
そのため、一般的には、信頼できる発行元からのスクリプトのみ実行を許可する RemoteSigned に変更することが行われます。
これにより、セキュリティを維持しつつ、必要なスクリプトの実行が可能になります。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
確認方法
Get-ExecutionPolicy
#> RemoteSigned
それでは、PowerShell 7 をインストールします。
winget install Microsoft.PowerShell
winget は自動的に環境変数の PATH に追加してくれますが、
PowerShell は再起動しない限り、現在のセッションの PATH 情報は古いままになってしまいます。
そこで、以降の手順をスムーズに実施いただくために profile.ps1 へ以下の関数を定義しておいてください。
この記事では、profile.ps1 がまだ未作成のユーザを想定しています。
既に作成済みの方は、必要に応じて追記 or 編集で読み替えてください。
PowerShell で以下のコードを書いて保存します。
function Update-PathVariable {
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") +
";" +
[System.Environment]::GetEnvironmentVariable("Path", "User")
}
profile.ps1
ファイルは PowerShell が起動したときに一度だけ実施される処理を記載する場所で、主にユーティリティ関数の定義やエイリアス、各種ツールの初期化処理を行うことに使われます。
以降の手順では、$PROFILE.CurrentUserAllHosts
と記載しています。
Windows PowerShell 5 と PowerShell 7 で $PROFILE.CurrentUserAllHosts
の値が違うので、次のステップからは必ず PowerShell 7 で実施してください。
確認方法
. ${env:UserProfile}\Documents\PowerShell\profile.ps1
Update-PathVariable
pwsh --version
#=>PowerShell 7.4.5
Windows Terminal のセットアップ
Windows Terminal では、プロファイルにてターミナル起動時に使用するシェルを設定できます。
Windows PowerShell 5.x は標準でプロファイルが設定されているので、それを複製して作成していきます。
項目 | 設定値 |
---|---|
名前 | PowerShell 7.x |
コマンドライン | %ProgramFiles%\PowerShell\7\pwsh.exe |
アイコン | ms-appx:///ProfileIcons/pwsh.png |
入力できたら保存します。
次に既定のプロファイルを PowerShell 7.x に変更します。
確認方法
Windows Terminal を開きなおして、以下のコマンドを実行します。
インストールしたバージョンになっていれば OK です。
$PSVersionTable.PSVersion
Major Minor Patch PreReleaseLabel BuildLabel
----- ----- ----- --------------- ----------
7 4 5
Visual Studio Code のセットアップ
Visual Studio Code のエディタ内のターミナルでも PowerShell が使えるので、
そちらに対しても、設定変更をしていきます。
Visual Studio Code のインストール
winget install Microsoft.VisualStudioCode
Update-PathVariable
デフォルトのターミナルシェルを pwsh に変更
Ctrl + , で設定ページを開き、 terminal.integrated.profiles.windows
で検索します。
「Edit in settings.json (日本語メニューの場合は「settings.jsonで編集」)」をクリックし、以下の設定を追加します。
{
"terminal.integrated.profiles.windows": {
"PowerShell": {
"path": [
"${env:ProgramFiles}\\PowerShell\\7\\pwsh.exe"
],
"source": "PowerShell",
"icon": "terminal-powershell",
"args": [
"-NoLogo",
"-ExecutionPolicy",
"Bypass"
]
},
<省略>
},
"terminal.integrated.defaultProfile.windows": "PowerShell",
確認方法
Ctrl + Shift + @ でデフォルトのターミナルシェルを起動して、以下のコマンドを実行します。
インストールしたバージョンになっていれば OK です。
$PSVersionTable.PSVersion
Major Minor Patch PreReleaseLabel BuildLabel
----- ----- ----- --------------- ----------
7 4 5
ターミナルの見た目・操作をかっこよくする
いくつかのツールをセットアップして、 PowerShell の使い勝手をよくしていきます。
プロンプトのカスタマイズ | Oh My Posh
まず、Oh My Posh というツールでプロンプトをかっこよくしていきます。
以前は PowerShell 専用のプロンプトカスタマイズツールでしたが、
現在は bash や Nushell など、様々なシェルに対応しているようです。
Nerd Fonts のセットアップ
Oh My Posh をインストールする前に Nerd Fonts がまだ PC へインストールされていない場合は、
そのまま進めてしまうと、プロンプトが文字化けしてしまうので、先に Nerd Fonts のインストールを行ってください。
Nerd Fonts は、プログラミングでよく使う記号やアイコンを豊富に含んだフォントです。
これにより、コードをより視覚的に理解しやすくなり、開発効率が向上します。
お好みのフォントどれか1つで大丈夫です。
特にこだわりない方は Microsoft が WindowsTerminal 用に Cascadia Code というフォントを提供しているので、そちらがおすすめです。
Cascadia Code をダウンロードして zip ファイルを解凍すると、フォントがいくつかありますが、
とりあえず、 CaskaydiaCoveNerdFont-Regular.ttf でいいと思います。
インストール後、 Windows Terminal と Visual Studio Code のフォント設定を変更します。
Windows Terminal のフォント変更
「設定 -> プロファイル(PowerShell 7.x) -> 外観(その他の設定) -> フォントフェイス」で変更できます。
特に再起動不要で適用されるようです。
Visual Studio Code のフォント変更
Ctrl + , で設定ページを開き、以下の Setting ID で検索して変更します。
- Setting ID:
editor.fontFamily
- デフォルトで「Consolas, 'Courier New', monospace」と指定されているので、
その前に 'CaskaydiaCove Nerd Font' を追加します。(記載順から適用されるため)
続いて、リガチャ(合字)を有効にします。
"editor.fontLigatures": true
この設定でエディタ部分はリガチャで表示されます。
ただ、なぜかターミナルは未対応らしく、リガチャになりませんでした。
Oh My Posh のセットアップ
フォントの設定が完了したので、Oh My Posh をセットアップしていきます。
実のところ、最初は Starship を紹介しようとしたのですが、
Starship を導入すると、以降に紹介する zoxide と競合して正常に動作しない事象があったのでやめました。
既に Starship を導入している方はご注意ください。
テーマは emodipt にしていますが、こちらからお好みのテーマに変更いただけます。
ただ、プロンプトの表示がコンパクトで、かつ、時刻表示を付けたい場合は、 emodipt がおすすめです。
winget install JanDeDobbeleer.OhMyPosh -s winget
Update-PathVariable
'oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/emodipt.omp.json" | Invoke-Expression' >> $PROFILE.CurrentUserAllHosts
. $PROFILE.CurrentUserAllHosts
補完入力支援の整備
デフォルトでも十分便利なので、ここのセクションは任意要素強めで読んでください。
PSReadLine
PSReadLine は PowerShell に標準で同梱されているコマンドライン編集が快適になるツールです。
PowerShell のバージョンに合わせてその都度最新版に更新されるようなので、別途更新する必要はありません。
特に設定していなくても使えますが、EditMode として Windows(default), Emacs, Vi の 3 宗派から選べます。
ここの選択は完全に個人の自由ですが、bash, zsh は標準で Emacs モードになっているので、
そちらに合わせたいという方は Emacs に設定変更するコマンドを profile.ps1 に書いておくといいと思います。
# EditMode は Windows(default), Emacs, Vi から選択可能
Set-PSReadLineOption -EditMode Emacs
キーの割り当ては Get-PSReadLineKeyHandler
で確認できます。
カスタマイズも自由にできますが、この記事では特に触れないでおきます。
carapace
carapace は、git や npm など、サブコマンドやオプション入力時に補完してくれる機能を様々なシェルで利用できるツールです。
まだ、そこまで知名度はない気がしますが、便利なので紹介します。
winget install rsteube.Carapace
Update-PathVariable
@'
$env:CARAPACE_BRIDGES = "zsh,fish,bash,inshellisense" # optional
Set-PSReadLineOption -Colors @{ "Selection" = "`e[7m" }
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
carapace _carapace | Out-String | Invoke-Expression
'@ >> $PROFILE.CurrentUserAllHosts
. $PROFILE.CurrentUserAllHosts
carapace がデフォルトで補完をサポートしているコマンドはこちらから確認いただけます。
ls
や cat
もサポートされていて、一瞬 PowerShell の ls(=Get-ChildItem のエイリアス)
や cat(Get-Content のエイリアス)
と競合するのではと思ってしまいますが、
そこは PowerShell の方のコマンドレットの補完が勝つようです。
ただし、--
まで入力した場合は carapace の補完が候補に出てきます。
改良版 cd | zoxide
過去に訪問したディレクトリへ効率よく移動できる cd
の代替ツールです。
以前までは、zLocation という PowerShell 製のツールを使っていたのですが、
謎にフリーズするときがあって、 zoxide に移行しました。
こちらに慣れておけば、 WSL でも同じように使えるので気に入ってます。
内部で fzf というターミナルでインクリメンタルな検索ができるツールを利用しているので、
そちらも合わせてインストールしておきます。
winget install ajeetdsouza.zoxide
winget install junegunn.fzf
Update-PathVariable
'Invoke-Expression (& { (zoxide init powershell | Out-String) })' >> $PROFILE.CurrentUserAllHosts
. $PROFILE.CurrentUserAllHosts
詳細な説明は省きますが、確認方法に記載しているコマンドで雰囲気を理解してもらえれば。
確認方法
z ~
@(
"zoxide_play_ground\sample\sub",
"zoxide_play_ground\special\sub"
) |
% { New-Item -ItemType Directory -Path $_ -Force }
z zoxide_play_ground
z .\sample\sub\
z ..\..\special\sub\
z ..\..\sample\sub\
z ..\..
z sub
pwd
#=>訪問回数が多い場所が優先されるため sample\sub に移動する。
#=>Path
#=>----
#=>C:\Users\username\zoxide_play_ground\sample\sub
z sp sub
pwd
#=>sp が special に一致するため special\sub に移動する。
#=>Path
#=>----
#=>C:\Users\ueokaj\zoxide_play_ground\special\sub
Windows 版 sudo | gsudo
Unix/Linux の sudo と同様に PowerShell でも sudo ができます。
これのおかげで、管理者権限で実行したいときに、いちいちターミナルを「管理者として実行」で起動しなくてもよくなりました。
ちなみに、Microsoft も Sudo for Windows を公開しているのですが、
機能面で gsudo の方が充実しているので、ここでは gsudo をインストールします。
winget install gerardog.gsudo
Update-PathVariable
確認方法
netstat -ab
#=> 要求された操作には管理者特権が必要です。
gsudo netstat -ab
#=> アクティブな接続
#=>
#=> プロトコル ローカル アドレス 外部アドレス 状態
#=> ...
コーディング環境を整える
ここからは PowerShell でコーディングする人向けの内容になります。
コーディング環境自体は Windows では標準で Windows PowerShell ISE がありますが、
こちらは開発停止されていて PowerShell 5.1 までしかサポートされていない状況です。
そのため、 PowerShell 7.x では Visual Studio Code + PowerShell 拡張機能でコーディングすることになります。
PowerShell の拡張機能をインストール
Microsoft が公式に提供している拡張機能を使います。
Visual Studio Code にて Ctrl+P して Quick Open を開き、
ext install @id:ms-vscode.powershell
で Enter すると出てくるので、そのまま Install してください。
PowerShell 拡張機能用の PowerShell を 7 に変更
「既に 7 に切り替えたよね?」と思ってしまうところですが、
これまで実施したのは、Visual Studio Code のデフォルトのターミナルシェルを PowerShell 7 に切り替えた作業でした。
PowerShell 拡張機能では、ps1 ファイルをデバッグするときなどに利用する PowerShell の設定を完全に別で持っているため、そちらも PowerShell 7 に切り替える必要があります。
切り替え方法は以下の通りです。
- Setting ID:
powershell.powerShellAdditionalExePaths
- Item に
PowerShell7
、Value にC:\Program Files\PowerShell\7\pwsh.exe
と入力します。 - Setting ID:
powershell.powerShellDefaultVersion
- Item にて指定した
PowerShell7
を入力します。
また、デフォルトでは PowerShell 起動時にバナーが出てしまうので、そちらを無効化しておきます。
- Setting ID:
powershell.integratedConsole.suppressStartupBanner
PowerShell Extension v2024.2.2
Copyright (c) Microsoft Corporation.
https://aka.ms/vscode-powershell
Type 'help' to get help.
確認方法
適当な場所に ps1 ファイルを作成し、 以下のコードを書いて 3 行目にブレークポイントを張ります。
F5 でデバッグ実行をスタートして、正常に動作すれば OK です。
$x = $null
$x ??= 100 # null 合体代入演算子は PowerShell 7 で導入されました。
$x
補足: テスティングフレームワーク | Pester
PowerShell のテスティングフレームワークとして使われている Pester ですが、
Windows PowerShell 5.x には古いバージョンが同梱されている一方で、
PowerShell 7.x には同梱されていません。
そのため、使用する場合は別途インストールを行っていただく必要があります。
以下の記事で触れているので、よければご参照ください。
補足: 静的解析ツール | PSScriptAnylyzer
PowerShell 拡張機能では、静的解析ツールとして PSScriptAnylyzer がバンドルされています。
デフォルトで有効になっており、常に最新版が入るようになっているので、 Pester とは違って別途更新作業をする必要はありません。
以下に入門記事を書いているので、興味があればどうぞ。
補足: PowerShell Module のテンプレート
PowerShell の Module を作成しようとする際にいい感じのテンプレートが公式に見当たらないので、
以前作った以下のコードを GitHub のテンプレートリポジトリにしました。
よければお使いください。
おわりに
PowerShell 7 が Windows に標準搭載されるのを切に願う。