저는 MacOS El Capitan에서 zsh를 사용하고 있습니다. 별칭을 해결하기 위해 자동 완성을 매개 변수화하는 방법을 알고 싶습니다. Bash를 사용할 때 .bash_profile
다음을 포함합니다.
alias mdb "mongo -uadmin -pXXX --authenticationDatabase admin --host "
complete -W "$HOSTNAMES" mdb
HOSTNAMES
4000개 이상의 FQDN 목록입니다. 이렇게 하면 mdb someHost
tabtab로 시작하는 모든 호스트 목록을 입력하여 볼 수 있습니다 someHost
. 올바른 호스트가 선택되면 명령이 완료됩니다 mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo
.
이제 oh-my-zsh를 사용하고 싶기 때문에 위 줄을 .zshrc
파일에 복사합니다. 그러나 호스트 이름 목록이 약 1500개 항목을 초과하면 자동 완성 기능이매우느린. 그래서 파일을 complete -W "$HOSTNAMES" mdb
. 하지만 오늘은 그럴 것이다.compctl -c "$HOSTNAMES" mdb
.zshrc
setopt complete_aliases
.zshrc
읽다compctl
더 이상 사용되지 않으므로 사람들은 명령에 대한 완성 기능을 더 잘 작성해야 합니다 . 나는 이것을 생각해 냈지만 이것은 포함된 호스트 이름이 거의 없을 mdb hosts
tabtab때 입력한 후에만 호스트 이름을 제안합니다 .$HOSTNAMES
#compdef mongo mdb
#autoload
_mongo_hosts(){
mhosts=$HOSTNAMES
}
local -a _1st_arguments
_1st_arguments=(
"--host:host to be connected to"
)
local expl
local -a mhosts
if (( CURRENT == 2 )); then
_describe -t commands "mongo subcommand" _1st_arguments
return
fi
case "$words[2]" in
hosts)
_mongo_hosts
_wanted mhosts expl 'known hosts' compadd -a mhosts ;;
esac
게다가 이 방법으로는 mdb
아직까지 교체된 적이 없습니다 mongo -uadmin -pXXX --authenticationDatabase admin --host
.
후속 조치
compdef
위의 방법을 포기했습니다 . 현재 해결 방법은 다음 두 줄을 내 항목에 추가하는 것입니다 .zshrc
.
zstyle ':completion:*' completer _expand_alias _complete _ignored
zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $HOSTNAMES
첫 번째 줄은 확장 별칭이기도 합니다. 여기 내 별칭이 있습니다 mdb
.
두 번째 줄에서는 ssh
, scp
또는 sftp
같은 명령을 사용할 때 모든 호스트 이름을 반복 할 수 있습니다. host
다음 줄을 사용해도 동일한 효과를 얻을 수 있습니다.
_hosts() {compadd $(echo $HOSTNAMES | tr "\n" " ")}
따라서 이 방법을 사용하여 를 입력 ssh someHost
tabtab하고 호스트를 선택한 다음 ssh
으로 교체하여 mdb
완료해야 합니다.mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo
이것은 작동하지만 완벽하지는 않습니다. 내 질문의 첫 번째 줄에 표시된 두 줄을 통해 bash를 사용하는 것과 동일한 자동 완성 경험을 갖고 싶습니다. zsh와 4000개 이상의 호스트 이름을 사용하여 이를 어떻게 달성할 수 있습니까? 감사합니다!
답변1
내가 원하는 방식으로 정확하게 작동하는 솔루션을 찾았습니다. 다음 세 줄만 필요합니다 .zshrc
.
mdb() {mongo -uadmin -pXXX --authenticationDatabase admin --host "$@"}
compctl -k "($(echo $HOSTNAMES))" mdb
zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $(echo $HOSTNAMES)
이 함수는 mdb()
이전 별칭을 대체합니다 mdb
. 이 명령 compctl
으로 완성되는 기능은 , , 등의 명령을 완성하는 배열 mdb
과 유사합니다 .$HOSTNAMES
zstyle
ssh
scp
sftp
host
$HOSTNAMES