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_ssids
zsh ≥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