Автодополнение с помощью функции оболочки

Часовой пояс сообщает вашей системе, где вы находитесь в мире. то есть GMT-4илиGMT+2(в зависимости от вашего точного местоположения на планете ).

Локальное время сообщает вашей системе точное время в вашем местоположении.

3
01.12.2019, 00:51
1 ответ

Простой способ в этом конкретном случае :сделать его псевдонимом. Это возможно, потому что вы можете поставить --askперед именем сети. Zsh расширяет псевдонимы перед завершением по умолчанию.

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

Если вы используете функцию, вам нужно научить zsh аргументам функции :указать функцию завершения для cn, которая может быть или не быть пользовательской функцией в зависимости от того, что она должна делать. (Я предполагаю, что вы используете «новую систему завершения», то есть у вас есть compinitв вашем .zshrc.)

Здесь функция представляет собой простую оболочку для другой команды. Итак, посмотрите, как завершаются аргументы этой команды.

% echo $_comps[nmcli]
_networkmanager

Для большинства команд имя функции завершения — это имя команды со знаком подчеркивания перед ним, но для nmcliв последних версиях zsh это другое имя. (Это может быть _nmcliв вашей системе, если вы используете zsh <5.5. )Затем просмотрите исходный код , чтобы увидеть, как работает функция. Дополнительную информацию см. в Как найти определения завершения zsh .

Вам не нужно все понимать (и удачи в попытках :система завершения сложна! )но для большинства команд довольно легко выяснить, как завершается конкретная подкоманда или параметр. В zsh ≥5.5 это функция _nm_device_wifi_connect, которая, в свою очередь, вызывает _nm_device_wifi_ssids. В zsh ≤5.4 я думаю, что _nmcliне поддерживает этот конкретный синтаксис командной строки (синтаксис nmcliпостоянно меняется, поэтому к тому времени, когда zsh выпускает версию, ее код завершения nmcli, как правило, уже отсутствует Дата ).

При zsh ≥5,5 можно связать _nm_device_wifi_ssidsс cn. Однако есть одна особенность :, если вы сначала завершите cn, не завершив nmcli, zsh не будет знать, где найти _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
3
27.01.2020, 21:24

Теги

Похожие вопросы