というコマンドの zsh 自動補完機能がありgd
、値に基づいてあいまい検索を実行して$words[CURRENT]
候補を返します。検索は正常に動作していますが、入力したテキストが候補のプレフィックスではないため、zsh は候補を表示しません。
例えば
% gd hw
完了を生成する可能性があるoh hello there, world
hw
しかし、zsh は提案の先頭に見つからないためそれを表示しません。
選択されたときに、現在の単語を置き換えるものとして zsh に提案させるようにできますか?
_gd
以下は、私の にあるというファイル内の補完スクリプトの簡略化されたバージョンですfpath
。
#compdef gd
_gd() {
local -a list
clue="$words[CURRENT]"
pattern=""
for i in $(seq $#clue)
do
pattern="$pattern.*${clue[i]}"
done
while read dir
do
list=( $list $dir )
done <<<$(grep "$pattern" ~/.recent-dirs)
_describe gd list
}
答え1
その関数を削除し_gd
、ファイルに次のコードを追加します.zshrc
。
autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'
これは、入力した文字の間や周囲に任意の数の追加文字を許可するように補完コードに指示します。これにより、Zshはあいまい補完ができるようになりました。何でも。
r:X|Y=Z
パターンに一致する重複しない部分文字列をすべて探しXY
、一致する部分をX
またZ
一致する補完をチェックするときに、パターンに一致するものすべてに一致します。?
任意の 1 文字に一致します。X
または がY
に等しい場合*
、任意の数の連続する文字と一致します。Z
と等しい場合*
、任意の数の連続した文字に一致しますを除外する一致するものはすべてY
。Z
に等しい場合**
、任意の数の連続する文字と一致します。- では
r:|?=**
、X
空の文字列に等しくなります。 - デフォルトでは、Zsh は入力の末尾にワイルドカードを追加し、完全なあいまい一致の循環を完成させます。
ドキュメントはここから見つかります:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control
答え2
これは、より賢明な回答を待つ間のハックです...
私が行ったのは、提案ジェネレーターが次のような提案を生成するようにすることです。
hw»oh hello there, world
コマンド (実際には関数) は私が制御しているので、最初に不要な部分を削除するだけです。
input="${input#*»}"
しかし、それを適切に行う方法を知っておくと良いでしょう。