Invece di continuare a commentare ...
complete -f -X '!*.@(zip|udp)' unzip
dovrebbe aggiungere il completamento per
-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
In altre parole: completa i file e rimuovi tutto ciò che non termina in .zip
o .udp
.
extra
Se si aggiunge -o default
il completamento completerà / abbinare tutti i file e le directory se non v'è alcun file che terminano in .zip
o .udp
.
Se si aggiunge il -o plusdirs
completamento, verranno aggiunte eventuali directory oltre a tutte le corrispondenze di file che terminano con .zip
o .udp
.
attuale
Quando si utilizza complete -p unzip
si ottiene il modello corrente.
Dai tuoi commenti sembra principalmente che ti manchi +
o @
in uno schema, come in:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
il che significherebbe abbinare qualsiasi file che termina letteralmente in.(zip|udp)
. Per esempio
touch 'file_test.(zip|udp)'
Dai anche un'occhiata a questa sezione del manuale:
è possibile ad es. extglob
non è abilitato. Abilita da:
shopt -s extglob
Controlla lo stato corrente di tutte le shopt
impostazioni inserendo:
shopt
Funzione
In tal caso -F something
significa che utilizza una funzione denominata qualcosa per generare l'elenco di completamenti.
In _filedir_xspec
genere è una funzione Debian. Potresti avere qualcosa del genere:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Il che significa /usr/share/bash-completion/bash_completion
procurarsi. Qui troverai la funzione in questione . Alcune righe più in basso si vede che questa funzione / completamento è aggiunta da una funzione chiamata _install_xspec
ad es .:
_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
Inserimenti manuali:
Aggiornamento ai commenti 1:
- Nessuna corrispondenza a causa di archivi o autorizzazioni di file non validi.
Ciò non dovrebbe influire sul risultato. complete
corrisponde solo ai file forniti dalle regole e non esegue l'elaborazione dei file. Se riesci a elencarli con ls
, dovrebbero corrispondere.
Come nota a margine, si potrebbe aggiungere tale funzionalità utilizzando una funzione 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
- Colori. Perché si ls
distingue test.zip
da test.upd
?
Questo non influisce complete
. I colori ls
sono forniti da $LS_COLORS
. Provare:
echo "$LS_COLORS" | tr : '\n' | sort
Dovresti vedere qualcosa del genere *.zip=01;31
che significa:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
d'altra parte non ha alcuna voce associata, quindi nessuna colorazione.
Passaggio successivo (avrebbe dovuto essere il primo)
- Apri il terminale e vai a una directory con i file di test. Sia .zip che .udp
- accedere
bash --norc
- accedere
complete -f -X '!*.@(zip|udp)' unzip
- accedere
shopt -s extglob
- accedere
unzip <tab><tab>
Risultato?
Inoltre, fai clic su modifica sotto la domanda e aggiungi l'output di:
bind -V
shopt
env
potrebbe essere utile.
complete -p unzip
producecomplete -f -X '!*.@(zip|udp)' unzip
eunzip <tab>
completa il file denominatotest.zip
. Tuttavia, la directory contiene anche un file denominatotest.upd
che non si trova al completamento della scheda diunzip
. Il fatto di autorizzazioni per file o una lunghezza zero del file può forse spiegare questo strano comportamento?