Zsh
Peco

[peco]peco-select-history.zsh で表示されるコマンド履歴の重複を削除する

More than 3 years have passed since last update.

peco を導入した | DevAchieve でコマンドラインの行選択ツール peco を導入しました。

以下の peco-select-history.zsh を設定したのですが、

使っているうちに同じコマンドが peco の選択候補を埋めるようになりました。


peco-select-history.zsh


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 | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    # zle clear-screen
}
zle -N peco-select-history


~/.zshrc


# 履歴からコマンド選択
bindkey '^r' peco-select-history

まれに使うコマンドを peco で選択したい場合に

何度も使ったコマンドをカーソルキーで使いたいコマンドまで移動するのが面倒になり

peco の簡単にカーソルキーで行選択できる利点がなくなってしまっていました。

履歴が重複するのが問題なので zsh の hist_ignore_all_dups オプションで

コマンド履歴の重複自体を削除するようにすれば…と思いましたが、

hisotry 自体の動作を変えるとコマンド履歴を確認したいときに実際のコマンドが確認できず困りそうです。


peco-select-history.zsh で表示されるコマンド履歴の重複を削除する

ということで副作用がないように表示の際にコマンドの重複を削除します。


peco-select-history.zsh


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 | awk '!a[$0]++' | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    # zle clear-screen
}
zle -N peco-select-history

Uniq history · ddf8594 · wada811/dotfiles

awk '!a[$0]++' で重複を削除しています。

これで peco の候補が重複せず、まれに使用するコマンドのすぐに選択できるようになりました。


参考

Linux - ソートしないで重複行を削除する - Qiita