Zsh完了スクリプトが見つかりましたが、実行されませんでした。

Zsh完了スクリプトが見つかりましたが、実行されませんでした。

まず、私が以下を持っているとしましょう。

alias foo='path/to/my/program'

私のファイルでは、.zshrc私はそれのための完成スクリプトを作成しました~/.oh-my-zsh/completions/_foo。ファイルには次のものがあります。

#compdef foo

_foo() {
    echo "hello"
}

_foo

そのため、foo [tab]シェルで入力すると、次のように表示されると予想しました。

$foo [tab]
hello

しかし、私は得た。

$ foo [tab]_foo

押すとテキストが_foo出力されますtab

この問題を解決するアイデアはありますか?

答え1

これはzshに対する一般的な答えです。わかりません。

デフォルトでは、zsh は完了を試みる前にエイリアスを拡張します。これは一般的に正しいことです。したがって、完成関数をエイリアス名に関連付けるのは、afterなどのエイリアスをバイパスした場合にのみ機能します\fooTab

次のコマンドを使用してこの動作をオフにすることができますsetopt complete_aliases。ただし、完成が明示的に設定されていないすべてのエイリアスの完成機能は失われます。

特別なケースが必要な場合は、foo最善の方法はこれを関数に変更することです。

function foo {
  path/to/my/program "$@"
}

_foo印刷される理由は説明されていません。多分何か奇妙なことかもしれません。

関連情報