Zsh

zshのメニュー補完で候補をインタラクティブに絞り込む

More than 3 years have passed since last update.

zshで補完をmenu-completeにすると補完候補が多い場合に候補選択が面倒ですが、設定次第で候補をインタラクティブに絞り込めるようになります。

※ 使用したのはzsh 5.0.2


メニュー補完絞り込み設定例


.zshrc

autoload -Uz compinit && compinit -u

zstyle ':completion:*' menu select interactive
setopt menu_complete

zshrcなどに上記の設定を追加すると、補完開始と同時に絞り込み機能が有効になり、以下のようにFunctions/Zle/というパスをF/Zl/というキー入力で絞り込むことが出来るようになります。

menuselect-interactive.png

setopt menu_completeを設定しない場合は補完開始直後に絞り込みが開始されず、再度補完開始のキーを叩いた時に絞り込みが開始になります。


メニュー補完のキーバインドを設定して使い易くする

絞り込み機能を有効にすると、設定次第ではメニュー補完での候補移動が出来なくなってしまう場合があります。

自分の場合は^f,^b,^n,^pで候補を移動してキー入力で絞り込みを行う事を両立させたかったので、以下のような設定にしてあります。


.zshrc

zmodload zsh/complist                                         # "bindkey -M menuselect"設定できるようにするためのモジュールロード

bindkey -v '^a' beginning-of-line # 行頭へ(menuselectでは補完候補の先頭へ)
bindkey -v '^b' backward-char # 1文字左へ(menuselectでは補完候補1つ左へ)
bindkey -v '^e' end-of-line # 行末へ(menuselectでは補完候補の最後尾へ)
bindkey -v '^f' forward-char # 1文字右へ(menuselectでは補完候補1つ右へ)
bindkey -v '^h' backward-delete-char # 1文字削除(menuselectでは絞り込みの1文字削除)
bindkey -v '^i' expand-or-complete # 補完開始
bindkey -M menuselect '^g' .send-break # send-break2回分の効果
bindkey -M menuselect '^i' forward-char # 補完候補1つ右へ
bindkey -M menuselect '^j' .accept-line # accept-line2回分の効果
bindkey -M menuselect '^k' accept-and-infer-next-history # 次の補完メニューを表示する
bindkey -M menuselect '^n' down-line-or-history # 補完候補1つ下へ
bindkey -M menuselect '^p' up-line-or-history # 補完候補1つ上へ
bindkey -M menuselect '^r' history-incremental-search-forward # 補完候補内インクリメンタルサーチ

この中で一番重宝しているのはaccept-and-infer-next-historyです。

これを設定したキーを叩くと選択した補完候補がディレクトリの場合に候補を決定し、更にそのディレクトリ内で直ぐメニュー補完を開始してくれるのでキータイプをかなり減らすことが出来ます。

これで候補が多い場合でもメニュー補完を快適に使えるようになりました。