쉘 함수를 사용하여 자동 완성

쉘 함수를 사용하여 자동 완성

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

관련 정보