Autocompletar bash com comando vim

13

No bash, o preenchimento automático de caminhos recentemente parou de funcionar ao emitir vimcomandos em que o caminho é mais profundo que dois diretórios (continua a funcionar conforme o esperado com outros comandos, como lse cd).

Por exemplo, se eu digitar ls .config/btsync/bte pressionar TAB, ele será expandido para ls .config/btsync/btsync.conf.

Se eu digitar vim .config/bte pressionar TAB, ele será expandido para vim .config/btsync/.

No entanto, se eu digitar vim .config/btsync/bte pressionar TAB, nada acontece (eu esperaria que ele fosse expandido para vim .config/btsync/btsync.conf, como no lsexemplo acima.

Eu recebo o mesmo problema ao executar como meu próprio usuário e ao executar como su.

Eu li este post que mencionava um problema com versões mais antigas do bash-conclusão, mas estou executando o 2.1-5.

ATUALIZAÇÃO: Após alguns testes adicionais, eu descobri que o problema principal é que o bash completará nomes de diretórios, não nomes de arquivos.

ATUALIZAÇÃO: Acontece que essa bash-completionfoi a causa geral. Veja meu segundo comentário sobre a resposta aceita.

Qualquer sugestão sobre a causa potencial desse comportamento seria recebida com gratidão!

TheRogueWolf
fonte
Publique o seu .bashrc!
Gilles 'SO- stop be evil'
Link para o meu .bashrcpost, conforme exigido.
TheRogueWolf
Links removidos para .bashrc, .aliases e .funtions não são pertinentes ao problema agora que a causa foi descoberta.
TheRogueWolf
mesmo problema no Debian 9, algumas instalações, mas não todas: $
Philippe Gachoud 28/11

Respostas:

10

Eu fiz mais algumas pesquisas para você e aqui está o que eu encontrei - a chave para o preenchimento automático é o bashcomando complete. Você pode imprimir as regras de vimuso:

complete -p vim

Da mesma forma, você pode remover estas regras específicas com:

complete -r vim

Esse comando redefine os padrões - os caminhos usuais e a conclusão de nomes de arquivos sem nenhuma lógica extra. Provavelmente é isso que você quer.

Para obter mais informações, consulte help completeou man bashprocure a seção sobre completecomando (é um bash embutido, portanto está documentado na página de manual do bash).

Um último ponto - as alterações acima afetam apenas a bashsessão atual , se você deseja remover as regras do vim após cada login colocar o complete -r vimseu ~/.bashrc.

Espero que ajude :)

MLu
fonte
Isso foi o que aconteceu. Muitíssimo obrigado. O complete -p vimcomando retornado complete -F _filedir_xspec vimfoi removido pelo complete -r vimcomando, resolvendo o problema. Vou fazer algumas leituras sobre o completecomando e as informações retornadas pela opção -p. Um pouco confuso por que esse comportamento mudou, também investigará isso.
TheRogueWolf
3
Parece que a conclusão do bash foi a culpada, afinal. A _filedir_xspecfunção /usr/share/bash-completion/bash_completionapenas conclui diretórios. Eu desinstalei bash-completion, removi a complete -r vimlinha da minha .bashrce reinicializei e vimagora me comporte conforme o esperado.
TheRogueWolf
3

O Bash por padrão preenche automaticamente apenas os nomes de caminho e arquivo. No entanto, o mecanismo é extensível e o bash pode ser ensinado a executar diferentes preenchimentos automáticos para diferentes programas. Por exemplo, gitele pode preencher automaticamente os nomes de subcomando (clonar, confirmar) e revisões em vez de apenas nomes de caminho. Às vezes é útil, às vezes bastante irritante - por exemplo, quando gzip -dse recusa a preencher automaticamente nomes de arquivos que não têm a .gzextensão.

A conclusão do Bash geralmente é configurada /etc/bash_completion.d- você provavelmente encontrará um arquivo chamado vimlá. Esse é o arquivo que contém as regras de preenchimento automático para a vimlinha de comando.

Agora você tem duas opções:

  1. Corrija o arquivo para preencher automaticamente os caminhos, como os usuários provavelmente esperam de qualquer maneira.
  2. Remova o arquivo para desativar as vimregras especiais e execute apenas o preenchimento automático do caminho padrão.

E, é claro, envie um relatório de bug que descreve o problema para que ele seja corrigido nas versões futuras :)

MLu
fonte
Muito obrigado pela ótima explicação :) Eu dei uma olhada /etc/bash_completion.de há apenas um hgarquivo presente (para Mercurial). Muito estranho.
TheRogueWolf
1
Então deve estar em outro lugar. Tente /usr/share/bash-completion/ou liste todos os arquivos do vimpacote ou de bashou bash-completionpackages (não sabe como é chamado no ArchLinux). Estará lá em algum lugar.
MLu
1
Listar arquivos do bash-completionpacote mostra /usr/share/bash-completion/completionscontém regras para muitos programas, mas não vim. A listagem de arquivos instalados com o vimpacote não mostra nenhum arquivo relacionado à conclusão e a pesquisa em todo o sistema usando find / -name vimtambém não mostra arquivos relacionados à conclusão.
TheRogueWolf
2

Talvez você possa reinstalar a conclusão do bash: apt-get install --reinstall bash-completion

E dê uma olhada no arquivo /etc/bash.bashrc: nano /etc/bash.bashrc

E verifique se a seguinte linha está bem comentada:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

Em seguida, reinicie sua sessão do terminal

Djidiouf
fonte
Tentei remover bash-completion, testar o vimcomportamento e, em seguida, reinstalar bash-completione testar, mas ainda havia o mesmo problema nas duas circunstâncias. As linhas que você listou não estão presentes /etc/bash.bashrc. Esta linha é, no entanto[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf