PowerShellのプロファイルをカスタマイズしてCLIの操作を快適にする

この記事では、PowerShellのプロファイルを編集してPowerShellのCLI操作を快適にする方法を紹介します。

プロファイルとは

PowerShellにおけるプロファイルとは、PowerShellを起動したときに自動で読み込まれるスクリプトのことです。

PowerShell プロファイルを作成して、環境をカスタマイズし、開始するすべての PowerShell セッションにセッション固有の要素を追加できます。 PowerShell プロファイルは、PowerShell の開始時に実行されるスクリプトです。 プロファイルをログオン スクリプトとして使用して、環境をカスタマイズできます。 コマンド、エイリアス、関数、変数、スナップイン、モジュール、PowerShell ドライブを追加できます。 また、プロファイルに他のセッション固有の要素を追加して、インポートまたは再作成することなく、すべてのセッションで使用することもできます。

about Profiles - Microsoft Docs

$PROFILEを作成

プロファイルのパスは、変数 $PROFILE に格納されています。(OSやPowerShellのバージョンによって異なります) 新規作成するには以下のコマンドレットを実行してください。 notepad $PROFILE またはお好きなエディタで編集します。

New-Item -Type File -Path $PROFILE -Force # 新規作成
notepad $PROFILE                          # 編集

編集したプロファイルを再読込するには、. $PROFILE を実行してください。

プロファイルを読み込まずにPowerShellを起動

プロファイルを読み込まずにPowerShellを起動するには -NoProfile スイッチを有効にします。

powershell -NoProfile # Windows PowerShellの場合
pwsh -NoProfile       # PowerShell Coreの場合

実行ポリシーについて

Windowsのデフォルト設定では実行ポリシーが「Restricted」になっており、PowerShellスクリプト(*.ps1, *.ps1xml, *.psm1)を実行できません。実行ポリシーを変更する必要があります。以下を実行すると、ローカルコンピューター上にあるスクリプトおよびインターネット上の電子署名済みのスクリプトを実行できるようになります。-Scope CurrentUser を指定することで、影響範囲を現在のユーザーのみに限定することができます。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

実行ポリシーについては以下のドキュメントを参照してください。

About Execution Policies - MS Docs

基本編(PSReadlineモジュールの設定)

PowerShellには PSReadline というモジュールがデフォルトでインストールされています。 Set-PSReadlineOption, Set-PSReadlineKeyHandler コマンドレットを使うことでキーバインドやシンタックスハイライトの色などをカスタマイズすることができます。詳しくは以下のドキュメントを参照してください。

About PSReadline - Microsoft Docs

予測インテリセンスを有効化

PSReadlineモジュールには、予測インテリセンス機能が装備されています。これは、fishのデフォルト機能やzshで言う zsh-autosuggestions のように、コマンドのタイプ中に履歴から予測候補を出してくれる機能です。

zsh-users/zsh-autosuggestions

この機能はデフォルトでは無効になっています。有効化するには以下を実行してください。

Set-PSReadLineOption -PredictionSource History

重複した履歴を保存しないようにする

履歴の行が重複すると、検索して再実行する際に少し不便です。重複した履歴を保存しないようにするには以下を実行します。

Set-PSReadlineOption -HistoryNoDuplicates

ベル音の無効化

PowerShellを操作しているとベル音が頻繁に鳴り煩わしいと感じるかもしれません。ベル音を無効にするには以下を実行します。

Set-PSReadlineOption -BellStyle None

キーバインドの設定

キーバインド一覧の取得

設定されているキーバインドの一覧は Get-PSReadlineKeyHandler コマンドレットで取得できます。

PS> Get-PSReadlineKeyHandler

Basic editing functions
=======================

Key              Function              Description
---              --------              -----------
Ctrl+g           Abort                 Abort the current operation, e.g. incremental history search
Enter            AcceptLine            Accept the input or move to the next line if input is missing a closing token.
Shift+Enter      AddLine               Move the cursor to the next line without attempting to execute the input
Backspace        BackwardDeleteChar    Delete the character before the cursor
...以下略...

