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!