Anstatt weiter zu kommentieren ...
complete -f -X '!*.@(zip|udp)' unzip
sollte die Vervollständigung für hinzufügen
-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
Mit anderen Worten: Vervollständigen Sie Dateien und entfernen Sie alle Dateien, die nicht auf .zip
oder enden .udp
.
Extras
Wenn Sie die -o default
Vervollständigung hinzufügen, werden alle Dateien und Verzeichnisse vervollständigt / abgeglichen, wenn keine Dateien mit .zip
oder enden .udp
.
Wenn Sie die -o plusdirs
Vervollständigung hinzufügen, werden zusätzlich zu den Übereinstimmungen der Dateien, die mit .zip
oder enden, Verzeichnisse hinzugefügt .udp
.
Aktuell
Wenn Sie verwenden, erhalten complete -p unzip
Sie das aktuelle Muster.
In Ihren Kommentaren klingt es meistens so , als ob Sie entweder +
oder @
im Muster fehlen , wie in:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
was bedeuten würde, dass jede Datei übereinstimmt, die buchstäblich auf endet.(zip|udp)
. Z.B
touch 'file_test.(zip|udp)'
Schauen Sie sich auch diesen Abschnitt des Handbuchs an:
es ist möglich, zB extglob
ist nicht aktiviert. Aktivieren durch:
shopt -s extglob
Überprüfen Sie den aktuellen Status aller shopt
Einstellungen, indem Sie Folgendes eingeben:
shopt
Funktion
Wenn -F something
dies der Fall ist, wird eine Funktion mit dem Namen " etwas" verwendet , um die Liste der Vervollständigungen zu generieren.
Dies _filedir_xspec
ist normalerweise eine Debian-Funktion. Sie könnten so etwas haben:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Was bedeutet /usr/share/bash-completion/bash_completion
, beschafft zu werden. Hier finden Sie die betreffende Funktion . Ein paar Zeilen weiter unten sehen Sie, dass diese Funktion / Vervollständigung durch eine Funktion hinzugefügt wird, die _install_xspec
z.
_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
Manuelle Eingaben:
Update auf Kommentare 1:
- Keine Übereinstimmung aufgrund ungültiger Archive oder Dateiberechtigungen.
Dies sollte das Ergebnis nicht beeinflussen. complete
Stimmt nur mit den durch die Regeln angegebenen Dateien überein und verarbeitet die Dateien nicht. Wenn Sie sie auflisten können ls
, sollten sie übereinstimmen.
Als Randnotiz könnte man eine solche Funktionalität hinzufügen, indem man eine vollständige Funktion verwendet:
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
- Farben. Warum ls
unterscheidet sich test.zip
von test.upd
?
Dies hat keinen Einfluss complete
. Farben von ls
werden bereitgestellt von $LS_COLORS
. Versuchen:
echo "$LS_COLORS" | tr : '\n' | sort
Sie sollten so etwas sehen, *.zip=01;31
was bedeutet:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
Auf der anderen Seite ist kein Eintrag damit verbunden, also keine Färbung.
Nächster Schritt (hätte zuerst sein sollen)
- Öffnen Sie das Terminal und wechseln Sie in ein Verzeichnis mit Testdateien. Sowohl .zip als auch .udp
- Eingeben
bash --norc
- Eingeben
complete -f -X '!*.@(zip|udp)' unzip
- Eingeben
shopt -s extglob
- Eingeben
unzip <tab><tab>
Ergebnis?
Klicken Sie außerdem unter Ihrer Frage auf Bearbeiten und fügen Sie die Ausgabe von:
bind -V
shopt
env
könnte hilfreich sein.
complete -p unzip
ergibtcomplete -f -X '!*.@(zip|udp)' unzip
undunzip <tab>
vervollständigt die genannte Dateitest.zip
. Das Verzeichnis enthält jedoch auch eine Datei mit dem Namen,test.upd
die beim Ausfüllen der Registerkarte von nicht gefunden wirdunzip
. Erklären die Tatsache von Dateiberechtigungen oder eine Länge der Datei von Null möglicherweise dieses seltsame Verhalten?~/bin/testing
, 2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
…extglob
ist aktiviert. Im Beispiel mit 'Testen' wird diezip
Datei nur erneut ausgewählt. Ich stelle fest, dasstest.zip
dies in roter Farbe angezeigt wird, währendtest.upd
es in weißer Farbe angezeigt wirdls -l
, wobei beide Dateien mit denselben Berechtigungen, Eigentümerverschiebung und Gruppenzuordnung leer sind. Warumls
unterscheidet sichtest.zip
vontest.upd
? Vielleicht ist dies ein Hinweis auf das Problem, das ich habe?In der Datei
/etc/bash_completion
, die Sie vermutlich irgendwo beziehen, ist die Standardvervollständigung, zumindest für meine Version vonbash
(v4.2.25)Versuchen Sie, den gesamten Ausdruck in zu ändern
Und füge zu deinem hinzu
.bash_profile
quelle
unzip <tab>
weder Funde.zip
noch.upd
Dateien noch andere Dateien.gzip
mit.gz
Dateien?gunzip
mit.gz
Dateien wählen Sie nur Dateien aus, die auf enden.gz
, aber die Definition ist auch anders :complete -F _filedir_xspec gunzip
./etc/bash_completion
in Ihre.bashrc
?shopt -s extglob
Versuchen Sie, diese Zeile in Ihre .bashrc einzufügen:
quelle
.udp
Dateien finden werde , aber nur, wenn keine.zip
Dateien vorhanden sind. Wenn einetest.zip
undtest.udp
-Datei im aktuellen Verzeichnis vorhanden ist, wirdunzip <tab>
nur die.zip
Datei aufgelistet . Ich würde erwarten, beide Dateien zu sehen (dh die Bash-Vervollständigung würde gebentest.
).udp
als auchzip
Dateien. Haben Sie.bashrc
nach dem Hinzufügen der Zeile Quelle ?unzip <tab>
liste jetzt alle Dateien auf, auch diejenigen, die mit einer anderen Phrase enden. Jetzt ganz was ich brauche.complete -f -o default -X '!*.zip' unzip
undcomplete -f -o default -X '!*.udp' unzip
Besser verwenden
_filedir
als "roh"complete
.Rechtfertigung
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
) Pfade werden erweitert/home/tux/Do<TAB><TAB>
die Liste, die Sie als Antwort erhalten, wird '/ home / tux' entfernt und ist daher viel kompakterMWE
quelle