OK, un peu de fond: j'utilise un Mac, et j'en fais autant que possible dans la CLI.
En particulier, j'introduis fréquemment une clé USB cp
ou mv
un fichier, puis je souhaite immédiatement l'éjecter (démonter et déconnecter). Cela peut généralement être accompli en une poignée de touches, sauf pour le démonter, ce qui nécessite (en 10.7) d'aller sur un espace de bureau vide (généralement deux espaces au moins), de sélectionner le disque et d'appuyer sur "commande-e". Franchement, cette procédure de démontage est, par plusieurs ordres de grandeur, la partie la plus longue et la plus fastidieuse du processus.
Il serait beaucoup plus naturel et efficace de pouvoir simplement taper, par exemple:
ej<tab> J<tab>
Dites que ma clé USB se monte sur / Volumes / Jefferson. Ce que je m'attendrais à obtenir de mes 6 touches est le suivant:
eject /Volumes/Jefferson
Cela devrait exécuter la commande:
diskutil unmount /Volumes/Jefferson
J'ai donc écrit une jolie petite fonction:
eject() {
diskutil unmount /Volumes/$1
}
Et une fonction d'achèvement pour l'accompagner:
compdef '_files -g "/Volumes/*"' eject
Il y a cependant un problème avec cela. La _files
fonction génère des chemins complets. Maintenant, je pourrais changer la ligne de ma fonction "éjecter" en diskutil unmount $1
, et les choses fonctionneraient, mais je n'ai plus la possibilité de taper la première lettre du nom du point de montage, car le chemin commence par / Volumes /. Par exemple, si je tape J<tab
, j'obtiendra la saisie semi-automatique pour les fichiers dans le PWD. Je devrais taper /Volumes/J<tab>
pour obtenir l'achèvement souhaité.
Alors, existe-t-il une fonction d'achèvement qui récupère les noms de fichiers à partir d'un emplacement prédéfini et spécifique, plutôt que de générer des chemins complets?
J'aimerais vraiment ramener cela à 6 frappes.
la source
compdef
ligne dans le fichier_eject
situé dans mon fpath. Je l'ai essayé avec et sans ligne de chargement automatique. J'ai regardé plusieurs guides sur les fonctions de complétion et personne n'a couvert comment faire un exemple vraiment simple comme celui-ci, et rien de ce que j'ai essayé sur la base de l'un de leurs exemples n'a fonctionné.#compdef eject
comme première ligne du fichier, puis le vrai code. Voir sous les fichiers chargés automatiquement dans le manuel. Si vous n'avez pas ajouté la ligne au début, vous devrez peut-être supprimer le cache~/.zcompdump
et redémarrer zsh.~/.zcompdump
fait l'affaire. Merci encore!