achèvement de zsh pour tous les exécutables dans le chemin

0

J'ai écrit un script qui prend lui-même pour argument un exécutable quelconque dans mon $ PATH. Existe-t-il un moyen de créer une fonction de complétion zsh (ou bash) telle que je puisse taper myFunc to[Tab] et il compléterait à myFunc top par exemple? Il serait préférable de ne sélectionner que les fichiers dotés d'autorisations exécutables, mais il serait plus qu'utile d'avoir n'importe quel fichier dans $ PATH!

Je ne peux pas imaginer que le système aurait de l'importance, mais cela fonctionnerait sous Linux, BSD et Mac.

Merci!

ebrious
la source

Réponses:

2

zsh a une fonction d'achèvement pour les commandes PATH nommé _path_commands. Vous pouvez configurer l'achèvement pour l'utiliser pour myFunc en exécutant:

compdef _path_commands myFunc

Remarque: cela nécessite que le système d'achèvement zsh être initialisé. Habituellement (tel que mis en place par compinstall ) cela se passe dans votre ~/.zshrc avec

# some zstyle configurations

autoload -Uz compinit
compinit

Tous les appels à compdef doit être fait après compinit. Si vous obtenez des erreurs "commande introuvable" lors de l'exécution compdef, Je suggère de mettre en place le système de complétion avec compinstall.

Remarque: Pour des raisons de sécurité, zsh émettra des erreurs si l'un des répertoires de votre $ path est accessible en écriture. Si vous recevez l'erreur:

zsh compinit: répertoires non sécurisés, exécutez compaudit pour list. Ignorer   Répertoires non sécurisés et continuer [y] ou abandonner compinit [n]?

Ne frappez pas simplement y, mais frappez n puis essayez compaudit | xargs chmod g-w comme suggéré à https://stackoverflow.com/questions/13762280/zsh-compinit-insecure-directories

Adaephon
la source
Génial! Je vous remercie! Cela a fonctionné parfaitement. J'ai également vu que certaines personnes utilisent un répertoire "achèvement" pour stocker diverses heuristiques d'achèvement. Est-ce compatible avec ce paradigme? Si des compléments plus complexes devaient être ajoutés, sont-ils généralement exclus du .zshrc? Merci encore!
ebrious
J'ai supprimé la balise de réponse acceptée car, sur Linux (mais assez curieusement, pas sur Mac), essayer de terminer une fonction autre que myFunc entraîne l'erreur "_complete: 96: expression mathématique incorrecte: opérande attendu à ''". ls [Tab] donnera cette erreur
ebrious
J'ai testé cela sous Linux. Ubuntu 14.04 avec zsh 5.0.5, Arch Linux avec zsh 5.0.6 et maintenant même TomateUSB avec zsh 4.3.17 (autre firmware du routeur avec ddwrt optware de nslu2). Avec ma propre configuration ainsi que sans configuration ( zsh -f ). Cela a bien fonctionné dans tous les cas sans casser d'autres compléments. Puis-je suggérer que quelque chose ne va pas avec zsh sur votre machine Linux, soit dans la configuration, soit dans le paquet installé. Est-ce que tout fonctionne sur votre Linux, si vous laissez juste de côté compdef _path_commands myFunc?
Adaephon
Je vais réaccepter votre réponse car j'ai trouvé les changements nécessaires pour la faire fonctionner. Ma configuration zsh particulière comportait des répertoires dans le chemin fpath dotés d'une autorisation d'écriture, ce qui entraînait l'erreur suivante: "zsh compinit: répertoires non sécurisés, exécutez compaudit pour liste. Ignorer les répertoires non sécurisés et continuer [y] ou abandonner compinit [n]?" Si vous appuyez simplement sur «y», le problème que j'ai rencontré avec votre réponse a été résolu. Lancer "compaudit | xargs chmod g-w" comme suggéré par stackoverflow.com/questions/13762280/solved le problème. Puis-je suggérer de modifier votre réponse pour inclure cette possibilité / solution?
ebrious