キーバインド一覧のチートシートを作る

キーバインド一覧を ConvertTo-Html コマンドレットを使ってHTMLに変換し、チートシートを作っておくと便利です。

Get-PSReadlineKeyHandler | ConvertTo-Html | Out-File -Encoding Default ~/Documents/ps-keybindings.html

行編集のキーバインドをEmacs/Vi風に

行編集のキーバインドをEmacs/Vi風に変更するには以下を実行してください。

Set-PSReadlineOption -EditMode "Emacs" # Emacs風キーバインド
Set-PSReadlineOption -EditMode "Vi"    # Vi風キーバインド

Emacs風キーバインドにを有効にすると、カーソル移動やキルリングの他に Ctrl+R, Ctrl+s での履歴のインクリメンタルサーチが使えるようになります。bashとほぼ同様の感覚で使えるので快適です。

# 「Ctrl+R cd」とタイプしたときの例
PS /home/sheepla> cd ~/Documents
bck-i-search: cd_

個別にキーを割り当てる

キーを押下したときの動作を個別に設定するには Set-PSReadlineKeyHandler コマンドレットを使用します。例えば、Ctrl+o を押下したときに補完メニューを表示するように設定するには以下を実行します。

Set-PSReadlineKeyHandler -Key "Ctrl+o" -Function "MenuComplete"

さらに高度なキーバインド設定

Set-PSReadlineKeyHandler-ScriptBlock パラメータを指定することでさらに高度なカスタマイズが可能です。例えば、カッコや引用符を自動で閉じるようにすることができます。こちらの記事が参考になります。

【PowerShell】PsReadLine 設定のススメ - Qiita

ハイライトカラーの設定

PowerShellのコンソールではデフォルトでシンタックスハイライトが有効になっています。それぞれの色を変更するには、Set-PSReadLineOption-Colors パラメータに値を設定します。

Set-PSReadLineOption -Colors @{
    Command            = "Magenta"
    Number             = "DarkGray"
    Member             = "DarkGray"
    Operator           = "DarkGray"
    Type               = "DarkGray"
    Variable           = "DarkGreen"
    Parameter          = "DarkGreen"
    ContinuationPrompt = "DarkGray"
    Default            = "DarkGray"
}

ちなみにこの変数の値は、ConsoleColor 型のenum値・24bitカラーエスケープシーケンス・RGB値 の中から好きな形式で設定可能です。

Set-PSReadLineOption -Colors @{
     # ConsoleColor型のenum値を使う
     "Error" = [ConsoleColor]::DarkRed

     # 24 bitカラーエスケープシーケンス
     "String" = "$([char]0x1b)[38;5;100m"

     # RGB値
     "Command" = "#8181f7"
}

各プロパティをまとめて設定

以下のようにハッシュテーブルを作って各プロパティをまとめて設定することもできます。ファイルに記述する際に少し見通しが良くなると思います。

$PSReadlineOptions = @{
    BellStyle = "None"
	EditMode = "Emacs"
	HistoryNoDuplicates = $true
	HistorySearchCursorMovesToEnd = $true
	Colors = @{
		Command = "White"
	}
}
Set-PSReadlineOption @PSReadlineOptions

外部ツール編

標準機能のみを使うのも良いですが、外部のツールを導入することでPowerShellをさらに使いやすくすることができます。

scoopでツールのインストールを自動化する

Windowsにツールを導入する場合、scoopChocolatey を使ってインストールを自動化すると便利です。今回はscoopをインストールします。

メモ: scoopとchocolateyの違いについては以下の記事が参考になります。

Windows開発環境の構築をChocolateyからscoopに切り替える - tech.guitarrapc.com

インストール

scoopをインストールするには以下を実行します。

iwr -useb get.scoop.sh | iex

