Por que o bash desativa o preenchimento automático de alguns comandos e como posso desabilitá-lo?

3

Muitas vezes acontece comigo que o bash desativa o preenchimento automático para certos comandos, o que me obriga a adicionar um símbolo aleatório ao nome do comando, usar o autocompletion e consertar o nome do comando, o que é bastante irritante, por exemplo:

# I type:
openvpn s<tab>
# Nothing happens, so I add x
openvpnx s<tab>
# Now this expands to
openvpnx somepath

# Same with ./configure or many other commands...

Existe uma maneira de desabilitar isso para que o preenchimento automático funcione SEMPRE?

    
por Petr 07.03.2017 / 18:37

2 respostas

4

Listar conclusões

Você pode ver o que Bash / Readline usa para concluir um comando usando complete -p command , por exemplo, se eu executar complete -p openvpn , obtenho

bash: complete: openvpn: no completion specification

Isso mostra que o Readline usado pelo meu shell não tem nenhuma conclusão específica para o comando openvpn , portanto, o padrão é a forma tradicional de conclusão, ou seja, nomes de arquivos.

Outro exemplo (para demonstrar uma conclusão definida):

$ complete -p dillo
complete -F _filedir_xspec dillo

Isso indica que uma função chamada _filedir_xspec é usada para fornecer conclusões para o comando dillo .

Remover conclusões

Para remover uma conclusão definida, use a opção -r com o complete builtin:

complete -r openvpn
    
por 07.03.2017 / 20:53
3

O Bash tem conclusão programável . Desde 1999, tem sido capaz de adaptar a conclusão dos argumentos de comando ao comando, e não apenas completar os nomes dos arquivos. Os nomes dos arquivos são o padrão quando nenhuma conclusão específica do comando é configurada (é por isso que você obtém nomes de arquivos quando altera o comando para openvpnx ).

A conclusão programável é normalmente ativada carregando /etc/bash_completion . Se você não deseja a conclusão programável, e sempre quer completar os nomes dos arquivos mesmo em contextos onde os nomes de arquivos não fazem sentido, remova isso do seu .bashrc .

Parece que você tem conclusão personalizada para argumentos para o comando openvpn e que esse código de conclusão não oferece nada para o primeiro argumento. Eu não sei porque isso é, pode ser um bug no código de conclusão. O código de conclusão útil completaria opções e seus argumentos. Execute complete -p openvpn para ver qual código é invocado para concluir os argumentos para openvpn . Você pode desabilitar esse código de conclusão personalizado com complete -r openvpn , mas, em seguida, voltaria apenas para nomes de arquivo, o que é útil na linha de comando de openvpn somente após algumas opções.

Independentemente das configurações de conclusão, você sempre pode completar um nome de arquivo invocando complete-filename (ligação padrão: M-/ ) em vez de complete ( TAB ).

    
por 08.03.2017 / 02:48