Au lieu de continuer à commenter…
complete -f -X '!*.@(zip|udp)' unzip
devrait ajouter l'achèvement pour
-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
En d'autres termes: complétez les fichiers et supprimez tous ceux qui ne se terminent pas par .zip
ou .udp
.
Suppléments
Si vous ajoutez la -o default
complétion, tous les fichiers et répertoires seront complétés / correspondront s'il n'y a aucun fichier se terminant par .zip
ou .udp
.
Si vous ajoutez -o plusdirs
achèvement, vous ajouterez des répertoires en plus des correspondances de fichiers se terminant par .zip
ou .udp
.
Courant
Lorsque vous utilisez, complete -p unzip
vous obtenez le modèle actuel.
De vos commentaires il semble surtout que vous manquez soit +
ou @
dans le modèle, comme dans:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
ce qui signifierait correspondre à n'importe quel fichier se terminant littéralement par.(zip|udp)
. Par exemple
touch 'file_test.(zip|udp)'
Jetez également un œil à cette section du manuel:
il est possible par exemple extglob
n'est pas activé. Activer par:
shopt -s extglob
Vérifiez l'état actuel de tous les shopt
paramètres en entrant:
shopt
Fonction
Si c'est le cas, -F something
cela signifie qu'il utilise une fonction nommée quelque chose pour générer la liste des achèvements.
Il _filedir_xspec
s'agit généralement d'une fonction Debian. Vous pourriez avoir quelque chose comme ça:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Ce qui signifie /usr/share/bash-completion/bash_completion
se sourcer. Vous trouverez ici la fonction en question . Quelques lignes plus loin, vous voyez que cette fonction / complétion est ajoutée par une fonction nommée _install_xspec
par exemple:
_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
Entrées manuelles:
Mise à jour des commentaires 1:
- Aucune correspondance en raison d'archives non valides ou d'autorisations de fichiers.
Cela ne devrait pas affecter le résultat. complete
ne correspond qu'aux fichiers fournis par les règles et ne fait aucun traitement des fichiers. Si vous pouvez les répertorier ls
, ils doivent correspondre.
En remarque, on pourrait ajouter une telle fonctionnalité en utilisant une fonction complète:
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
- Couleurs. Pourquoi ne ls
distinguer test.zip
de test.upd
?
Cela n'affecte pas complete
. Les couleurs ls
sont fournies par $LS_COLORS
. Essayer:
echo "$LS_COLORS" | tr : '\n' | sort
Vous devriez voir quelque chose comme *.zip=01;31
ce qui signifie:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
d'autre part n'a pas d'entrée associée, donc pas de coloration.
Étape suivante (aurait dû être la première)
- Ouvrez le terminal et accédez à un répertoire contenant des fichiers de test. .Zip et .udp
- Entrer
bash --norc
- Entrer
complete -f -X '!*.@(zip|udp)' unzip
- Entrer
shopt -s extglob
- Entrer
unzip <tab><tab>
Résultat?
Cliquez également sur modifier sous votre question et ajoutez la sortie de:
bind -V
shopt
env
pourrait être utile.
complete -p unzip
donnecomplete -f -X '!*.@(zip|udp)' unzip
etunzip <tab>
complète le fichier nommétest.zip
. Cependant, le répertoire contient également un fichier nommétest.upd
qui n'est pas trouvé par la complétion de l'onglet deunzip
. Le fait d'autorisations de fichier ou d'une longueur nulle du fichier peut-il expliquer ce comportement étrange?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
…extglob
est activé. L'exemple avec «testing» ne sélectionne à nouveau lezip
fichier. Je remarque que celatest.zip
est indiqué en rouge, tandis quetest.upd
est affiché en blanc avecls -l
, les deux fichiers vides avec les mêmes autorisations, le changement de propriétaire et l'association de groupe. Pourquoi nels
distinguertest.zip
detest.upd
? C'est peut-être un indice du problème que j'ai?Dans le fichier
/etc/bash_completion
que vous recherchez probablement quelque part, l'achèvement par défaut, au moins pour ma version debash
(v4.2.25) estEssayez de changer l'expression entière en
Et ajoutez à votre
.bash_profile
la source
unzip <tab>
ne trouve.zip
ni.upd
fichiers ni autres fichiers.gzip
avec des.gz
fichiers?gunzip
des.gz
fichiers de sélectionner des fichiers se terminant seulement.gz
, mais la définition est également différente:complete -F _filedir_xspec gunzip
./etc/bash_completion
dans votre.bashrc
?shopt -s extglob
Essayez d'ajouter cette ligne dans votre .bashrc:
la source
.udp
fichiers, mais uniquement si aucun.zip
fichier n'est présent. Si un fichiertest.zip
ettest.udp
est présent dans le répertoire en cours,unzip <tab>
répertorie uniquement le.zip
fichier. Je m'attendrais à voir les deux fichiers (c'est-à-dire que l'achèvement de bash donneraittest.
).udp
etzip
. Avez-vous source.bashrc
après avoir ajouté la ligne?unzip <tab>
liste maintenant tous les fichiers, même ceux se terminant par une phrase différente. Maintenant tout à fait ce dont j'ai besoin.complete -f -o default -X '!*.zip' unzip
etcomplete -f -o default -X '!*.udp' unzip
Une meilleure utilisation
_filedir
au lieu de "brut"complete
.Justification
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
chemins tilde ( ) sont développés/home/tux/Do<TAB><TAB>
, la liste que vous obtenez en réponse supprime «/ home / tux» et est donc beaucoup plus compacteMWE
la source