Como impedir que o bash autocomplete o ponto final?

5

Digamos que eu tenha um nome de arquivo e extensões diferentes:

test.tex
test.pdf

É mais fácil digitar apenas o nome do arquivo sem extensão, então o nome do arquivo inteiro. Isso é possível, porque o programa correspondente conhece a extensão de que precisa e a anexa automaticamente. Os exemplos a seguir funcionam perfeitamente:

tex test
pdf-viewer test

Mas usar o bash completion aqui constantemente me irrita adicionando o ponto final. Por exemplo:

tex te<TAB>

é transformado em

tex test.

Mas o aplicativo falhará com erro; Eu tenho que bater backspace cada vez depois que eu bati <TAB> : - (

Como dizer ao bash para não adicionar um ponto final ao fazer autocompletar?

    
por Igor Liferenko 10.02.2017 / 03:29

2 respostas

2

Pode haver uma maneira mais fácil, mas isso parece funcionar:

texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }

complete -F texfiles tex

Isso primeiro configura uma função de shell chamada texfiles . Ele usa o segundo argumento de linha de comando ( $2 , a palavra digitada pelo usuário na linha de comando antes de pressionar Tab para completar a palavra) e preenche a matriz COMPREPLY com todos os nomes correspondentes "$2"*.tex .

Para cada um desses nomes, o sufixo .tex é removido antes de ser adicionado ao array.

O comando complete é então usado para dizer ao shell para executar a função texfiles para a conclusão do nome do arquivo para o comando tex especificamente . Você pode repetir o mesmo comando complete para todos os comandos que devem concluir .tex arquivos da mesma maneira. Para pdf-viewer você pode querer criar uma função pdffiles correspondente (os nomes dessas funções são arbitrários).

Isto está em ação ( <tab> significa que estou pressionando a tecla Tab ):

bash-4.4$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Sep 28 21:43 README.txt
-rw-r--r--  1 kk  wheel  0 Sep 28 21:12 file.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:24 file2.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:25 hello.tex

bash-4.4$ tex <tab><tab>
file   file2  hello
bash-4.4$ tex

bash-4.4$ tex f<tab>ile<tab><tab>
file   file2
bash-4.4$ tex file

(o ile em file é inserido pelo shell)

Leia a seção "Conclusão programável" do manual bash para os detalhes sangrentos.

    
por 28.09.2017 / 21:45
1

Adicione uma especificação de conclusão personalizada para o comando tex ao seu .bashrc . Depois de especificar que tex deve usar a conclusão do nome do arquivo, você pode adicionar um filtro para remover qualquer argumento que não corresponda a *.tex das conclusões possíveis.

complete -f -X '!*.tex'

Agora, se você tivesse test.tex , test.aux e test.pdf em seu diretório, um prefixo de test seria somente concluído em test.tex . Isso completa o nome completo do arquivo desejado, em vez de ignorar o . para criar o atalho.

    
por 28.09.2017 / 22:40