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
)