Zamiast komentować…
complete -f -X '!*.@(zip|udp)' unzip
należy dodać uzupełnienie dla
-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
Innymi słowy: Uzupełnij pliki i usuń wszystkie nie kończące się na .zip
lub .udp
.
Dodatki
Jeśli dodasz -o default
uzupełnianie, uzupełni / dopasuje wszystkie pliki i katalogi, jeśli nie ma plików kończących się na .zip
lub .udp
.
Jeśli dodasz -o plusdirs
uzupełnienie, dodasz dowolne katalogi oprócz dopasowań plików kończących się na .zip
lub .udp
.
obecny
Po użyciu complete -p unzip
otrzymasz aktualny wzór.
Z twoich komentarzach brzmi prawie identycznie jak brakuje albo +
czy @
w strukturze, jak w:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
co oznaczałoby dopasowanie dowolnego pliku dosłownie kończącego się na.(zip|udp)
. Na przykład
touch 'file_test.(zip|udp)'
Zobacz także tę sekcję instrukcji:
jest to możliwe, np. extglob
nie jest włączone. Włącz przez:
shopt -s extglob
Sprawdź aktualny stan wszystkich shopt
ustawień, wprowadzając:
shopt
Funkcjonować
Jeśli tak -F something
, oznacza to, że używa funkcji o nazwie coś do wygenerowania listy uzupełnień.
_filedir_xspec
Jest zwykle funkcją Debianie. Możesz mieć coś takiego:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Co oznacza /usr/share/bash-completion/bash_completion
pozyskiwać. Tutaj znajdziesz omawianą funkcję . Kilka linii dalej widać, że ta funkcja / uzupełnienie jest dodawana przez funkcję o nazwie _install_xspec
np .:
_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
Wpisy ręczne:
Zaktualizuj komentarze 1:
- Brak zgodności z powodu nieprawidłowych archiwów lub uprawnień do plików.
Nie powinno to wpłynąć na wynik. complete
pasuje tylko do plików określonych przez reguły i nie przetwarza plików. Jeśli możesz je wymienić ls
, powinny się zgadzać.
Na marginesie można dodać taką funkcjonalność za pomocą pełnej funkcji:
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
- kolory. Dlaczego ls
odróżnić test.zip
od test.upd
?
To nie ma wpływu complete
. Kolory według ls
są dostarczane przez $LS_COLORS
. Próbować:
echo "$LS_COLORS" | tr : '\n' | sort
Powinieneś zobaczyć coś takiego, *.zip=01;31
co oznacza:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
z drugiej strony nie ma z nim żadnego wpisu, więc nie ma koloru.
Następny krok (powinien być pierwszy)
- Otwórz terminal i przejdź do katalogu z plikami testowymi. Zarówno .zip, jak i .udp
- Wchodzić
bash --norc
- Wchodzić
complete -f -X '!*.@(zip|udp)' unzip
- Wchodzić
shopt -s extglob
- Wchodzić
unzip <tab><tab>
Wynik?
Ponadto kliknij edytuj poniżej pytania i dodaj wynik:
bind -V
shopt
env
może być pomocny.
complete -p unzip
dajecomplete -f -X '!*.@(zip|udp)' unzip
iunzip <tab>
uzupełnia plik o nazwietest.zip
. Jednak katalog zawiera również plik o nazwie,test.upd
którego nie można znaleźć po uzupełnieniu tabulatoremunzip
. Czy fakt uprawnień do pliku lub zerowa długość pliku może tłumaczyć to dziwne zachowanie?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
…extglob
jest aktywowany. Przykład z „testowaniem” wybierazip
plik tylko ponownie. Zauważam, żetest.zip
jest wyświetlany w kolorze czerwonym, podczas gdytest.upd
w kolorze białymls -l
, oba pliki są puste z tymi samymi uprawnieniami, zmiana właściciela i powiązanie grupy. Dlaczegols
odróżnićtest.zip
odtest.upd
? Może to wskazówka na temat mojego problemu?W pliku
/etc/bash_completion
, który prawdopodobnie gdzieś pozyskujesz, domyślnym uzupełnieniem, przynajmniej dla mojej wersjibash
(v4.2.25), jestSpróbuj zmienić całe wyrażenie na
I dodaj do swojego
.bash_profile
źródło
unzip <tab>
nie znajdzie.zip
ani.upd
plików, ani innych plików.gzip
z.gz
plikami?gunzip
z.gz
plików wybrać pliki tylko kończy się.gz
, ale definicja jest również inna:complete -F _filedir_xspec gunzip
./etc/bash_completion
w Twoim pliku.bashrc
?shopt -s extglob
Spróbuj dodać ten wiersz do swojego .bashrc:
źródło
.udp
pliki, ale tylko wtedy, gdy nie ma żadnych.zip
plików. Jeśli pliktest.zip
atest.udp
znajduje się w bieżącym katalogu,unzip <tab>
wyświetla tylko.zip
plik. Spodziewałbym się zobaczyć oba pliki (tzn. Dałoby to zakończenie bashtest.
).udp
izip
pliki. Czy źródło.bashrc
po dodaniu linii?unzip <tab>
wypisuję wszystkie pliki, nawet te, które kończą się inną frazą. Teraz to, czego potrzebuję.complete -f -o default -X '!*.zip' unzip
icomplete -f -o default -X '!*.udp' unzip
Lepsze użycie
_filedir
zamiast „surowego”complete
.Usprawiedliwienie
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
Ścieżki tilde ( ) są rozwijane/home/tux/Do<TAB><TAB>
listy, którą otrzymujesz w odpowiedzi, usuwa „/ home / tux”, a zatem jest znacznie bardziej kompaktowyMWE
źródło