Forçar conclusão normal da guia Bash se a conclusão inteligente falhar

10

Desde que a conclusão da guia se tornou um recurso padrão nos shells, tenho sido um usuário muito feliz disso. Eu até gosto da conclusão inteligente do Bash (onde ele só procura por arquivos PDF, se eu digitar evince foo <TAB>) - desde que adivinhe corretamente.

Destrói um dia feliz quando o Bash usa sua conclusão inteligente para recusar a conclusão.

Hoje eu queria:

tar xvf centos5.8_x86_1.ova

Então eu entrei:

tar xvf cent<TAB>

e o Bash se recusa a concluir o caminho porque os arquivos .ova não são o que você costuma usar com o tar.

Sei que posso desinstalar o pacote de conclusão do bash para remover a conclusão inteligente. Mas posso comer meu bolo e também?

Posso pedir ao bash para usar a conclusão inteligente primeiro e, se isso falhar, use a conclusão não inteligente?

Ole Tange
fonte
1
<spam> O Zsh pode fazer isso. </spam>
Gilles 'SO- stop be evil

Respostas:

9

O seguinte deve ativar a conclusão normal do bash após todas as conclusões 'inteligentes' falharem nos programas tar, vim e emacs:

compopt -o bashdefault tar vim emacs

consulte também a página relevante no manual do bash online.

Advertência: você obtém o comportamento normal do tipo de conclusão (comandos / nomes de arquivos / nomes de usuário etc.) definido pela conclusão inteligente do comando em questão, por exemplo, a conclusão de servicenão completará os nomes de arquivos, mesmo que você chame complete -o bashdefault service.

Nesse e em outros casos em que o preenchimento automático inteligente falha, você sempre pode pressionar Alt-/(ou M-/na notação do manual do bash) para concluir os nomes de arquivos quase da mesma maneira que o TAB funciona se a conclusão inteligente estiver desativada (quase da mesma maneira no sentido que M-/não padrões completos como *.txt). Veja aqui as principais sequências para outros tipos de conclusões, como comando e nomes de usuários.

Matthieu
fonte
2
Obrigado pela menção Alt / /, eu não tinha idéia do que estava lá #
Michael Speer
1

a conclusão do bash é uma extensão da conclusão padrão do bash e, por si só, é um programa do bash. Portanto, se você quiser alterar a forma como o programa atua, basta alterá-lo. Este é um software livre, você é livre para fazê-lo. Para o caso específico do tarcomando, o arquivo é /usr/share/bash-completion/completions/tar. Para tarpreencher automaticamente um arquivo com extensão ova, basta adicioná-lo à linha

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

então diz

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Note que este é o caminho e o código existente para o Debian Wheezy (versão estável atual). Uma distribuição ou versão diferente pode ter um código diferente, mas a ideia é a mesma. Abra o código e ajuste-o para fazer o que você deseja.

Edit: Acabei de notar que a pergunta era toda vez que ela não encontra uma correspondência e não apenas o caso específico de adicionar ovaa tar. Talvez ainda possa ser útil para alguém, saber onde eles podem procurar a fonte.

carandraug
fonte
4
A modificação de arquivos em / usr que pertencem ao gerenciador de pacotes é uma boa maneira de induzir um choque desagradável na atualização. Melhor: substitua a configuração empacotada.
31414 Chris Down
1
@ ChrisDown e como você faria isso? Ainda estou procurando a solução .bashrc limpa.
Clayton Stanley