目的
zshでディレクトリ間を移動する際、cdで長いパスを毎回タイプしたり、cd -やpushdスタックの順番を覚えておくのが面倒だった。過去訪れたディレクトリに移動できるzoxideというツールもあるが、移動先はもうちょっとコントロールしたい。fzfでよく使うディレクトリをファジー検索してジャンプできるfzf-marksを導入し、かなり体験が良くなったので、紹介がてらその手順と設定上の注意点をまとめる。
fzf-marksとは
fzf-marksは、任意のディレクトリを「ブックマーク」として登録しておき、fzfのインクリメンタル検索でマーク一覧から選んでそのディレクトリへ一発でジャンプできるzshプラグイン。
主なコマンド・キーバインドは以下(デフォルト)。
| 操作 | キー / コマンド |
|---|---|
| カレントディレクトリをマークに追加 | mark <マーク名> |
| マーク一覧を表示してジャンプ | Ctrl-g |
| 検索結果へ移動 | Ctrl-y |
| 削除対象のマークを選択 | Ctrl-t |
| 選択したマークを削除 | Ctrl-d |
マークは~/.fzf-marksに保存される(FZF_MARKS_FILEで変更可能)。なおCtrl-g以外の操作はfzfのポップアップ表示中のみ有効なキー操作であり、選択したマークへのジャンプはEnterキーでも行える。
環境
- macOS(Darwin 27.0.0)
- zsh + antidote(プラグインマネージャ)
導入
僕の.zshrcはantidoteでプラグインを管理していて、zsh_plugins.txtに1行追加するだけで導入できた。
zsh-users/zsh-completions kind:fpath path:src
zsh-users/zsh-history-substring-search
olets/zsh-abbr
zsh-users/zsh-syntax-highlighting
+urbainvaes/fzf-marks
antidoteが起動時にこのファイルを読んで自動的にインストール・ロードしてくれるので、追加の手順は不要。シェルを再起動してmarkコマンドが使えることを確認する。
$ cd ~/ghq/github.com/foo/bar
$ mark bar
$ cd ~
# ここで Ctrl-g を押すとマーク一覧が表示され、bar へジャンプできる
Ctrl-gの標準キーバインドとの衝突
fzf-marksのデフォルトのジャンプキーはCtrl-gだが、zshの標準(Emacsキーバインド)ではCtrl-gはsend-break、つまりEmacsで言うところのkeyboard-quit(入力中のコマンドラインの取り消し)に割り当てられている。Emacsキーバインド(bindkey -e)を使用している場合、Ctrl-gは「取り消し」という操作に強く結びついているため、fzf-marksによってジャンプ用に上書きされると既存の操作感と衝突する。
fzf-marksは内部でbindkeyを使ってキーを上書きするため、導入時は既存のキーバインドとバッティングしていないか事前に確認しておくとよい。bindkeyで現在の割り当てを確認できる。
$ bindkey | grep '\^G'
"^G" send-break
対処:ジャンプキーをCtrl-jに変更する
FZF_MARKS_JUMPという環境変数でジャンプキーを変更できるので、antidoteの読み込みより前(.zshrcの先頭付近)で設定した。空いていて指も届きやすいCtrl-j(accept-lineと重複するが、改行を打つ場面が少ないコマンドライン用途では実害がない)を割り当てている。Jumpという意味もあり覚えやすい。
# fzf-marks: C-gはzsh標準でsend-break(Emacsのkeyboard-quitに相当)に
# 割り当てられているため、accept-lineと重複するC-jに変更する
export FZF_MARKS_JUMP='^J'
設定後にシェルを再起動し、Ctrl-gが元のsend-breakのまま動くこと、Ctrl-jでマーク一覧(ウィジェット名はfzm)が開くことを確認する。
$ bindkey | grep -E '\^G|\^J'
"^G" send-break
"^J" fzm
Ctrl-gが変更前と変わらずsend-breakのままで、Ctrl-jにfzf-marksのウィジェットfzmが割り当てられていることがわかる。
まとめ
- antidoteを使っていれば
zsh_plugins.txtに1行追加するだけで導入できる - デフォルトの
Ctrl-gはzshのsend-breakと衝突するため、環境によってはFZF_MARKS_JUMPでキーを変更したほうがよい -
markでよく使うディレクトリを登録しておけば、ワークディレクトリ間の移動が体感でかなり速くなった