1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ctrl-r を fzf 履歴検索にする

1
Posted at

はじめに

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 を使っている方は、まず最初に導入する設定としておすすめです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?