zakończenie zsh: pobieranie nazw plików z określonego katalogu

10

OK, małe tło: używam komputera Mac i robię tyle, ile to możliwe w interfejsie CLI.

W szczególności często wkładam pamięć USB cplub mvplik, a następnie natychmiast chcę go wysunąć (odmontować i odłączyć). Zwykle można tego dokonać kilkoma naciśnięciami klawiszy, z wyjątkiem odmontowania go, co wymaga (w 10.7) przejścia do pustej przestrzeni pulpitu (zwykle co najmniej dwóch spacji), wybrania dysku i naciśnięcia „Command-e”. Szczerze mówiąc, ta odmontowana procedura jest, o kilka rzędów wielkości, najbardziej czasochłonną i żmudną częścią tego procesu.

O wiele bardziej naturalne i efektywne byłoby po prostu pisanie, powiedz:

ej<tab> J<tab>

Powiedz, że moja pamięć USB montuje się w / Volumes / Jefferson. To, czego spodziewałbym się po moich 6 naciśnięciach klawiszy, to:

eject /Volumes/Jefferson

To powinno uruchomić polecenie:

diskutil unmount /Volumes/Jefferson

Więc napisałem fajną małą funkcję:

eject() {
    diskutil unmount /Volumes/$1
}

I funkcja uzupełniania, aby iść z tym:

compdef '_files -g "/Volumes/*"' eject  

Jest z tym jednak problem. _filesFunkcja wytwarza pełne ścieżki. Teraz mógłbym zmienić linię w mojej funkcji „wysuwania” na diskutil unmount $1, i wszystko by działało, ale wtedy nie mam możliwości wpisania pierwszej litery nazwy punktu podłączenia, ponieważ ścieżka zaczyna się od / Volumes /. Na przykład, jeśli J<tabnapiszę, otrzymam autouzupełnianie plików w PWD. Musiałbym wpisać, /Volumes/J<tab>aby uzyskać pożądane zakończenie.

Czy istnieje funkcja uzupełniania, która pobiera nazwy plików ze wstępnie określonej, określonej lokalizacji, zamiast generować pełne ścieżki?

Naprawdę chciałbym sprowadzić to do 6 naciśnięć klawiszy.

Marshall Eubanks
źródło

Odpowiedzi:

12
_files -W /Volumes

Zobacz dokumentację _path_files.

Gilles „SO- przestań być zły”
źródło
Doskonały! Wiedziałem, że trzeba to wbudować. Dziękuję bardzo!
Marshall Eubanks
Jak mogę uzyskać automatyczne ładowanie tej funkcji uzupełniania? Próbowałem umieścić compdeflinię w pliku _ejectznajdującym się w mojej ścieżce fpath. Próbowałem z linią automatycznego ładowania i bez niej. Przejrzałem kilka przewodników na temat funkcji uzupełniania i nikt nie opisał, jak zrobić naprawdę prosty przykład, taki jak ten, i nic, co próbowałem na podstawie któregokolwiek z ich przykładów nie zadziałało.
Marshall Eubanks
@marshaul Musisz mieć #compdef ejectjako pierwszy wiersz pliku, a następnie prawdziwy kod. Zobacz pod automatycznie ładowanymi plikami w instrukcji. Jeśli nie dodałeś linii na początku, być może będziesz musiał usunąć pamięć podręczną ~/.zcompdumpi zrestartować Zsh.
Gilles „SO- przestań być zły”
AH! Usunięcie ~/.zcompdumppomogło. Dzięki jeszcze raz!
Marshall Eubanks