zsh: コマンド名とファイル名を別々に完成

zsh: コマンド名とファイル名を別々に完成

[ファイル名]タブの補完がファイル名の先頭に優先順位を付けたくありません。たとえば、ファイル名がred_blue.txtとblue_red.txtの場合、vim redはtabred_blue.txtの優先順位を指定したくありません。

これは以下を使用して行うことができます。

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'

ただし、この動作は、私が望んでいないコマンド名のタブ補完にも当てはまります。例えば、nittab検索コマンド「nitrogen」を入力すると、mkinitcpio、xinit、compinitなどのコマンドも一致します。

コマンドに次の補完を使用したいと思います。

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

zsh タブ補完がコマンド名とファイル名を異なるように処理するにはどうすればよいですか?

答え1

一般的に言えば、整えなければなりません。zstyle呼ぶしたがって、すべての完成に対しては機能せず、ファイルの完成にのみ機能します。一般的な完成の場合、コンテキスト指定子の構文は次のとおりです。:completion:WIDGET:COMPLETER:COMMAND:ARGUMENT:TAG

  • WIDGET一部の特殊ウィジェットによってのみ設定され、一般(*)は残ります。
  • COMPLETER通常の完成に使用されcomplete、自動修正などの作業には異なる値を設定できます。
  • COMMAND通常、引数が完了するコマンドの名前です。もっと正確に言えば後者の言葉だcompdef。一部の複雑なコマンドは、完了するとサブコマンドを変更します。シェル構文の特別な場所の場合、次のようになります。ダッシュ間のコンテキスト名たとえば、コマンドの最初の単語の上または後です-parameter$-command-
  • ARGUMENT通常、argument-3オプションではない3番目の引数またはoption--foo-1optionの引数に似ています--foo
  • TAGいくつかの完成関数によって内部的に使用されます。通常、必ずしもそうではありませんが、次のいずれかです。一般タグ名

存在するzstyle氏名、より具体的な説明は、より具体的な説明よりも優先されます。

  • コロンの多い宣言()は、:コロンの少ない宣言よりも具体的です。
  • 同じ数の列が与えられた場合、コロンで区切られた各部分が他の宣言の対応する部分と同じくらい具体的である場合、宣言は少なくとも他の宣言と同じくらい具体的です。各部分について:
    • *何よりも具体的です。
    • ワイルドカードを持つすべての項目は、ワイルドカードを持たない単純な文字列よりも具体的です。

したがって、通常、コマンド名の例外を作成するには、zstyleそのコマンドに関連する別の宣言を追加するだけです。

しかし反転があります。matcher-list完全な基盤ではなくグローバル規模で適用されるということです。あなたの場合は、一致者だけが欲しい限り、次のものを使用できます。matcher代わりに。

zstyle ':completion:*' matcher 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
zstyle ':completion:*:*:-command-:*' matcher 'm:{a-zA-Z}={A-Za-z}'

関連情報