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 '^S' peco-srcこんなのを
.zshrc
に書いたが、Ctrl-S で起動しないし、直接 peco-src
とやってディレクトリを選択するとエラーになる。peco-src:zle:4: widgets can only be called when ZLE is active peco-src:zle:6: widgets can only be called when ZLE is activeあれこれいじったり調べていると、どうも自分の zsh の環境が少しおかしいことに気づく。
% echo $module_path明らかにおかしい。どうやら、実行しているシェルは Mac に元から入っていた zsh のようだ。/usr/lib/zsh/5.0.2/zsh% zsh --versionzsh 5.0.5 (x86_64-apple-darwin13.0.0)
おそらく、購入時に環境設定した時には
chsh -s /bin/zsh
したんだろう。さっそく、homebrew の zsh に切り替える。
% sudo sh -c "echo /usr/local/bin/zsh" >> /etc/shells % chsh -s /usr/local/bin/zshしかし、下記のエラーが出た。
/Users/pinzolo/.zshenv:1: command not found: rbenv /Users/pinzolo/.zshenv:2: command not found: pyenv compinit:183: module `zsh/parameter' has no such feature: `p:dis_patchars': autoload cancelled compinit:183: module `zsh/parameter' has no such feature: `p:patchars': autoload cancelledrbenv と pyenv のエラーは
.zshenv
の先頭に export PATH="/usr/local/bin:$PATH"
を追加したら消えた。compinit のエラーは zsh を再インストールしたら消えた。
% brew uninstall zsh % brew install zsh --enable-etcdirしかし、それでも
peco-src
は動かない。/usr/local/Cellar/zsh/5.0.5/lib
に zle.so
はあるし、.zshrc
内では zle
は動いていると思われる。実行時にエラーが出るんだが、どうしてなんだろうか?
調べても同様の状況の人が出てこない。どうしたものか
こんにちは。エラーの原因はたぶんこうだと思います。
返信削除1. Ctrl-Sで起動できない
Ctrl-Sを押しても何にも反応がないのなら、たぶんflow_controlが有効になっているんだと思います。
.zshrcにsetopt no_flow_controlと書けば解決します。
flow_controlというのはCtrl-Sでターミナル表示を停止して、Ctrl-Qでそれを元に戻して、というやつです。
今どきは特に役に立たないので無効にしておいて問題ないです。
2. 直接 peco-src とやってディレクトリを選択するとエラーになる
元のスクリプトで BUFFER= ... とBUFFER変数に代入しているところがあります。
BUFFERは現在のコマンドライン全体を読み書きするための変数です。
zsh の仕様として、直接起動した関数の中では BUFFER は上書きできないようになっているのでそんなエラーが出ている状態です。
bindkey したキーバインドを経由して呼び出すとエラーになりません。
というわけで、結論としては .zshrc に setopt no_flow_controlと書いて Ctrl-S を押せば良いと思います。
Uooooooo!!
削除仰る通りにしたら、解決しました。
flow control ということは stty -ixon でもいける?と思って試したらコレでも大丈夫でした。
setopt no_flow_control のほうがわかりやすいので、そちらを利用したいと思います。
ありがとうございました。