web-dev-qa-db-ja.com

zshが大文字と小文字を区別しないオートコンプリートの一致を返すようにしますが、完全一致が優先されます

Oh-my-zshのrcファイルでzshを使用していますが、特に煩わしい動作がいくつかあります。デフォルトでは、oh-my-zshはオートコンプリート時に大文字と小文字を区別しない一致を返すように構成されています。この振る舞いは良いこともあるが、実際にはひどい場合もある。大文字と小文字を区別する一致がない場合に大文字と小文字を区別しない一致のみを使用するようにzshを構成する方法はありますか?

たとえば、このケースでは大文字と小文字を区別するマッチングを使用します。

> ls
LICENSE.txt    lib/
> emacs l <-- should autocomplete to lib/

この場合、大文字と小文字を区別しないオートコンプリートが発生します。

> ls
README    lib/
> emacs r <-- should autocomplete to README

ありがとう!

32
Max

〜/ .zshrcの次の行のコメントを外してください:

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

それは私のために働いた

26
Jesus Garcia

次の行を含むファイル_~/.oh-my-zsh/custom/better-completion.zsh_(oh-my-zshのデフォルトパスを使用していると想定)を作成します。

_zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
_

説明:

一般にzsh補完での一致のルールは_matcher-list_スタイルで定義されます。 oh-my-zshの場合、これは_~/.oh-my-zsh/lib/completion.zsh_で定義されます(大文字と小文字を区別する場合は1回、大文字と小文字を区別しない場合は1回)。そこで変更することもできますが、oh-my-zshを更新した場合はおそらく失われます。 _~/.oh-my-zsh/custom_は特にカスタマイズを目的としており、拡張機能_.zsh_が付いたファイルは、構成の最後に_.oh-my-zsh/oh-my-zsh.sh_によってそこからロードされます。

oh-my-zshの_matcher-list_のデフォルト(大文字と小文字を区別しない)設定は次のとおりです。

_zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
_

最初のものは、大文字と小文字を入れ替えて処理するように指示しています。これは最初のルールなので、すべての試合で常に使用されます。

必要な唯一の変更は、単純な補完のために_''_を前に付けることです(これは_matcher-list_のzshcompsys(1)の最初の例です)

_zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
_

これは、大文字と小文字を区別しないか他の一致を試みる前に、最初に現在のWordをその記述どおりに完成しようとします。

完了するには:

  • 2番目の(元の)ルールでは、_._、___または_-_の前に部分的に補完できます。 _f.b_-> _foo.bar_。
  • 3番目のルールは、書かれたテキストの左側で完了することを可能にします。 bar-> foobar
29
Adaephon