bashからzshに切り替えようとしましたが、zshで大きな不快感が1つ見つかりました。設定解除menucomplete
オプション、バインディングtab
、expand-or-complete-prefix
バインディングalt-s
がありますmenu-complete
。
ただし、を押してメニューコンプリートを呼び出すと、bashのようにメニュー補完が終了し、最後に表示されたエントリでコンプリートを実行するのではなく、後続のクリックがメニューコンプリートエントリを継続的に循環alt-s
します。私がこれをしたい主な理由は、複数のネストされたディレクトリに移動したい場合、または表示された最後のディレクトリにすばやく「移動」できるからですtab
。cd
ls
私はzshバージョン5.8を使用しており、〜/.zshrcに次のものがあります。
setopt autolist
unsetopt automenu autoremoveslash listambiguous menucomplete
bindkey '^i' expand-or-complete-prefix # Bind tab
bindkey '^[s' menu-complete # Bind alt-s to menu-complete
以下は実際の例です。
$ mkdir dir dir/a dir/b dir/b/d dir/c
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/c/ <tab>
$ ls dir/a/ <tab>
$ ls dir/b/ <tab>
$ ls dir/c/
...etc.
tab
代わりにbashのように「入力」したいです。dir/b/
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/b/d/ <-- Pressing tab exits menu-complete and immediately goes into the currently displayed directory.
どうすればこのような行動をすることができるかを知っている人はいますか?あなたの助けをいただきありがとうございます!
編集する:
~/.zshrc に以下を追加して、少しmenuselect
軽減されたソリューションを見つけました。zsh/complist
zmodload -i zsh/complist
bindkey -M menuselect '^i' accept-line
zstyle ':completion:*' menu select=1
次に、作業tab
中にmenu-complete
終了をタップしますmenu-complete
。ただし、最後に表示されたディレクトリに「入力」されず、最後に表示されたディレクトリtab
でオートコンプリートを実行するには、もう一度押す必要があります。したがって、tab
bashで1回押すのではなく、zshで2回押すと同じ機能が得られます。
他のオプションがありますmenuselect
。
bindkey -M menuselect '^i' accept-and-infer-next-history
簡単に押すと、表示された最後のディレクトリに「入力」されますが、tab
必要に応じて正常に完了menu-select
せずにそのディレクトリで実行されます。tab
1回のキーストロークでこの機能を取得する方法を知っている人がいる場合はtab
感謝します。menuselect
たとえば、カスタムzleコマンドを作成できますかaccept-and-complete-next-history
?
答え1
ここで要求されたタスクを実行するようにZshの完成システムを設定するには、実際には可能ですが、かなりの数のコード行が必要です。自分で作るよりも自分のものを使う方がいいzsh-autocomplete
入れる代わりに。これは以下を提供します:
- 内容を入力すると、完了項目が自動的に一覧表示されます。
- 押す必要はありません⇥ Tab。
- 選択範囲を絞り込むには、もっと入力してください。
- これはパージオートコンプリートをサポートします。つまり、次に入力する内容が対象単語の右側にある限り、探している単語のどの部分でも入力できるという意味です。
- 上部挿入をタップして⇥ Tab完了します。
- ディレクトリの場合は、サブディレクトリが自動的に一覧表示されます。
- すすぎ、泡立てて繰り返します。
- 上部で目的の完成が得られない場合は、↓ Down(他の矢印キー付き)を使用してナビゲートできます。
- 目的の完成がまったく表示されない場合は、を押してみてください⌃ Ctrl␣ Space。これにより、追加の完了が表示されます(存在する場合)。
答え2
まあ、あなたのzsh-autocomplete
プラグインが面白いようですね。 Malone、確認してみてください。
とにかく元の問題の解決策を見つけました。基本的に私は私が欲しいものを行うシンプルなウィジェットを作成しました。 ~/.zshrcから:
zmodload -i zsh/complist
accept-and-complete-next-history() {
zle expand-or-complete-prefix
}
zle -N accept-and-complete-next-history
bindkey -M menuselect '^i' accept-and-complete-next-history
zstyle ':completion:*' menu select=1
または均等に:
zmodload -i zsh/complist
bindkey -M menuselect '^i' .expand-or-complete-prefix
zstyle ':completion:*' menu select=1