Estou usando o zsh no MacOS El Capitan. Eu estou querendo saber como a conclusão automática deve ser parametrizada para resolver os aliases também.
Quando usei o bash, meu .bash_profile continha o seguinte:
alias mdb "mongo -uadmin -pXXX --authenticationDatabase admin --host "
complete -W "$HOSTNAMES" mdb
HOSTNAMES é uma lista de mais de 4000 FQDNs.
Ao fazer isso, eu poderia digitar mdb someHost guia guia para ver uma lista com todos os hosts que começam com someHost . Uma vez selecionado o host certo, o comando foi concluído para mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo .
Neste momento, quero usar oh-my-zsh, então copiei as linhas mencionadas acima no meu arquivo .zshrc . No entanto, quando a lista de nomes de host excede cerca de 1500 entradas, o preenchimento automático torna-se muito lento. Por esse motivo, substituí complete -W "$HOSTNAMES" mdb por compctl -c "$HOSTNAMES" mdb no meu arquivo .zshrc . No entanto, isso não funcionará, mesmo se eu definir setopt complete_aliases no meu .zshrc .
Hoje eu leio que é melhor escrever funções de conclusão para comandos desde que compctl está obsoleto. Eu criei isso, mas isso só irá sugerir nomes de hosts depois de ter digitado mdb hosts guia guia quando $HOSTNAMES contém muito poucos nomes de host:
#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
Além disso, por essa abordagem, mdb ainda não foi substituído por mongo -uadmin -pXXX --authenticationDatabase admin --host .
Acompanhamento
Eu descartei a abordagem compdef mostrada acima. Minha solução atual é adicionar as duas linhas a seguir ao meu .zshrc :
zstyle ':completion:*' completer _expand_alias _complete _ignored
zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $HOSTNAMES
A primeira linha é também expandir aliases, aqui meu alias mdb .
A segunda linha permite percorrer todos os nomes de host quando comandos como ssh , scp , sftp ou host são usados. O mesmo poderia ser alcançado por esta linha:
_hosts() {compadd $(echo $HOSTNAMES | tr "\n" " ")}
Então, com essa abordagem, eu tenho que digitar primeiro ssh someHost aba aba , escolher o host e então substituir ssh por mdb para completar para mongo -uadmin -pXXX --authenticationDatabase admin --host someHostFoo
Isso funciona, mas não é perfeito. Eu preferiria ter a mesma experiência de preenchimento automático que eu tinha usando o bash, implementado pelas duas primeiras linhas mostradas aqui na minha pergunta. Como conseguir isso com zsh ee mais de 4000 nomes de host?
Obrigada!