CUI
操作を便利にするコマンドは色々と有名なものがありますが、そのなかの一つとしてfzf
コマンドがあります。
fzf
コマンドはコマンドラインであいまい検索を提供するコマンドで。
入力履歴選択だったり、入力補完選択だったりをフィルタしたりします。
本記事ではPowerShell
からfzf
コマンドを利用しやすくラップしたPSFzf
モジュールについて説明します。
またPSFzf
はPSReadLine
とZLocation
モジュールと連携することができるので、ここらへんについても少しだけ。
-
PSReadLine
はPowerShellコンソール上で入力補完だったり、色付けだったりの機能を提供するモジュール。 -
ZLocation
モジュールはJump-Location
モジュールの後継で、ディレクトリ移動をサポートするモジュールになります。
Webサイト
インストール
PSFzf
のPrerequisitesを読むと、fzf
を事前にインストールが必要と記載があるので、fzf
コマンドをインストールします。
fzfコマンドのインストール
PowerShellのパッケージマネージャであるChocolatey
もしくは、Scoop
でfzf
コマンドをインストールできるようです。(2021年12月現在はwingetはない模様)
どちらも利用していない場合はダウロードページページからバイナリをダウンロードして環境変数PATHを通して下さい。
PSFzfとZLocationモジュールのインストール
PSFzf
およびZLocation
についてはどちらもPowerShell Galleryで公開されているため下記のコマンドレットでインストールできます。
Install-Module -Name PSFzf -scope currentUser
Install-Module -Name ZLocation -scope currentUser
インストール後にモジュールを読み込んで、Aliasを有効にするために下記のコマンドを実行します。
# PSFzfの読み込みとAlias有効化
Import-Module PSFzf
Enable-PsFzfAliases
# ZLocationの読み込み
Import-Module ZLocation
ただし、これだけでは実行したプロセスでモジュールが読み込まれるだけなので、起動時に毎回モジュールを読み込むようにするには、起動プロファイルに下記を追加して下さい。
(起動プロファイルの場所は自動変数$profile
で確認できます。)
Invoke-FuzzySetLocation(alias fd)
Invoke-FuzzySetLocation(aliad fd)
コマンドで、カレントディレクトリ以下のディレクトリの一覧が表示されるので、移動したいディレクトリを選択すると移動することができます。
下記のような構造を持ったc:\temp\fzf
がカレントディレクトリの際にInvoke-FuzzySetLocation
を実行してみます。
Invoke-FuzzySetLocation(alias fd)
を実行するとディレクトリの一覧が出てくるので、移動したいディレクトリを選択してENTERを入力すると選択したディレクトリに移動できます。
なお、一覧が表示されている画面で検索値を入力すると、一覧がフィルタされます。下記画像はfoobar
でフィルタした場合。
Invoke-FuzzyEdit(alias fe)
環境変数EDITOR
に設定されたエディタで、ファイルを開きます。
$env:EDITOR='notepad'
と設定するとnotepadで開きます。
上記画像のように、コマンドを実行すると一覧が出力されるので、editしたいファイルを選択してENTERを実行すると指定されたEDITORでファイルが開きます。 画像の例ではc:\temp\fzf\hello world\helloworld.txt
を開きます。
Invoke-FuzzyZLocation(alias fz)
コマンドを実行すると、ZLocation
の入力履歴一覧を表示して入力履歴からディレクトリを移動することができます。
ZLocation
はcd
したディレクトリを記憶しており、ディレクトリに移動した回数で重み付けをして、よく移動するディレクトリを選択しやすくします。
ZLocationについて
ZLocation
モジュールのInvoke-ZLocation
コマンドレットを実行すると一覧が表示されます。
aliasとしてz
が登録されている。
z
コマンドを実行すると Weight
と Path
が表示されます。
たとえばこの状態でz fz
と実行すると、部分一致してWeightが一番大きいc:\temp\fzf
に移動します。
Invoke-FuzzyHistory(alias fh)
PSReadline
で提供されている実行履歴をfzf
でフィルタできます
^cd c:\temp\fzf
でフィルタした場合。
なおPSReadline
の機能としても、CTRL-R
を入力して下記画像のように過去実行したコマンド検索を提供しています。
PSReadLine
でも実行履歴検索もを提供していますが、CTRL-R
をfzf
を利用したフィルタに変更する事もできます。
下記を実行すればCTRL-R
の動作をfzf
を利用した実行履歴検索に上書きする事ができます。
# replace 'Ctrl+t' and 'Ctrl+r' with your preferred bindings:
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'
永続的にCTRL-R
の動作を上書きした倍は、起動プロファイルに追加して下さい。
Tab Expansion
PSFzf
では一部コマンドのタブ補完を置き換えることができます。
下記でタブ拡張を有効化すると。
Set-PSReadLineKeyHandler -Key Tab -ScriptBlock { Invoke-FzfTabCompletion }
- git
- Get-Service,Start-Service,Stop-Service
- Get-Process,Start-Process
のタブ補完を置き換えます。
下記画像はGet-Service
の入力補完をPSFzf
に切り替えた場合。
get-serviceスペースと入力した後にtabキーを押して、^sshでフィルタした場合。
総評
Invoke-FuzzySetLocation(alias fd)
とInvoke-FuzzyZLocation(alias fz)
が便利そうと感じたため、本ツールを導入してみました。
色々と使い方があるモジュールとなっていますが、一つでも便利そうと感じたら一度使ってみるのもありかもしれません。