人生の人生

日常のゴミ捨て場

PowerShellをいじった; PSReadLine,キーバインディング

こんにちは 人生です.
PowerShellのキーバインディング編です.

最近のPowerShellでは構文の色付けやコマンド入力の管理にPSReadLineをデフォルトで使用しているらしい.

1. PSReadLineの基本的な使い方

PSReadLineでの設定にはSet-PSReadlineOptionやSet-PSReadlineKeyHandlerなる関数を使う.
例えば,デフォルトのPowerShellだと行頭でバックスペースを連打するとビープ音が鳴ったり,コマンドの履歴が重複して保存されたりするが,それらを無効化するには以下のように設定する.

Set-PSReadlineOption -BellStyle None -HistoryNoDuplicates

例のごとく,これを$PROFILEとかに書き込めばPowerShellを起動するたびに設定が適用される.
設定可能な変数やその値などはやはり公式ドキュメントが詳しい.正直ググってもあまり出ない.
docs.microsoft.com
github.com
なお,通常はモジュールを有効化するためには

Import-Module PSReadLine

とする必要があるが,PSReadLineに関してはこの行がなくても動く.よくわからん.

例えばキーバインドを指定してあげたいときは

Set-PSReadlineKeyHandler -Chord "Ctrl+h" -Function BackwardDeleteChar

のようにする.-Chordで入力キーを,-Functionで関数 (動作) を指定できる.
これも公式ドキュメントを見るのが幸せ.
docs.microsoft.com
github.com

また,現在の設定やキーバインドを確認するためにはGet-PSReadlineOptionやGet-PSReadlineKeyHandlerを使う.
ぼーっと眺めてるといろんな設定や動作をいじれることがわかるので地味に楽しい.
f:id:sktakefumi:20181025133103p:plain

2. EditModeの変更

キーバインドをちょこちょこ変えて遊んでいたら,そういえばPSReadLineでは操作モードを変更できることを思い出す.
例えば

Set-PSReadLineOption -EditMode Vi

とすると,viのコマンドが使用可能となり,キーバインドもvi仕様にしてくれる.
自分でちょこちょこカスタマイズするよりもこちらのほうが便利.
f:id:sktakefumi:20181025133219p:plain
viでお馴染みの (vimしか使ったことないので嘘) コマンド群が使えるようになる.<>で囲まれたコマンドはノーマルモード時に,無印のコマンドは挿入モード時に有効なようだ.
viモードをちょっと使いやすくするために以下の設定とキーバインドをした.

Set-PSReadLineOption -EditMode vi -ViModeIndicator Cursor
Set-PSReadlineKeyHandler -ViMode Insert -Chord  "Ctrl+h" -Function BackwardDeleteChar
Set-PSReadlineKeyHandler -ViMode Insert -Chord  "Ctrl+[" -Function ViCommandMode
Set-PSReadlineKeyHandler -ViMode Command -Chord  "Ctrl+[" -Function RevertLine

-ViModeIndicator Cursorにより,現在のモードが視認できるようになる.

f:id:sktakefumi:20181025134052p:plainf:id:sktakefumi:20181025134138p:plain
挿入モード時 (左,カーソルが下線になる) と,ノーマルモード時 (右,カーソルがマスクになる).
デフォルトではNoneのため,今どちらのモードなのかがわからず,不便.
このオプションの詳細はgithubのmdのほうが詳しい.
また,-ViMode Commandで,モード別の挙動が設定できる.
今回はCtrl+[に,挿入モード時にはEscを,ノーマルモード時には行削除を割り当てた.
行削除はdを2回でできるけど,なんとなく.
viモードでとてもうれしいキーバインドが,コマンド履歴をノーマルモードのj,kで行き来できること.
Windowsモードのデフォルトだと矢印キーでしかできず,いちいち手を動かすのがしんどかったので画期的に思える.
ただ,モード切替などやはり面倒な点は残るので,使い勝手はこれから判断していくことになると思う.

以上です.やはり公式ドキュメントを読めるようにならないとつらいですね.