pecoを使ったzshのhistory検索をもう少し便利にする

pecoを使うと,zshのhistoryをインクリメンタルサーチできるので便利.

[Mac][zsh]コマンドのインクリメンタルサーチツールpecoを使ってzshのhistory(Ctrl+r)をpeco表示 | Coffee Breakにプログラミング備忘録


でも,そのhisotryの中には,間違ったコマンドなんかもあって,そういうのをpecoの結果から引き当ててしまうと,コマンドは失敗するし,historyに失敗したコマンドが追加されてあまり良くない.

なので,historyに溜まっているコマンド列を数えて,多い順にソートして表示してやるようにした.

以下の設定を.zshrc内に記述

function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(\history -n 1 | \
        eval $tac | \
	sort | \
	uniq -c |  \
	sort -r |  \
	sed -e 's/^[ ]*//g' | \
	cut -d " " -f 2-100 | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history

調べてみると,uniqコマンドを使うと行の数も表示しながら重複した行をまとめてくれるらしいので,それを使ってソート.
sedとcutで,表示されている行数を削除してやるという方針で書いた.