zshファジィパターン一致で入力された文字が削除されます。

zshファジィパターン一致で入力された文字が削除されます。

私はzshrcで次を使用しています。

zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'

(これはおかげです。マロン)

ところで、奇妙な行動を見つけました。たとえば、次のテストケースを見てみましょう。


% tree zsh-test 
zsh-test
├── a-xx
├── b-xx
└── somefile

次に、可能性につながると予想される項目を入力してls zsh-test/xxクリックします。代わりに何もリストされていません。Taba-xxb-xxそしてxx私が入力した部分は削除済み

私の考えに何が起こっているのか、xx2つのオプションが生成され、次にzshが共通のプレフィックスを探していますが、1つが見つからず、私のテキストを何も置き換えません。これはあまり役に立ちません。私は持っていますRTMしかし、これは直感的なファジィマッチパターンを見つける目的を達成するのに役立ちません。

私のパターンを削除せずにパターンに一致する候補を表示する方法はありますか?

この動作の奇妙なことは、慣れていないことです。なぜなら、ディレクトリ内にあり、zsh-test何かを入力するとls xx Tab期待どおりに動作するからです。両方の候補が表示されます!

ベストアンサー1

これは、Zshがzsh-test/最初のケースでは明示的なプレフィックスとして扱われますが、2番目のケースでは明示的なプレフィックスがないために発生します。 (はい、Tab明示的な接尾辞がありますが、残念ながらZshはこれを行いません)。

シェルに次のように入力してこれをテストできます。

autoload -Uz compinit && compinit
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
bindkey '^I' complete-word
zle -C complete-word complete-word complete-word

complete-word() {
  _main_complete;
  compadd -x "unambiguous prefix: '${compstate[unambiguous]}'";
  compstate[list]='list force';
}

次に、2つのケースをもう一度やり直してください。最初のケースでは、が表示されますunambiguous prefix: 'zsh-test/'。 2番目のケースでは、これが表示されます。unambiguous prefix: ''

残念ながら方法はありません構成必要な動作を得るには、Zshを使用します。しかし、ウサギの穴をより深く掘り下げたい場合は、.zshrcファイルに次のスクリプトを追加することで目的の動作を得ることができます。

zmodload -i zsh/complist
autoload -Uz compinit && compinit
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
bindkey '^I' complete-word
zle -C complete-word menu-select complete-word

complete-word() {
  _main_complete;
  compstate[list]='list';
  local word=$PREFIX$SUFFIX
  (( compstate[unambiguous_cursor] <= ${#word} )) && compstate[insert]='menu';
}
  • compstate[list]='list'一致する項目が複数ある場合は、完了項目が自動的にリストされていることを確認してください。
  • 最後の行では、デフォルトの動作がカーソルの下にある現在の単語の一部を削除するかどうかを確認し、その場合はリストの最初の項目を挿入します。
  • 次に(でmenu-select提供zsh/complist)をzle -C complete-word menu-select complete-word使用すると、選択した項目を使用するTabか、arrow keysリストから別の項目を選択できます。

このようにZshの完成システムを適用することはかなり複雑になる可能性があり、その多くはよく文書化されていません。私の記事を必ず確認してください。zsh-autocomplete入れる、これはほとんどの人がすぐに実行することを期待するタスクを実行するようにZsh完成システムをカスタマイズします。

おすすめ記事