complétion zsh: obtention des noms de fichiers à partir d'un répertoire spécifique

10

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 cpou mvun 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 _filesfonction 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.

Marshall Eubanks
la source

Réponses:

12
_files -W /Volumes

Voir la documentation de _path_files.

Gilles 'SO- arrête d'être méchant'
la source
Parfait! Je savais que cela devait être intégré. Merci beaucoup!
Marshall Eubanks
Alors, comment puis-je l'obtenir pour charger automatiquement cette fonction d'achèvement? J'ai essayé de mettre la compdefligne dans le fichier _ejectsitué 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é.
Marshall Eubanks
@marshaul Vous devez avoir #compdef ejectcomme 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 ~/.zcompdumpet redémarrer zsh.
Gilles 'SO- arrête d'être méchant'
Ah! La suppression a ~/.zcompdumpfait l'affaire. Merci encore!
Marshall Eubanks