先日、今さらだが zsh を使ってみた で書いたように今更ながら zsh を使いだして、意外と tcsh から簡単に移行できたな、、、と思っていたのですが、その後すぐにコマンドの補完機能が期待通りではないことに気づきました(/_\*)
具体的には、、、tcsh を使っていた時は下記の設定をすると、^P
や ^N
でコマンド履歴から条件に合致するコマンドを補完してくれます。
bindkey "^P" history-search-backward
bindkey "^N" history-search-forward
この時の挙動を詳しく書くと下記のようになります。(例えば ^P
の場合)
- 途中まで入力した文字列と一致している履歴で1つ前のコマンドを補完(例えば、
git cl + ^P
であれば、直近の履歴にgit push
やgit commit
があってもgit clone
が表示されるといった感じ) - 補完後のカーソルの位置が文末に移動する
zsh の場合、上記と同じ設定でコマンド履歴から補完はされるのですが、下記のような挙動となっていました。
- 途中まで入力したコマンドと一致している履歴で補完してくれるのだが、最初のコマンド名の部分のマッチングしかしてくれない。(例えば、
git cl + ^P
であれば、ls
やcd xxx
みたいなものは候補から除外してくれるが、git push
やgit 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行で設定させて欲しいものだし、実際調べたりして無駄な時間を費やしてしまったので改善してほしいところですが、そうもいかないのかな??
上記設定でとりあえず満足していますが、ちまたでは zsh-autosuggestions
というプラグインがよく使われているみたいですね。
おそらく、zsh-autosuggestions
の方が優れているのだと思うけども、具体的に zsh-autosuggestions
の方が優れている点ってどういうところなのだろう??
コメント