by shigemk2

当面は技術的なことしか書かない

【追記あり】pecoで表示されるコマンド履歴の重複を削除する 改

どういうことかというと、こういうこと。

f:id:shigemk2:20150201165759p:plain

なんかめんどうだなあって思っていたら、Qiitaにそのまんまのがありました。

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

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

awkで重複を削除しているって感じですね。そんな感じのシェル芸を昔見たことが有ります。

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

でも、oh-my-zshを使うと、historyにエイリアスがかかっているので、バックスラッシュをつけるとよい。oh-my-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

oh-my-zsh の環境で、peco-select-history が動かない - Qiita

追記

サムネとかいろいろ直しました。