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?