percol で選択したアイテムを引数につかってコマンドを実行する (プレビューしたい

percol で候補を選択するときにプレビュー的なことをしたいので、環境変数を設定しておくことで、そのコマンドを実行できるようにしてみました。

例えば、以下のようにすると候補を選択(移動?)するたびに通知が飛びます。 (%s のところに選択された候補が入ります)

$ seq 1 100 | PERCOL_HOOK_ON_SELECT='notify-send -u low %s' percol

rc.py

↓を書いておきます。

def hack_hook_on_select():
    import os
    hook_on_select = os.environ.get('PERCOL_HOOK_ON_SELECT')
    if hook_on_select is None:
        return

    from percol.model import SelectorModel
    o = SelectorModel.select_index
    def wrapped(self, idx):
        result = self.results[idx]
        if result is not None:
            try:
                seleted_text = result[0]
                import subprocess
                # import shlex
                # quoted_text = shlex.quote(seleted_text)
                # cmd = hook_on_select.replace('%s', quoted_text)
                cmd = hook_on_select.replace('%s', seleted_text)
                subprocess.check_output(['bash', '-c', cmd], stderr=subprocess.STDOUT)
            except Exception as e:
                pass
        return o(self, idx)
    SelectorModel.select_index = wrapped

hack_hook_on_select()

… Python2 でエスケープしたいときどうするんだろ。 ライブラリか自前になっちゃう?

こんなハックじゃなくても出来たりして。

github.com