Ignora o preenchimento automático em um único nome de arquivo

5

Normalmente, quando eu passar um nome de arquivo que é o único arquivo lá no diretório atual com preenchimento automático por Tab para o comando chegar antes, em seguida, pressione várias Tab (erroneamente), o mesmo nome de arquivo completo várias vezes e eu deve excluir ou cancelar e comece de novo.

Existe alguma maneira de desabilitar esse comportamento (sem criar outro arquivo ou arquivo oculto)?

ls <Tab>filename <Tab>filename <Tab>filename
    
por αғsнιη 16.09.2018 / 07:29

1 resposta

3

Uma solução é usar a opção nospace para o complete construído .

Primeiro, você precisa saber como a conclusão está definida para ls

$ complete -p ls
complete -F _longopt ls

Então você modifica adicionando -o nospace

$ complete -o nospace -F _longopt ls

Assim, mesmo se você pressionar Tab ↹ várias vezes, não haverá correspondência e nenhum argumento será adicionado à linha de comando.

Efeito colateral : você precisa adicionar manualmente um espaço no final da linha se quiser adicionar outro argumento a ls .

Para evitar esse efeito colateral, você pode modificar a função _longopt de uma maneira que impeça a correspondência do mesmo argumento duas vezes (pode não ser fácil).

Como aplicar isso a outros comandos e torná-lo permanente

Anexar um espaço à direita após uma correspondência é o comportamento padrão. Não sei se existe uma maneira diferente de usar -o nospace ao especificar regras de conclusão com complete .

Além disso, tenha em mente que as regras de conclusão são especificadas em algum lugar, mesmo para comandos incorporados (no meu laptop nesta pasta: /usr/share/bash-completion ). Se você olhar o arquivo /usr/share/bash-completion/bash-completion , verá onde as conclusões estão definidas para ls :

complete -F _longopt a2ps awk base64 bash bc bison cat chroot colordiff cp \
  csplit cut date df diff dir du enscript env expand fmt fold gperf \
  grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
  mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
  sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
  texindex touch tr uname unexpand uniq units vdir wc who

Você vê que as mesmas regras se aplicam a um monte de comandos diferentes (como cp , mv , rm ...), portanto, se você modificar isso adicionando -o nospace , a alteração será afeta ls e todos os outros comandos.

Se não se sentir confortável com a modificação de configurações globais (você precisará de privilégios de root), você pode escrevê-las para ~/.bash_completion (criar este arquivo, se não presente), como este

complete -F _longopt -o nospace a2ps awk base64 bash bc bison cat chroot colordiff cp \
  csplit cut date df diff dir du enscript env expand fmt fold gperf \
  grep grub head irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
  mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir \
  sed seq sha{,1,224,256,384,512}sum shar sort split strip sum tac tail tee \
  texindex touch tr uname unexpand uniq units vdir wc who

Se você deseja modificar conclusões para outros comandos não listados aqui, procure por eles em /usr/share/bash-completion/bash-completion file ou /usr/share/bash-completion/completions folder.

    
por 09.10.2018 / 10:17