ZSH: ¿cómo ZLE widgets directamente?


12

La documentación dice en la sección 18.4 Widgets , que "el trabajo de un widget es simplemente realizar alguna pequeña acción". Pero no puedo encontrar una descripción general de cómo invocar estas acciones, es decir, cómo llamar a un widget.

He visto en ejemplos (por ejemplo, vea estas preguntas y respuestas ) que los widgets pueden vincularse a las teclas usando bindkey KEY WIDGET. Entonces uno puede llamar al widget usando KEY.

Quería alternar set-local-historye intenté:

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

zle -hno funciona, pero he encontrado una descripción de los argumentos aquí . Pero no parece que haya algo así --call.

¿Qué estoy haciendo mal? ¿Cómo es posible llamar al widget sin Bindkey? ¿Cómo puedo imprimir el estado actual? ( set-local-historyalterna el estado)

Respuestas:


9

Puede ejecutar el widget por el widget execute-named-cmd, que está vinculado a ESC-x(enlaces emacs) o :(enlaces vi):

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

Lea el nombre de un comando de editor y ejecútelo.

Esto abre un mini-búfer debajo de la línea de comando, donde puede iniciar widgets zle. (¡Autocompletado está disponible!):

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

Para consultar el estado de zle(incluido el historial local), use la variable $ZLE_STATE(solo accesible dentro de las funciones del widget):

ZLE_STATE (scalar)

Contiene un conjunto de palabras separadas por espacios que describen el estado zle actual.

Actualmente, los estados que se muestran son el modo de inserción según lo establecido por el modo de sobrescritura o los widgets de reemplazo de vi y si los comandos del historial visitarán las entradas importadas según lo controle el widget set-local-history. La cadena contiene insert si los caracteres que se insertarán en la línea de comando mueven los caracteres existentes a la derecha o overwritesi los caracteres que se insertarán sobrescriben los caracteres existentes. Contiene localhistorysi solo se visitarán los comandos del historial local o globalhistorysi también se visitarán los comandos del historial importados.

Las subcadenas se ordenan en orden alfabético, de modo que si desea probar dos subcadenas específicas de una manera a prueba de futuro, puede hacer coincidir:

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

Todas las citas de man zshzle.


Sí, creo que ya he visto ambas citas, pero no entendí el valor de las tres llaves. La página de manual dice: "Estos parámetros especiales siempre están disponibles en las funciones de widget, pero no son de ninguna manera especiales fuera de ZLE". Eso significa que, para obtener ZLE_STATE, necesito definir una función y un widget personalizado, ¿verdad?
lumbric

@lumbric: Tienes razón, ZLE_STATEsolo se define dentro de las funciones del widget. Refiné mi respuesta. ¿Cuál es tu objetivo? [Conjetura: para indicar el historial local / global en mi solicitud, uso un widget para (i.) Establecer una variable de shell (esto es posible dentro de los widgets) y (ii.) Ejecutar zle set-local-history.]
mpy

Mi objetivo principal era comprender el concepto de widgets zle. Jugando con set-local-history, quería saber si actualmente está configurado en global o local. Pensé que debía haber un nosotros para obtener el estado actual (similar a llamar a "setopt" para obtener las opciones habilitadas actualmente). Mi objetivo original ya estaba resuelto en estas preguntas y respuestas .
lumbric

1
Esperaría que la cadena en la prueba if debería ser " *globalhistory*insert*" en lugar de " *insert*globalhistory*", según la lectura de la oración antes del ejemplo.
Volker Siegel

@VolkerSiegel: Un muy buen punto, ¡gracias! Verifiqué con el código fuente y probé el ejemplo dado, concluyendo que el ejemplo en la página del manual es incorrecto, no la declaración ("ordenada alfabéticamente"). Edité mi respuesta y enviaré una ruta a la lista de correo de zsh-Workers .
mpy

1

Si está utilizando tmux, puede llamar a la tecla enlazada con send-keys.

Ejemplos:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.