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)が便利そうと感じたため、本ツールを導入してみました。
色々と使い方があるモジュールとなっていますが、一つでも便利そうと感じたら一度使ってみるのもありかもしれません。










