LoginSignup
33
18

More than 5 years have passed since last update.

zleを使わないでコマンドラインに値を入力した状態にする

Posted at

tl;dr

print -z をつかう。

きっかけ

percol/pecoってすごく便利なので、絞り込みを行うshellの関数をたくさん定義したい。
けど、コマンドラインに値を設定するためにzle -Nbindkeyを使ってショートカットキーを登録することが前提になっている。

たくさんの人が参照していそうなところからサンプルをいただくとこんな感じ。

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でつないだときは選択したファイルが出力される。

参考

33
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
18