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 todos que não terminem em .zip ou .udp .
Extras
Se você adicionar -o default completará / combinará todos arquivos e diretórios se houver não arquivos que terminam em .zip ou .udp .
Se você adicionar -o plusdirs completion, todos os diretórios serão adicionados a quaisquer correspondências de arquivos que terminem em .zip ou .udp .
Atual
Quando você usa complete -p unzip , você obtém o padrão atual.
Dos seus comentários, parece que você está perdendo + ou @ no padrão, como em:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
, o que significa que corresponde a qualquer ficheiro que termine em .(zip|udp) . Por exemplo,
touch 'file_test.(zip|udp)'
Veja também esta seção do manual:
é possível, e. extglob não está ativado. Ativar por:
shopt -s extglob
Verifique o status atual de todas as configurações de shopt digitando:
shopt
Função
Se isso for -F something , significa que ele usa uma função chamada algo para gerar a lista de conclusões.
O _filedir_xspec é tipicamente uma função Debian. Você pode ter algo assim:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
O que significa /usr/share/bash-completion/bash_completion ser originado. Aqui você encontrará o 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:
Atualizar para comentários 1:
- Nenhuma correspondência devido a arquivos inválidos ou permissões de arquivo.
Isso não deve afetar o resultado. complete corresponde apenas aos arquivos fornecidos pelas regras e não processa os arquivos. Se você puder listá-los com ls , eles deverão corresponder.
Como uma nota lateral, um poderia adicionar tal 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 distingue test.zip de test.upd ?
Isso não afeta complete . As cores por ls são fornecidas por $LS_COLORS . Experimente:
echo "$LS_COLORS" | tr : '\n' | sort
Você deve ver algo como *.zip=01;31 , o que significa:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp , por outro lado, não possui nenhuma entrada associada a ele, 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. Ambos .zip e .udp
- Insira
bash --norc - Insira
complete -f -X '!*.@(zip|udp)' unzip - Insira
shopt -s extglob - Insira
unzip <tab><tab>
Resultado?
Além disso, clique edite abaixo da sua pergunta e adicione a saída de:
bind -V
shopt
env
pode ser útil.