はじめに
zsh の Ctrl-r はデフォルトでは
history-incremental-search-backward に割り当てられています。
履歴が少ないうちは問題ありませんが、長期間使っていると検索効率が悪くなり、地味にストレスが溜まります。
本記事では、prezto を利用している zsh 環境において、Ctrl-r を fzf ベースのインタラクティブな履歴検索に置き換える方法をメモしておきます。
前提環境
- zsh
- prezto
- fzf
- macOS / Linux
※ prezto の初期化後にキーバインドを上書きする点が重要です。
1. 現在の Ctrl-r の割り当て確認
まず、Ctrl-r がすでに設定されていないかを確認します。
bindkey '^R'
よくある出力例
"^R" history-incremental-search-backward
この場合、fzf は使われていません。
prezto を使っていても、この状態はごく一般的です。
2. fzf がインストールされているか確認
command -v fzf
- パスが表示される → インストール済み
- 何も出ない → 未インストール
インストール方法(参考)
macOS(Homebrew)
brew install fzf
Ubuntu / Debian
sudo apt update
sudo apt install fzf
3. なぜ ~/.zshrc の「末尾」に書くのか
prezto は起動時に、多くの設定やキーバインドを初期化します。
そのため、
.zpreztorc- prezto のモジュール設定
より 後に評価される場所に設定を書かないと、Ctrl-r が prezto 側に上書きされる可能性があります。
この理由から、~/.zshrc の末尾に明示的に bind するのが安全です。
4. Ctrl-r を fzf 履歴検索に置き換える設定
~/.zshrc の末尾に、以下を追加してください。
# ------------------------------------------------------------
# Ctrl-r: fzf based history search (for prezto)
# ------------------------------------------------------------
# ・fzf が存在する場合のみ有効化します
# ・prezto 初期化後にキーバインドを上書きします
# ・最小構成で挙動が追いやすい実装です
# ------------------------------------------------------------
if command -v fzf >/dev/null 2>&1; then
fzf-history-widget() {
local selected
# fc -rl 1
# - 履歴を新しい順(reverse)に取得します
# - 行頭に履歴番号が付きます
selected=$(fc -rl 1 \
| sed 's/^[[:space:]]*[0-9]\+[[:space:]]*//' \
| fzf --tac +s) || return
# 履歴番号を削除します
# fzf でインタラクティブに検索します
# --tac : 表示を逆順(最近の履歴を下側に)
# +s : 入力順ソートを維持します
# 選択したコマンドをカーソル位置に挿入します
LBUFFER+="$selected"
}
# zle widget として登録します
zle -N fzf-history-widget
# Ctrl-r に割り当てます
bindkey '^R' fzf-history-widget
fi
5. 設定の反映と動作確認
設定を反映します。
source ~/.zshrc
bindkey '^R'
動作確認については、
"^R" fzf-history-widget
と表示されていれば設定は有効です。
Ctrl-r を押して fzf の一覧が表示されれば完了です。
6. 実装上のポイント
-
fcは zsh 標準の履歴コマンドです -
sedで履歴番号を削除しないと、そのまま貼り付けられてしまいます -
LBUFFERを使うことで、カーソル位置に自然に挿入できます - prezto 環境では、
bindkeyが後から上書きされやすい点に注意が必要です
トラブルシューティング用コマンド
うまく動かない場合は、次を確認してください。
bindkey '^R'
zle -l | grep fzf
command -v fzf
echo $ZSH_VERSION
まとめ
- Ctrl-r は使用頻度が非常に高い操作です
- fzf 化は費用対効果が非常に高い改善です
- prezto 環境では「zshrc の末尾」に設定することが重要です
- 最小構成でも十分に快適になります
一度設定すれば、毎日効く生産性改善です。
prezto を使っている方は、まず最初に導入する設定としておすすめです。