4 votes

Créer des commandes extensibles

J'utilise ZSH via Oh-my-zsh, et une fonctionnalité intéressante que je vois est que le shell étend mes commandes quand elles sont entre guillemets inversés.

Par exemple, `pwd` + tab, remplace `pwd` par mon chemin actuel :

https://infinit.io/_/DjmxTCK.gif

Je me demande s'il existe un moyen relativement facile de faire la même chose pour certaines commandes sans avoir à utiliser les guillemets inversés. J'aimerais appliquer cela à certaines alias (ou fonctions).

Pour être clair, je ne parle pas d'étendre les arguments d'une commande, mais de la commande elle-même.


C'est une fonctionnalité vraiment incroyable, mais ce n'est pas exactement ce que je cherchais. À moins que je n'aie fait quelque chose de mal, cela étend mon alias à ce que l'alias a été défini, mais pas à ce que le résultat est. Par exemple ici :

enter image description here

J'aimerais voir le résultat de cette commande au lieu de la commande complète.

2voto

Dženan Points 306

Vous pouvez utiliser un widget zle personnalisé pour cela et l'appeler par un raccourci clavier, par exemple Alt+Tab (identique à Esc, Tab)

expand-to-output () {
    BUFFER='$('$BUFFER')'
    CURSOR=0
    zle redisplay
    zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output

Maintenant, si vous tapez une commande suivie de Alt+Tab, toute la commande sera remplacée par sa sortie, si la commande a été exécutée avec succès. Si la commande ne peut pas être exécutée avec succès, la ligne de commande tapée sera simplement entourée de $(...) mais non étendue. S'il y a des messages d'erreur, ils devraient être imprimés au-dessus du tampon d'édition. Cela peut ne pas fonctionner de manière fiable avec des invites multi-lignes.

Explication:

  • expand-to-output () {...} définit la fonction (nouvelle) expand-to-output.
  • BUFFER contient la ligne de commande actuelle
  • BUFFER='$('$BUFFER')' place $( avant et ) après la ligne de commande. $(...) est équivalent à `...` mais peut être imbriqué.
  • CURSOR est la position du curseur sur la ligne de commande
  • CURSOR=0 place le curseur au début de la ligne de commande (modifiée), c'est-à-dire sur $. Sans déplacer le curseur là-bas, il pourrait arriver que zsh tente d'étendre un mot à l'intérieur de $(...) au lieu de toute la substitution de processus.
  • zle redisplay réaffiche le tampon d'édition. Cela empêche les erreurs d'affichage si la commande étendue imprime quelque chose sur stderr. (Remarque: il peut y avoir quelques problèmes avec les invites multi-lignes)
  • zle expand-word appelle le widget expand-word, qui est généralement appelé dans le cadre de la complétion par tabulation.
  • zle -N expand-to-output enregistre la fonction en tant que widget portant le même nom.
  • bindkey "^[^I" expand-to-output lie le widget expand-to-output à Alt+Tab.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X