zshエイリアスのzstyleコンプリート設定をどのように定義しますか?

zshエイリアスのzstyleコンプリート設定をどのように定義しますか?

実行可能ファイルがある場合は、~/bin/stuffmyに実行可能ファイルを定義して、最初にテキストファイルを私のコマンドの引数として自動補完するようにしますPATH.zshrc

zstyle ':completion:*:*:stuff:*' file-patterns '*.txt:all-files' '*:all-files'

ただし、stuffエイリアス(たとえば)の場合、これはalias stuff=less機能しなくなり、zshはデフォルトであるため、すべてのファイルをオートコンプリートする必要があるようになります。

ここで文書を見ました。Zsh完成システムエイリアスを拡張する方法について話す以外には何も見つかりませんでした。これは私が望むものではありません。

考えるこれは、ドキュメント内のパラメータパターンがパラメータパターンであることを示していますが、これは4番目の部分が次のようになることを意味するためですzstyle':completion:*:*:-command-:*:commands'注文する一つではなくニックネーム。私はいつもzshである程度の交換が可能だと思いました。

私の言葉は、私のエイリアスとそれに続く1行の実行可能ファイルを複数作成できることを意味します"$@"。しかし、そうではありません。エレガント

答え1

stuffどちらの場合も、ラベルが破れたと仮定します。

% ls
bar     foo.txt
% whence stuff
% alias stuff=less
% zstyle ':completion:*:*:stuff:*' file-patterns '*.txt:all-files'
% stuff
bar      foo.txt

対応するzshoptions(1)ハンドル

COMPLETE_ALIASES
    Prevents aliases on the command line from being internally sub-
    stituted before completion is attempted. The effect is to make
    the alias a distinct command for completion purposes.

だから

% setopt COMPLETE_ALIASES
% stuff foo.txt

それ以外の場合は、別名はすでに異なるものです。

副作用を確認するには、この変更が完了またはスタイル設定のないエイリアスの完成を中断しないことを確認する必要があります。

% setopt COMPLETE_ALIASES
% whence foo
% unfunction _foo
unfunction: no such hash table element: _foo
% alias foo=ls
% foo (eval):1: command not found: _foo

したがって、COMPLETE_ALIASESセットを使用するときは、各エイリアスの完成を設定したり、エイリアスを適切な場所にリストしたり含めたりする必要がありますcompdef

% compdef _ls foo
% foo
...

一方、ラッパーはシェルエイリアスとは異なり、かなりのサイズのシェルをロードまたはロードせずに呼び出すことができ、対話型シェル構成で単純なシステムコールを汚染する可能性があるため、非常にexecエレガントだと思います。exec(3)system(3)

関連情報