はじめに
fzf起動中の Ctrl-j 押したら 選択カーソル下移動。とかのキーバインドについてまとめる記事です
junegunn/fzf: A command-line fuzzy finder
man page
仕組み
manにある通り Key/Evnet(Ctrl-A)に対して、Action(行頭に移動)が設定されている
zshのwidgetみたい
設定可能なKeyに関しては こちら
--bind オプションでKEY:ACTION または EVNET:ACTION形式で記述することでカスタマイズが可能
複数指定の場合はカンマ区切り
fzf --bind=ctrl-j:accept,ctrl-k:kill-line
また ACTIONを + で繋げて記述することで、複数のACTIONをチェーンすることができる
Event
Key以外にも Event をバインドすることができる。利用可能なEventとして changeと backward-eofがある
change
検索文字(以下query)が変更されるたびにトリガーされる
# queryを変更するたびにtopアクションを実行
fzf --bind change:top
backward-eof
query が空のときに、後方削除を実行しようとしたときにトリガーされる
fzf --bind backward-eof:abort
Key Bindings
デフォルトで割り当てられてるKeyとActionの一覧
おなじみのemacs風キーバインドなので、慣れてる人は読み飛ばし推奨
toggle系に関しては複数選択mode(--multi)時のみ有効
基本操作
| Bind Keys | Action | 説明 |
|---|---|---|
| Enter (Double-click) | accept | 選択実行 |
| C trl-c (Ctrl-g Ctrl-q Esc) | abort | fzfを閉じる |
| Ctrl-j (Ctrl-n Down) | down | 選択カーソルを下に移動 |
| Ctrl-k(Ctrl-p Up) | up | 選択カーソルを上に移動 |
| Ctrl-i (Tab) | toggle+down | 行をマークして選択カーソルを下に移動 |
| Shift-Tab | toggle+up | 行をマークして選択カーソルを上に移動 |
移動
| Bind Keys | Action | 説明 |
|---|---|---|
| Ctrl-b(Left) | backward-char | カーソルを左に移動 |
| Ctrl-f(Right) | forward-char | カーソルを右に移動 |
| Ctrl-a(Home) | beginning-of-line | カーソルを先頭に移動 |
| Ctrl-e(End) | end-of-line | カーソルを行末に移動 |
| Alt-b(Shift-left) | backward-word | カーソルを1単語左へ |
| Alt-f(Shift-right) | forward-word | カーソルを1単語右へ移動 |
削除
| Bind Keys | Action | 説明 |
|---|---|---|
| Ctrl-h(Bspace) | backward-delete-char | カーソル前の文字を削除 |
| Ctrl-u | unix-line-discard | カーソルから行頭までを削除 |
| Ctrl-w | unix-word-rubout | カーソル前の単語を削除 |
| Ctrl-d | delete-char/eof | カーソル上の単語を削除 queryが空の場合はfzfを閉じる |
| Alt-Bspace | backward-kill-word | カーソル前の単語を削除 |
| Alt-d | kill-word | カーソル上の文字から単語末尾までを削除 |
| Del | delete-char | カーソル上の単語を削除 |
画面操作
| Bind Keys | Action | 説明 |
|---|---|---|
| Ctrl-l | clear-screen | 画面をクリアに(これ動いてんのか?) |
| PgDn | page-down | 下向きにスクロール |
| PgUp | page-up | 上向きにスクロール |
| Shift-up | preview-up | プレビュー画面を上にスクロール |
| Shift-down | preview-down | プレビュー画面を下にスクロール |
Actionの紹介
デフォで割り当てられてないAction達
色々ありますが、いくつか抜粋してみる
jump, jump-accept
toggle-all
全件選択/全件解除 のtoggle。select-allだと解除したいとき困るよ

execute(...)、 execute-silent(...)
fzfを閉じずに任意のコマンドを実行する。 {} で選択行を引用できる
execute-silenteは画面切り替えなしでコマンドを実行
fzf --bind "enter:execute(less {})"
これで、 「ctrl+vでvimで開く, ctrl+oでopen」 みたいに実行を振り分けたかったけどできない
preview, toggle-preview
--preview で指定したコマンドに加えて、別のプレビューコマンドを指定できる
# デフォルトプレビューウィンドウで ls -lの結果を表示。?でファイル内容を表示
fzf --preview 'ls -l {}' --bind '?:preview:cat {}'

※ --previewを指定しない場合は プレビューウィンドウが空で表示される
toggle-preview ではプレビューウィンドウの表示/非表示の切替を行う
こっちのほうが使い勝手がいいかも
reload
リストを動的に更新する
manで紹介されているコマンドが中々良さげだった
RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case "
INITIAL_QUERY="foobar"
FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY'" \
fzf --bind "change:reload:$RG_PREFIX {q} || true" \
--ansi --phony --query "$INITIAL_QUERY"
queryを変更したら都度 rg コマンドが実行される
検索ブラウザのできあがり。検索結果、検索文字のハイライトが動的に更新される
ひとこと
この記事では触れてないけど --preview も奥が深めです
独自に関数作ったり、組み込みwedgetをカスタマイズしたとき等 参考になれば幸いです
