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.