シェル関数を使用したオートコンプリート

シェル関数を使用したオートコンプリート

zsh機能cn

function cn() {
    nmcli device wifi connect "$1" --ask
}

foo入力すると、パスワードを入力するように求められ、ネットワークに接続されます。

cn foo

fooただし、nmcliコマンド全体を作成するときと同じように、自動的には実行されません。ネットワーク名を自動補完する方法は?

zsh 5.7.1を使用しています。

答え1

この特定のケースで最も簡単な方法は、エイリアスを作成することです。これは--askネットワーク名の前に置くことができるので可能です。デフォルトでは、Zshはエイリアスを完了する前にエイリアスを拡張します。

alias cn='nmcli device wifi connect --ask'

関数を使用する場合は、zshに関数のパラメータを教える必要があります。cn実行する操作に応じて、ユーザー定義関数でもそうでなくてもよい完成関数を指定する必要があります。 (私はあなたが「新しい完成システム」を使用していると仮定していますcompinit.zshrc

ここで、関数は他のコマンドを囲む単純なラッパーです。次に、このコマンドのパラメータがどのように完成するかを見てください。

% echo $_comps[nmcli]
_networkmanager

ほとんどのコマンドでは、補完機能の名前は下線付きのコマンド名ですが、nmcli最近のzshバージョンでは別の名前です。 (おそらく_nmcliあなたのシステムにいるでしょう。)次に確認してください。ソースコードこの機能がどのように機能するかを確認してください。バラよりzsh 完成定義の検索方法より多くの情報を知りたいです。

すべてを知る必要はありません(幸運です:完成システムは複雑です!)。しかし、ほとんどのコマンドでは、特定のサブコマンドやオプションがどのように実行されるかを理解するのはかなり簡単です。 zsh ≥5.5 では以下の機能です。_nm_device_wifi_connectこれは再び呼び出されます_nm_device_wifi_ssids。 zsh 5.4以下では、_nmcliこの特定のコマンドライン構文はサポートされていないと思います(構文は絶えずnmcli変更されるため、zshがリリースされるまでにnmcli完了コードが最新バージョンではないことが多いです)。

_nm_device_wifi_ssidszsh ≥5.5の場合、接続が可能ですcn。しかし、問題があります。cn完了せずに最初に完了すると、zshは要求時に完了機能がロードされるため、nmcliどこで見つけることができるかを知ることができません。_nm_device_wifi_ssids主な関数を見つける方法を知ってい_networkmanagerますが、ヘルパー関数を見つける方法がわかりません。たとえば、次を_nm_XXX参照してください。他のZSH完了ファイルでヘルパー機能を使用できますか?そしてzshの既存の機能のオーバーライドと再利用この問題を解決する方法を学びます。

ここでは、zsh 5.5機能のコードは非常に簡単ですが、zsh 5.4にはその機能はありません。したがって、最も簡単な解決策は、zsh 5.5コードの関連部分を新機能にコピーすることです。

function _cn {
    compadd -- ${(f)"$(_call_program nmcli nmcli -t -f ssid device wifi list)"}
}
compdef `_cn` cn

関連情報