Em vez de continuar comentando ...
complete -f -X '!*.@(zip|udp)' unzip
deve adicionar conclusão para
-f -X '!*.@(zip|udp)'
| | | |||________|
| | | || |
| | | || +- filterpat: zip or udp
| | | |+------------- @ : Matches one of the given patterns
| | | +-------------- *. : Anything+<dot>
| | +---------------- ! : Negate
| +------------------- -X : Filter out matches in "filterpat"
+---------------------- -f : files
Em outras palavras: complete os arquivos e remova tudo que não termina em .zip
ou .udp
.
Extras
Se você adicionar a -o default
conclusão, completará / corresponderá a todos os arquivos e diretórios, se não houver arquivos terminando em .zip
ou .udp
.
Se você adicionar a -o plusdirs
conclusão, os diretórios serão adicionados, além de correspondências de arquivos que terminam em .zip
ou .udp
.
Atual
Quando você usa, complete -p unzip
obtém o padrão atual.
A partir dos seus comentários, parece que você está perdendo um +
ou mais @
padrões, como em:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
o que significa corresponder a qualquer arquivo que termine literalmente.(zip|udp)
. Por exemplo
touch 'file_test.(zip|udp)'
Veja também esta seção do manual:
é possível, por exemplo, extglob
não está ativado. Ativar por:
shopt -s extglob
Verifique o status atual de todas as shopt
configurações digitando:
shopt
Função
Se é -F something
isso, significa que ele usa uma função chamada algo para gerar a lista de conclusões.
A _filedir_xspec
é tipicamente uma função Debian. Você pode ter algo parecido com isto:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
O que significa /usr/share/bash-completion/bash_completion
obter informações. Aqui você encontrará a função em questão . Algumas linhas abaixo, você vê que esta função / conclusão é adicionada por uma função chamada _install_xspec
por exemplo:
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Entradas manuais:
Atualize para os comentários 1:
- Nenhuma correspondência devido a arquivos ou permissões de arquivos inválidos.
Isso não deve afetar o resultado. complete
corresponde apenas aos arquivos fornecidos pelas regras e não processa os arquivos. Se você pode listá-los ls
, eles devem corresponder.
Como observação lateral, pode-se adicionar essa funcionalidade usando uma função completa:
function _unzip_validated() {
# 1. Generate list of files ending in e.g. .zip and .udp
# 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
- cores. Por que ls
distinguir test.zip
entre test.upd
?
Isso não afeta complete
. As cores ls
são fornecidas por $LS_COLORS
. Experimentar:
echo "$LS_COLORS" | tr : '\n' | sort
Você deve ver algo como o *.zip=01;31
que significa:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
por outro lado, não possui nenhuma entrada associada a ela, portanto, nenhuma coloração.
Próximo passo (deveria ter sido o primeiro)
- Abra o terminal e vá para um diretório com arquivos de teste. .Zip e .udp
- Entrar
bash --norc
- Entrar
complete -f -X '!*.@(zip|udp)' unzip
- Entrar
shopt -s extglob
- Entrar
unzip <tab><tab>
Resultado?
Além disso, clique em editar abaixo da sua pergunta e adicione a saída de:
bind -V
shopt
env
pode ser útil.
complete -p unzip
produzcomplete -f -X '!*.@(zip|udp)' unzip
eunzip <tab>
completa o arquivo nomeadotest.zip
. No entanto, o diretório também contém um arquivotest.upd
que não é encontrado pela conclusão da guiaunzip
. O fato das permissões de arquivo ou o tamanho zero do arquivo talvez explique esse comportamento estranho?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
…extglob
está ativado. O exemplo com 'testing' seleciona ozip
arquivo apenas novamente. Percebo quetest.zip
é mostrado na cor vermelha, enquantotest.upd
é mostrado na cor branca comls -l
, ambos os arquivos estão vazios com as mesmas permissões, shift do proprietário e associação de grupo. Por quels
distinguirtest.zip
entretest.upd
? Talvez esta seja uma dica para o problema que tenho?No arquivo
/etc/bash_completion
que você provavelmente está procurando em algum lugar, a conclusão padrão, pelo menos para a minha versãobash
(v4.2.25), éTente alterar a expressão inteira para
E adicione ao seu
.bash_profile
fonte
unzip <tab>
não encontra.zip
nem.upd
arquivos nem outros arquivos.gzip
com.gz
arquivos?gunzip
com.gz
arquivos somente selecionar os arquivos que terminam em.gz
, mas a definição também é diferente:complete -F _filedir_xspec gunzip
./etc/bash_completion
no seu.bashrc
?shopt -s extglob
Tente adicionar esta linha no seu .bashrc:
fonte
.udp
arquivos, mas apenas se nenhum.zip
arquivo estiver presente. Se um arquivotest.zip
etest.udp
estiver presente no diretório atual,unzip <tab>
apenas liste o.zip
arquivo. Eu esperaria ver os dois arquivos (ou seja, a conclusão do bash dariatest.
).udp
ezip
. Você fonte.bashrc
depois de adicionar a linha?unzip <tab>
listo todos os arquivos, mesmo os que terminam em uma frase diferente. Agora é exatamente o que eu preciso.complete -f -o default -X '!*.zip' unzip
ecomplete -f -o default -X '!*.udp' unzip
Melhor uso em
_filedir
vez de "bruto"complete
.Justificação
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
caminhos til ( ) estão sendo expandidos/home/tux/Do<TAB><TAB>
, a lista que você obtém como resposta remove '/ home / tux' e, portanto, é muito mais compactaMWE
fonte