Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

参考

troter
I'm a horse racing fan, a programmer, a mercurial evangelist in Japan. Live in #mercurialjp #TokyoMercurial .
http://troter.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした