数年前にRTMに入れたままになってましたが、ようやくpercolをインストー
ルしました。zshでhelmっぽい履歴検索をやりたかったためです。

https://github.com/mooz/percol

※ 最近の毎週木曜日は、会社の人ともくもくしています。

作者はあのKeySnail のmoozさん。2年くらい前にお会いしましたが、お元気
でしょうか。

README.mdに書いてあったHOMEにインストールする方法だと、以下のエラー
が出て使えませんでした。Python力ゼロなので分かりません。

$ ps aux | percol
Traceback (most recent call last):
  File "/Users/masutaka/.local/bin/percol", line 29, in <module>
    from percol.cli import main
ImportError: No module named percol.cli

試しにpyenvでPythonをインストールし、そこにpipでpercolをインストー
ルすることにしました。

pyenvはbrewでインストールできます。python-build的なものやpipも同時
に入るので楽ちん。

最新のPython2系とpercolはこんな感じでインストールできます。

$ pyenv install 2.7.7
$ pyenv global 2.7.7 && pyenv rehash && rehash
$ pip install percol
$ pyenv rehash && rehash

percolの設定ファイルは~/.percol.d/rc.pyです。色を自分好みに、キーバ
インドをREADME.mdに書いてあったEmacs風にしました。

percol.view.PROMPT  = ur"<on_blue>QUERY></on_blue> <on_red><on_red>%q</on_red>"

percol.view.CANDIDATES_LINE_BASIC    = ("black", "on_white")
percol.view.CANDIDATES_LINE_SELECTED = ("black", "on_green", "underline")
percol.view.CANDIDATES_LINE_MARKED   = ("black", "on_cyan")
percol.view.CANDIDATES_LINE_QUERY    = ("red", "bold")

# Emacs like
percol.import_keymap({
    "C-h" : lambda percol: percol.command.delete_backward_char(),
    "C-d" : lambda percol: percol.command.delete_forward_char(),
    "C-k" : lambda percol: percol.command.kill_end_of_line(),
    "C-y" : lambda percol: percol.command.yank(),
    "C-t" : lambda percol: percol.command.transpose_chars(),
    "C-a" : lambda percol: percol.command.beginning_of_line(),
    "C-e" : lambda percol: percol.command.end_of_line(),
    "C-b" : lambda percol: percol.command.backward_char(),
    "C-f" : lambda percol: percol.command.forward_char(),
    "M-f" : lambda percol: percol.command.forward_word(),
    "M-b" : lambda percol: percol.command.backward_word(),
    "M-d" : lambda percol: percol.command.delete_forward_word(),
    "M-h" : lambda percol: percol.command.delete_backward_word(),
    "C-n" : lambda percol: percol.command.select_next(),
    "C-p" : lambda percol: percol.command.select_previous(),
    "C-v" : lambda percol: percol.command.select_next_page(),
    "M-v" : lambda percol: percol.command.select_previous_page(),
    "M-<" : lambda percol: percol.command.select_top(),
    "M->" : lambda percol: percol.command.select_bottom(),
    "C-m" : lambda percol: percol.finish(),
    "C-j" : lambda percol: percol.finish(),
    "C-g" : lambda percol: percol.cancel(),
})

~/.zshrcもREADME.mdとほぼ同じ。最近hirocaster氏が紹介した、ghnとの
連携
も追加。でもghnはだいぶもたつく感じ。

function exists { type $1 > /dev/null }
if exists percol; then
    function percol_select_history() {
        local tac
        exists gtac && tac="gtac" || { exists tac && tac="tac" || { tac="tail -r" } }
        BUFFER=$(fc -l -n 1 | eval $tac | percol --query "$LBUFFER")
        CURSOR=$#BUFFER         # move cursor
        zle -R -c               # refresh
    }
    zle -N percol_select_history
    bindkey '^R' percol_select_history

    function ghn_open() {
        local url=$(ghn list | percol --query "$LBUFFER")
        if [ -n "$url" ]; then
            open ${url}
        fi
    }
    zle -N ghn_open
    bindkey '^xgo' ghn_open
fi

しばらく使ってみます。