私はzshrcで次を使用しています。
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
(これはおかげです。マロン)
ところで、奇妙な行動を見つけました。たとえば、次のテストケースを見てみましょう。
% tree zsh-test
zsh-test
├── a-xx
├── b-xx
└── somefile
次に、可能性につながると予想される項目を入力してls zsh-test/xx
クリックします。代わりに何もリストされていません。Taba-xx
b-xx
そしてxx
私が入力した部分は削除済み!
私の考えに何が起こっているのか、xx
2つのオプションが生成され、次に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完成システムをカスタマイズします。
答え2
メニューが完成すると、2つのzsh-test/a-xx
合計が得られますzsh-test/b-xx
。 xxが削除された理由は不明です。しかし、あなたが言うことによれば、ファジーマッチを得ることができるように聞こえ、おそらくより簡単な方法があります。
'r:|?=**'
かなり積極的です。ファジーの場合、入力した各文字の間に追加の文字を許可しますが、代替文字などは処理しません。 Justを使用する'b:=*'
と、部分文字列と_approximate
完成者がより制御された方法で近似値を処理できるようになり、変更が少ない一致を好みます。