zsh-Vervollständigung: Abrufen von Dateinamen aus einem bestimmten Verzeichnis

10

OK, ein kleiner Hintergrund: Ich benutze einen Mac und mache so viel wie möglich in der CLI.

Insbesondere stecke ich häufig einen USB-Stick cpoder mveine Datei darüber und möchte sie dann sofort auswerfen (aushängen und trennen). Dies kann normalerweise mit wenigen Tastenanschlägen erreicht werden, mit Ausnahme des Aushängens, bei dem (in 10.7) ein leerer Desktop-Speicherplatz (normalerweise mindestens zwei Speicherplätze entfernt) aufgerufen, die Festplatte ausgewählt und "Befehl-e" gedrückt werden muss. Ehrlich gesagt ist dieses Unmount-Verfahren um mehrere Größenordnungen der zeitaufwändigste und langwierigste Teil des Prozesses.

Es wäre viel natürlicher und effizienter, einfach tippen zu können, sagen wir:

ej<tab> J<tab>

Sagen wir, mein USB-Stick wird bei / Volumes / Jefferson montiert. Was ich von meinen 6 Tastenanschlägen erwarten würde, ist Folgendes:

eject /Volumes/Jefferson

Dies sollte den Befehl ausführen:

diskutil unmount /Volumes/Jefferson

Also habe ich eine nette kleine Funktion geschrieben:

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

Und dazu eine Vervollständigungsfunktion:

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

Es gibt jedoch ein Problem damit. Die _filesFunktion generiert vollständige Pfade. Jetzt könnte ich die Zeile in meiner "Auswurf" -Funktion in ändern diskutil unmount $1, und die Dinge würden funktionieren, aber dann kann ich den ersten Buchstaben des Mountpunktnamens nicht eingeben, da der Pfad mit / Volumes / beginnt. Wenn ich zum Beispiel tippe J<tab, erhalte ich eine automatische Vervollständigung für die Dateien in der PWD. Ich müsste tippen /Volumes/J<tab>, um die gewünschte Vervollständigung zu erhalten.

Gibt es also eine Vervollständigungsfunktion, die Dateinamen von einem vordefinierten, bestimmten Speicherort abruft, anstatt vollständige Pfade zu generieren?

Ich würde das wirklich gerne auf 6 Tastenanschläge reduzieren.

Marshall Eubanks
quelle

Antworten:

12
_files -W /Volumes

Siehe die Dokumentation von _path_files.

Gilles 'SO - hör auf böse zu sein'
quelle
Perfekt! Ich wusste, dass das eingebaut werden musste. Vielen Dank!
Marshall Eubanks
Wie kann ich diese Abschlussfunktion automatisch laden? Ich habe versucht, die compdefZeile in die Datei _ejectin meinem Pfad einzufügen. Ich habe es mit und ohne Autoload-Leitung versucht. Ich habe mir mehrere Anleitungen zu Abschlussfunktionen angesehen, und niemand hat erläutert, wie man ein wirklich einfaches Beispiel wie dieses erstellt, und nichts, was ich anhand eines ihrer Beispiele ausprobiert habe, hat funktioniert.
Marshall Eubanks
@ Marshaul Sie müssen #compdef ejectals erste Zeile der Datei den echten Code haben. Siehe unter automatisch geladene Dateien im Handbuch. Wenn Sie die Zeile zuerst nicht hinzugefügt haben, müssen Sie möglicherweise den Cache löschen ~/.zcompdumpund zsh neu starten.
Gilles 'SO - hör auf böse zu sein'
AH! Das Löschen ~/.zcompdumphat es geschafft. Danke noch einmal!
Marshall Eubanks