改行を含む履歴を peco で絞り込み・選択する zsh widget


はじめに

peco は改行で入力を分ける為、改行が含まれた履歴を絞り込み・選択しようとすると単一の履歴であっても別々のアイテムとして扱われてしまい、意図した操作が行えない。

そこで、改行をヌル文字等で置換して一行にまとめたものを peco に入力。その後、peco の出力を入力時とは逆に置換することで打開を図る。

方法

以下を .zshrc 等の任意の設定ファイルに記載する。

peco_select_history

whence peco &>/dev/null && function {
    function peco_select_history {
        emulate -L zsh

        local delimiter=$'\0; \0' newline=$'\n'

        BUFFER=${"$(print -rl ${history//$newline/$delimiter} | peco --query "$LBUFFER")"//$delimiter/$newline}
        CURSOR=$#BUFFER
        zle -Rc
        zle reset-prompt
    }
    zle -N peco_select_history
    bindkey "^Xh" peco_select_history
}
  • キーバインドはお好みで
  • 元の履歴中に \0; \0 が存在すると → あっ…(察し)