widget zsh completion zsh-zle fzf

los widgets solo se pueden llamar cuando ZLE está activo



zsh completion (1)

He estado lidiando con este problema durante casi un mes y me siento frustrado. Cualquier ayuda sería muy apreciada.

Estoy tratando de escribir un widget para mi comando takenote . El propósito del widget es alimentar todos los archivos de rebajas en la carpeta ~/notes en fzf para que el usuario pueda seleccionar uno de ellos y comenzar a editarlo. Después de que el usuario escribe takenote y presiona <tab> espero que se ejecute el widget.

Aquí está la definición del widget _takenote.zsh :

#compdef takenote local file=$( find -L "$HOME/notes/" -print 2> /dev/null | fzf-tmux +m ) zle reset-prompt compadd $file return 1

Desafortunadamente, el código anterior no funciona debido a zle reset-prompt , si lo elimino, el resultado sería así:

Y luego de seleccionar el archivo se convertiría en:

Lo que, como ves, corromperá el indicador y el comando en sí. Me parece que lo que necesito hacer es hacer un zle reset-prompt compadd antes de llamar a compadd pero esto solo funciona cuando vinculo la función a una tecla; de lo contrario, obtendré el siguiente error:

los widgets solo se pueden llamar cuando ZLE está activo


Finalmente encontré una solución para el problema. Aunque no estoy satisfecho con la estrategia, ya que no está contenido en el propio widget, pero funciona. La solución consiste en interceptar fzf-completion después de invocarla y llamar a zle reset-prompt .

Para registrar la trampa, agregue el siguiente fragmento de .zshrc a su archivo .zshrc (ver cómo completar el menú Zsh causa problemas después de zle reset-prompt ):

TMOUT=1 TRAPALRM() { if [[ "$WIDGET" =~ ^(complete-word|fzf-completion)$ ]]; then # limit the reset-prompt functionality to the `takenote` script if [[ "$LBUFFER" == "takenote "* ]]; then zle reset-prompt fi fi }

El widget _takenote :

#compdef takenote local file=$( find -L "$HOME/notes/" -print 2> /dev/null | fzf-tmux +m ) compadd $file return 0

ps: todavía me gustaría mover la captura dentro del widget y evitar registrarlo en el script de inicio ( .zshrc )