Jak mogę ulepszyć system kompletacji zsh, aby w niektórych okolicznościach uzupełniać „fałszywe” pliki?
Dokładniej, system plików AVFS udostępnia archiwa jako katalogi, tworząc „fałszywy katalog” obok każdego archiwum. Domyślnie replikuje całą hierarchię katalogów pod punktem montowania ~/.avfs
. Ponadto pod ~/.avfs
każdym plikiem archiwum, takim jak /tmp/foo.zip
sam plik archiwum ~/.avfs/tmp/foo.zip
, znajduje się katalog o nazwie, ~/.avfs/tmp/foo.zip#
który ujawnia zawartość archiwum. Jednak ten dodatkowy katalog nie pojawia się na liście ~/.avfs/tmp
: istnieje tylko na wyraźne żądanie. (Jest to podobne do działania niektórych automounterów.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Kiedy wpisuję polecenie takie jak powyższe, foo.zip#
nie pojawia się jako uzupełnienie pod ~/.avfs/tmp/
, ponieważ nie ma takiego katalogu. Jak mogę powiedzieć zsh, że ilekroć jest plik, którego pełna ścieżka jest $arc
zgodna ~/.avfs/**/*.(tgz|zip)
¹, powinien udawać, że istnieje katalog o nazwie ${arc}#
?
(Zauważ, że chcę, aby zakończenie działało z każdym wywołaniem _files
lub _dirs
nie tylko dla cd
polecenia. Wolę nie kopiować kodu _files
funkcji, jeśli to możliwe.)
¹ i wszystkie pozostałe rozszerzenia
źródło
/path/to/foo
jest widoczny jako~/.avfs/path/to/foo
.avfs
. Jeśli przedstawiłby domyślną#
pozycję katalogu dla dowolnych plików, które pasowałyby do obsługiwanych przez nią łańcuchów, a nawet magicznie przetestował pliki w katalogu pod kątem tego, co wymagało posiadania#
pozycji, wówczas zakończenie byłoby po prostu działać. Wydaje mi się, że byłby to hit wydajnościowy dla czegoś takiego,find
jak gdyby teraz przeszukiwał skompresowane pliki.Odpowiedzi:
Fałszywa odpowiedź wydaje się niewystarczająca na to fałszywe pytanie; wbudowana obsługa zsh dla katalogów automount działa na katalogach (
fake-files dir:names
), a nie na wzorcach plików w nich zawartych. Jest to przydatne, aby dodać konkretnych nazwach plików do katalogu, który może spełnićautomount
lubsshfs
czy NetApp.snapshot
typu konfiguracje gdzie katalog-być montowane jest znaną nazwę statycznychALAS
.zshall(1)
mówi, że „nazwy” są łańcuchami, a eksperymenty wskazują metaznaki (np.#
lub\#
lub'*(e:"echo hi":)'
) „nie działają” na różne sposoby, więc nie wiem, jak wślizgnąć glob do części nazwy wfake-files
instrukcji. (PrzejrzenieSrc/Zle/computil.c
może ujawnić dokładnie, jakie mogą być nazwy, ale byłoby to więcej pracy.) (Również użycie globów rekurencyjnych w pozycji katalogu do nazw plików archiwów nie latało, ale ponownie zajmie C nurkowanie, aby zobaczyć, ilefake-files
pozwala uciekasz.)Za pomocą
compdef
można wyświetlić listę.avfs
uzupełnień katalogu:Tyle że to się nie powiedzie, ponieważ pokaże
#
pliki tylko wtedy, gdy nie ma to znaczenia, a zatem nie można ich uzupełnić. (Dla tego formularza istnieją produktywne zastosowania, ale nie w tym przypadku).Korzystanie
zstyle
przybliża Cię do następujących czynności.zshrc
:Można go jednak uzupełnić tylko do
\#/
bitu (w debian squeeze virt z domyślną konfiguracją avfs), ale nie do wirtualnego systemu plików dla archiwum, więc dodatkowe prace będą konieczne, aby tabulowanie przejść do archiwów. Zgaduję za pomocą_call_program ... ls
lub coś w tym rodzaju dla uzupełnień\#
, chyba że istnieje bardziej elegancki sposób, abyzsh
przekonać się, że nie istnieją katalogi, które nie istnieją.Złe wieści! Ukończenie nie
_path_files
przebije fałszywych katalogów; Podejrzewam, że jest to związane z globowaniem zsh. Zarówno 4. zsh 4. coś włączone, jak i zsh 5.0.8 wykazują problem. Podejrzewam więc, że pełna poprawka wymagałaby łat_path_files
lub napisać coś innego, co w przeciwnym razie uzupełniałoby te fałszywe katalogi. Śledzenie zakończenia debugowania można wygenerować, wpisując,ls /root/.avfs/root/sometar.gz\#/
a następnie na końcu tego wpisywania,control-x
a następnie?
, zakładając,bindkey -e
że_complete_debug
jest to związane ze wspomnianym keycombo, jeśli ktoś chce dowiedzieć się, dlaczego tak się nie dzieje.źródło
W zsh możesz użyć
compctl -K
do zarejestrowania własnej funkcji do opcji zakończenia generowania. Na przykład:Następnie musisz zdefiniować własną funkcję:
Oczywiście powyższe wymaga trochę więcej pracy, ale na początek jest coś.
Podobną (ale inną) niestandardową funkcję uzupełniania można zarejestrować dla bash.
Oto przykład z implementacjami bash i zsh . (Oferuje uzupełnianie opcji wiersza poleceń poprzez pobranie opcji ze strony man polecenia).
A oto kilka szybkich domysłów na temat rzeczy, które mogą działać w twojej funkcji uzupełniania:
A może to:
Powodzenia!
źródło
compctl
, tzn. Chcę zmienić to, co_files
robi. Twoja odpowiedź w ogóle nie jest pomocna.