zsh 補完でプレフィックスと一致しないオートコンプリート候補を提供する方法

zsh 補完でプレフィックスと一致しないオートコンプリート候補を提供する方法

というコマンドの 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#*»}"

しかし、それを適切に行う方法を知っておくと良いでしょう。

関連情報