fzfでコマンド履歴を選択

fzfとかpeco、便利ですよね。

私のzsh設定では、Ctrl-rの履歴検索を、fzfを用いたものに変更しています。 よく書いてある設定を利用すると重複している履歴も表示されてしまうのですが、これを除きたいと思い、改良してみました。 以下でできます。

function fzf-history-widget() {
    local tac=${commands[tac]:-"tail -r"}
    BUFFER=$( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | sed 's/ *[0-9]* *//' | eval $tac | awk '!a[$0]++' | fzf +s)
    CURSOR=$#BUFFER
    zle clear-screen
}
zle     -N   fzf-history-widget
bindkey '^R' fzf-history-widget

ポイントはawk '!a[$0]++'で、これで重複を除いています。sort | uniqだとソートされてしまいますが、これなら順番を維持したまま重複を除けます。

こういうのを調べていると、シェル芸にも興味が出てきたりしますね。