ZSH: comment directement les widgets ZLE?

12

La documentation indique dans la section 18.4 Widgets , que "le travail d'un widget consiste simplement à effectuer une petite action". Mais je ne trouve pas de description générale sur la façon d'invoquer ces actions, c'est-à-dire comment appeler un widget.

J'ai vu dans des exemples (voir par exemple cette Q&R ) que les widgets peuvent être liés aux clés en utilisant bindkey KEY WIDGET. Ensuite, on peut appeler le widget en utilisant KEY.

Je voulais basculer set-local-historyet j'ai essayé:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hne fonctionne pas, mais j'ai trouvé une description des arguments ici . Mais il ne semble pas qu'il y ait quelque chose comme ça --call.

Qu'est-ce que je fais mal? Comment est-il possible d'appeler le widget sans bindkey? Comment imprimer l'état actuel? ( set-local-historybascule l'état)

lumbric
la source

Réponses:

9

Vous pouvez exécuter le widget par le widget execute-named-cmd, qui est lié à ESC-x(liaisons emacs) ou :(liaisons vi):

execute-named-cmd (ESC-x) (:) (unbound)

Lisez le nom d'une commande d'éditeur et exécutez-la.

Cela ouvre un mini-tampon sous la ligne de commande, où vous pouvez démarrer les widgets zle. (La saisie semi-automatique est disponible!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

Pour interroger l'état de zle(y compris l'historique local), utilisez la variable $ZLE_STATE(accessible uniquement à l'intérieur des fonctions du widget):

ZLE_STATE (scalar)

Contient un ensemble de mots séparés par des espaces qui décrivent l'état zle actuel.

Actuellement, les états affichés sont le mode d'insertion tel que défini par les widgets en mode d'écrasement ou vi-replace et si les commandes d'historique visiteront les entrées importées contrôlées par le widget set-local-history. La chaîne contient insert si les caractères à insérer sur la ligne de commande déplacent les caractères existants vers la droite ou overwritesi les caractères à insérer remplacent les caractères existants. Il contient localhistorysi seules les commandes d'historique local seront visitées ou globalhistorysi les commandes d'historique importées seront également visitées.

Les sous-chaînes sont triées par ordre alphabétique de sorte que si vous souhaitez tester deux sous-chaînes spécifiques de manière pérenne, vous pouvez faire correspondre en faisant:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

Toutes les citations de man zshzle.

mpy
la source
Euh oui, je pense avoir déjà vu les deux citations, mais je n'ai pas compris la valeur des trois accolades. La page de manuel indique: "Ces paramètres spéciaux sont toujours disponibles dans les fonctions de widget, mais ils ne sont en aucun cas spéciaux en dehors de ZLE." Cela signifie que pour obtenir ZLE_STATE, je dois définir une fonction et un widget personnalisé, non?
lumbric
@lumbric: Vous avez raison, ZLE_STATEest défini uniquement dans les fonctions de widget. J'ai affiné ma réponse. Quel est ton but? [Devinette: pour indiquer l'historique local / global dans mon invite, j'utilise un widget pour (i.) Définir une variable shell (cela est possible à l'intérieur des widgets) et (ii.) Exécuter zle set-local-history.]
mpy
Mon objectif principal était de comprendre le concept de widgets zle. En jouant avec set-local-history, je voulais savoir s'il est actuellement défini sur global ou local. Je pensais qu'il devait y avoir un nous pour obtenir l'état actuel (similaire à appeler "setopt" pour obtenir les options actuellement activées). Mon objectif initial a déjà été résolu dans ce Q&R .
lumbric
1
Je m'attendrais à ce que la chaîne dans le test if soit " *globalhistory*insert*" au lieu de " *insert*globalhistory*", d'après la lecture de la phrase avant l'exemple?
Volker Siegel
@VolkerSiegel: Un très bon point, merci! J'ai vérifié le code source et essayé moi-même l'exemple donné, concluant que l'exemple de la page de manuel est incorrect, pas la déclaration ("trié par ordre alphabétique"). J'ai modifié ma réponse et enverrai un chemin vers la liste de diffusion zsh-workers .
mpy
1

Si vous utilisez, tmuxvous pouvez appeler la touche liée avec send-keys.

Exemples:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Eyal Levin
la source