Eu tenho um script de conclusão de tabulação Bash para o Hadoop do Apache. Normalmente, eu uso zsh como meu shell do dia-a-dia. Tende a ser bem parecido com o bash quando preciso, mas parece que os sistemas de preenchimento de tabulação são radicalmente diferentes entre eles. Existe uma maneira simples de "converter" as definições de conclusão de tabulação bash existentes para trabalhar em zsh? Não quero investir muito tempo nisso, mas se for fácil, economizaria um pouco de esforço.
fonte
/etc/zsh/zshrc
. Além disso, verifique os seguintes arquivos na ordem inversa (listados na ordem em que são originados durante a inicialização zsh):/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
e$ZDOTDIR/.zprofile
(provavelmente~/.zprofile
) para ver se aRCS
variável está em branco. Se for, isso evitaria que os arquivos subsequentes após o arquivo no qual ele não foi definido sejam originados. Finalmente, verifique o shell para o usuário/etc/passwd
e certifique-zsh
se de que ele não tenha um-f
argumento.fonte
complete:13: command not found: compdef
erros.if is-bash
marca de seleção na parte superior._get_comp_words_by_ref
que não é definido porbashcompinit
. A maioria das conclusões não usa esta função.Estou executando o zsh
zsh 5.0.2 (x86_64-apple-darwin13.0)
sem nenhum ~ / .zshrc e a sequência acima funcionou em um shell zsh recém-gerado.Agradecimentos ao script git-completed.bash pela dica: D
Continue lendo para mais detalhes nas 3 linhas acima:
O Bash possui um suporte de preenchimento automático incrível, mas os scripts de preenchimento automático bash não funcionam diretamente zsh, pois o ambiente zsh não possui as funções auxiliares de preenchimento automático bash essenciais
compgen
, comocomplete
,. Ele faz isso em um esforço para manter a sessão zsh rápida.Atualmente, o zsh é fornecido com scripts de preenchimento apropriados, como
compinit
ebashcompinit
que têm as funções necessárias para oferecer suporte a scripts de preenchimento automático do bash.autoload <func_name>
: Observe que o autoload é definido em zsh e não em bash.autoload
procura um arquivo nomeado nos caminhos de diretório retornados pelofpath
comando e marca uma função para carregar a mesma quando for chamada pela primeira vez.Por exemplo, em meu sistema, os
echo $fpath
retornos/usr/share/zsh/site-functions
e/usr/share/zsh/5.0.5/functions
e amboscompinit
ebashcompinit
estão disponíveis em/usr/share/zsh/5.0.5/functions
.Além disso, para a maioria das pessoas, ele só
autoload -U +X bashcompinit && bashcompinit
é necessário porque algum outro script, como git autocomplete ou o seu próprio,~/.zshrc
pode estar fazendoautoload -U +X compinit && compinit
, mas é seguro executar os dois.fonte
-U
e+X
para quê?+X foo
fazer o mesmo carregamento automático apenas invocandofoo
, mas sem executá-lo imediatamente ... entãoautoload +X foo && foo
parece completamente redundante. Você pode explicar por que escolheu esse padrão?autoload -U +X bashcompinit && bashcompinit
é que (devido ao&&
) ele executará obashcompinit
IFF se o módulo for realmente encontrado. Normalautoload foo
sempre retorna verdadeiro. Mais tarde, quando você tenta executarfoo
, em seguida, zsh, finalmente, lhe diz "arquivo de definição de função não encontrado". Comautoload +X
você obtém o erro imediatamente.autoload +X
carrega a função sem executá-la - o que é mais do queautoload
faz, sem+X
. Sem+X
, o autoload nem mesmo carrega a função; Ele apenas marca o nome como uma referência a uma função a ser carregada posteriormente. O carregamento real não é tentado até que a função seja chamada pela primeira vez. Se você deseja determinar se a função nomeada carrega com sucesso , você precisa usar+X
para executar a etapa de carregamento imediatamente.Para
zsh
uso:compdef
compadd
Meu exemplo:
Fonte: Meu código https://github.com/reduardo7/bashx
fonte
Estou executando o Antigen como gerenciador de plug-ins Oh-My-Zsh. Eu tinha alguns scripts de conclusão do bash escritos por colegas de trabalho que queria carregar no Zsh com um simples
source /path/to/completion
.Tive alguns problemas, porque parece que o Antigen ou o OMZ (difícil de dizer) se preocupam apenas em carregar scripts de conclusão de seus plug-ins. Eu finalmente resolvi isso com o carregamento automático
bashcompinit
ecompinit
depoisantigen apply
. Simplesmente o carregamento automáticobashcompinit
não era suficiente.Antigen cria seu
.zcompdump
arquivo no$ANTIGEN_COMPDUMP
qual para mim foi~/.antigen/.zcompdump
A nova chamada de compinit e bashcompinit cria um segundo .zcompdump em
$HOME/.zcompdump
Isso parece a todo o trabalho fora, porque eu sou capaz de usar as conclusões estabelecidas por
/path/to/bash_completion
. Excluí os dois arquivos .zcompdump algumas vezes para ter certeza de que eles foram regenerados e parecem funcionar.Tive que rm os arquivos .zcompdump algumas vezes após a reinicialização da máquina por causa de erros gerados ao tentar concluir a tabulação, mas não tenho certeza se isso é devido a esta configuração ou outra coisa.
rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
e um novo shell corrige isso para mim.Versões usadas no momento da escrita:
fonte