zshでのコマンド補完設定

先日、今さらだが zsh を使ってみた で書いたように今更ながら zsh を使いだして、意外と tcsh から簡単に移行できたな、、、と思っていたのですが、その後すぐにコマンドの補完機能が期待通りではないことに気づきました(/_\*)

具体的には、、、tcsh を使っていた時は下記の設定をすると、^p^n でコマンド履歴から条件に合致するコマンドを補完してくれます。

bindkey "^P"    history-search-backward
bindkey "^N"    history-search-forward

この時の挙動を詳しく書くと下記のようになります。(例えば ^p の場合)

  • 途中まで入力した文字列と一致している履歴で1つ前のコマンドを補完(例えば、git cl + ^p であれば、直近の履歴に git pushgit commit があっても git clone が表示されるといった感じ)
  • 補完後のカーソルの位置が文末に移動する

zsh の場合、上記と同じ設定でコマンド履歴から補完はされるのですが、下記のような挙動となっていました。

  • 途中まで入力したコマンドと一致している履歴で補完してくれるのだが、最初のコマンド名の部分のマッチングしかしてくれない。(例えば、git cl + ^p であれば、lscd xxx みたいなものは候補から除外してくれるが、git pushgit commit のように “git” が一致しているものは候補に含まれてしまう
  • 補完後のカーソルの位置は文頭に移動する

はっきり言って、この補完の動きは使いにくいです。
仕方がないので少しこのまま使っていたのですが、zsh つかえねええええええええええと思いました。
が、あまりに使いにくいので調べてみたら、普通に解消できるのですね。
結論から書くと下記で tcsh の時と同等の動きとなりました。

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P"    history-beginning-search-backward-end
bindkey "^N"    history-beginning-search-forward-end

いや〜面倒くさいですね〜
なんで、tcsh より退化しちゃってるんですかね。
まあ、そもそも系統が違うので互換性の問題なんですかね?
普通に上位互換ということで tcsh と同じようにスッキリ1行で設定させて欲しいものだし、実際調べたりして無駄な時間を費やしてしまったので改善してほしいところですが、そうもいかないのかな??

コメント

タイトルとURLをコピーしました