Como usar aliases com preenchimento automático em oh-my-zsh?

1

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!

    
por Kay 13.09.2018 / 08:57

1 resposta

1

Eu encontrei uma solução que funciona exatamente como eu queria. Somente as três linhas a seguir são necessárias em .zshrc :

mdb() {mongo -uadmin -pXXX --authenticationDatabase admin --host "$@"}
compctl -k "($(echo $HOSTNAMES))" mdb
zstyle ':completion:*:(ssh|scp|sftp|host):*' hosts $(echo $HOSTNAMES)

A função mdb() substitui meu antigo alias mdb . O comando compctl conclui funções como mdb com a matriz de $HOSTNAMES . A instrução zstyle conclui comandos como ssh , scp , sftp e host com a matriz de $HOSTNAMES .

    
por 14.09.2018 / 12:09