lukesampson/scoop/master/bin/install.ps1 - GitHub をダウンロードして実行する方法と等価です。実行する前に目を通しておくと安心かもしれません。

素早くcdする(zoxide)

zoxide を使うと、カレントディレクトリディレクトリ素早く変更することができます。 パスを記憶しておいたり毎回タイプしたりする必要がないので、ディレクトリの階層が深くなりがちなWindowsで使うと特に有効です。

ajeetdsouza/zoxide - GitHub

使い方

  • zコマンド: 基本的にはcdコマンドと同様ですが、フルパスや相対パスではなく、パスの一部だけを指定することができます。
  • ziコマンド: 移動履歴をfzfで絞り込み、選択したディレクトリに移動します。
z <フルパス>               # そのディレクトリに移動(cdと同じ)
z <相対パス>               # そのディレクトリに移動(cdと同じ)
z <一度移動したパスの一部> # 移動履歴を検索してパスの一部にマッチするディレクトリに移動
z -                        # 直前にいたディレクトリに戻る(cdと同じ)
z ..                       # 親ディレクトリに移動(cdと同じ)
zi <検索ワード>            # fzfを使って移動履歴を絞り込んで選択したディレクトリに移動

インストール

zoxideとfzfをインストールします。

scoop install zoxide fzf

プロファイルに以下を追記してください。

Invoke-Expression (& {
    $hook = if ($PSVersionTable.PSVersion.Major -lt 6) { 'prompt' } else { 'pwd' }
    (zoxide init --hook $hook powershell) -join "`n"
})

プロンプトをカスタマイズする(starship)

外部のプロンプトツールを導入することで、PowerShellのプロンプトを見やすく・かつオシャレにすることができます。PowerShellをサポートしているものは以下の2つがあります。

今回はstarshipをインストールします。

starship - cross shell prompt

starshipの導入

scoopでインストールします。

scoop install starship

セットアップ

インストールが完了したらプロファイルに以下の行を追加してください。

Invoke-Expression (&starship init powershell)

. $PROFILE でプロファイルを再読込してプロンプトが変化すればOKです。

カスタマイズ

starshipをカスタマイズするには ~/.config/starship.toml を編集します。具体的なカスタマイズ方法については公式ドキュメントを参照してください。

Starship Configuration

Starship Configuration 日本語版

sudo相当のコマンドを導入する

通常、Windows上で管理者権限でコマンドを実行する場合、管理者権限でPowerShellやコマンドプロンプトを新しく起動し、UAC(ユーザーアカウント制御)ポップアップをクリックする必要があります。しかし、毎回この作業を行うのは面倒です。

回避策として、Linuxの sudo に相当するツールを導入すると便利です。

注意: インストールと実行は自己責任で行ってください。

psutilsのsudo.ps1はPowerShellのコマンドレットをそのまま管理者権限で実行できます。今回はこれをインストールします。

インストール

scoop install sudo

使い方

sudo <PowerShellのコマンドレットなど>

fzfとの統合(PSFzfモジュール)

fzfのラッパーモジュールである PSFzf を導入することで、コマンドの履歴やパス絞り込み検索等の操作をfzfで簡単に行えるようになります。

PSFzf - PowerShell Gallery kellyma49/PSFfzf

使い方

PSFzfにはディレクトリの移動・ファイルの編集・履歴の検索・プロセスのkill等をfzfで行える便利なコマンドレットが含まれています。詳しい使い方はリポジトリのREADMEを参照してください。

README.md on kelleyma49/PSfzf - GitHub

インストール

fzfをインストールします。

scoop install fzf

PSFzfをインストールします。Get-Module -All PSFzf を実行してPSFzfモジュールの情報が表示されればOKです。

Install-Module -Scope CurrentUser PSFzf

設定

ファイルパスを絞り込み入力に Ctrl+t 、履歴の絞り込み検索に Ctrl+r を割り当てるには以下の行をプロファイルに追記してください。

Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'