Problema w / bash conclusão programável de padrões de correspondência de nomes de arquivos

3

Eu tenho um comando simples chamado th . Eu tenho um arquivo de conclusão bash para isso que é o seguinte:

_th()  {
  COMPREPLY=()
  local curr=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -f -X '!*.@(tar|tar.xz|tar.bz2|tar.gz|tbz|tgz)' -- "$curr") )
}                
complete -F _th -o filenames th

Isso funciona como pretendido, na maior parte. Para argumentos para minha função th , a aba BASH completa os arquivos que terminam em .tar ,. tar.xz , etc. Dois problemas:

  1. A correspondência faz distinção entre maiúsculas e minúsculas. Nem todos os arquivos tar possuem extensões em minúsculas. (Usar shopt para definir nocaseglob dentro do arquivo de conclusão do bash não funciona.)

  2. A correspondência engasga com nomes de arquivos com várias palavras, por ex. arquivos com espaços em seus nomes.

    [rsaw:blahb]$ ls
    bam.tgz  boom.TGZ  sad.TAR  spaces in this-file.tbz
    [rsaw:blahb]$ th<tabtab>
    bam.tgz        in             spaces         this-file.tbz  
    [rsaw:blahb]$ th spa<tabtab>
    in             spaces         this-file.tbz  
    [rsaw:blahb]$ th spaces<tabtab>   # At this point I added a backslash and pressed tab until 4 backslashes appeared
    in             spaces         this-file.tbz  
    [rsaw:blahb]$ th spaces\\<tabtab>   # At this point, nothing else happened 
    

Qualquer ajuda apreciada!

    
por rsaw 18.01.2013 / 08:44

2 respostas

1

Não tenho certeza se isso ainda é um problema para você, mas me deparei com algo semelhante ao tentar obter a conclusão do nome do meio da palavra e tenho algumas ideias para possíveis soluções.

Alterar a variável IFS adicionando local IFS=$'\n' corrigiu o problema com espaços em nomes de arquivos para mim, pode valer a pena tentar.

Como para tornar as coisas insensíveis a maiúsculas e minúsculas, você pode forçar $curr a minúsculas para compgen usando ${cur,,} . A função completa ficaria assim depois de ambas as alterações:

_th()  {
  local IFS=$'\n'
  local curr=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -f -X '!*.@(tar|tar.xz|tar.bz2|tar.gz|tbz|tgz)' -- "${curr,,}") )
}                
complete -F _th -o filenames th

Isso tornaria o nome do arquivo inteiro compatível com maiúsculas e minúsculas. Se você quer apenas a extensão de maiúsculas e minúsculas insensível você poderia fazer alguma manipulação de string para $cur para fazer apenas a extensão em minúsculas.

    
por 08.05.2014 / 00:35
-1

Você pode fazer duas coisas com o seu regex em relação à extensão do tipo de arquivo. Você pode adicionar as extensões de maiúsculas e minúsculas diretamente à regex, ou seja, (tar|TAR) ou você pode adicionar a ?i sinalizador para tornar a pesquisa insensível a maiúsculas e minúsculas. Veja isto para um guia: link

Então, com relação à conclusão de várias palavras, aqui está outra resposta: link (Eu pessoalmente uso _ em vez de espaços em todos os meus arquivos por esse motivo)

    
por 20.01.2013 / 01:36