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 cp
oder mv
eine 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 _files
Funktion 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.
quelle
compdef
Zeile in die Datei_eject
in 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.#compdef eject
als 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~/.zcompdump
und zsh neu starten.~/.zcompdump
hat es geschafft. Danke noch einmal!