tl;dr
print -z
をつかう。
きっかけ
percol
/peco
ってすごく便利なので、絞り込みを行うshellの関数をたくさん定義したい。
けど、コマンドラインに値を設定するためにzle -N
とbindkey
を使ってショートカットキーを登録することが前提になっている。
たくさんの人が参照していそうなところからサンプルをいただくとこんな感じ。
function peco-src () {
local selected_dir=$(ghq list --full-path | peco --query "$LBUFFER")
if [ -n "$selected_dir" ]; then
BUFFER="cd ${selected_dir}"
zle accept-line
fi
zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
ショートカットキー一発で起動できるのは便利。でも、ちょっとしたソースを絞り込む関数を定義するにも、ソースの数だけショートカットキーが消費されて辛い部分もある。
print -z
をつかう
zle
は主にコマンドラインに値を設定するために利用されているので、別の方法で値を設定すればなんとかなりそう。zshの組み込みコマンドを眺めてみると、どうやらprint -z
が使えるらしい。
print -z
を使うとこんな風にできる。
function _percol_junkfile_source() {
find $HOME/Dropbox/memo/junk -type f | sort -r
}
# emacsのopen-junk-file.elで作ったファイルを閲覧する。
function junkfile() {
local selected_file=$(_percol_junkfile_source | percol --query '$*')
if [ -n "$selected_file" ]; then
if [ -t 1 ]; then
print -z "less ${selected_file}"
else
print $selected_file
fi
fi
}
この例だと、シェル関数を呼び出したときはless <file>
がコマンドラインに入るし、pipeでつないだときは選択したファイルが出力される。