Question les widgets ne peuvent être appelés que lorsque ZLE est actif


Cela fait presque un mois que je traite de ce problème et je suis frustré. Toute aide serait grandement appréciée.

J'essaie d'écrire un widget pour mon takenote commander. Le but du widget est d’alimenter tous les fichiers de démarques dans ~/notes dossier dans fzf afin que l'utilisateur puisse en sélectionner un et commence à le modifier. Après les types d'utilisateur takenote et presses <tab> Je m'attends à ce que le widget fonctionne.

Voici la _takenote.zsh définition du widget:

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

Malheureusement, le code ci-dessus ne fonctionne pas à cause de zle reset-prompt, si je l'enlève alors le résultat serait comme ceci:

before selection

Et après avoir sélectionné le fichier, il deviendrait:

After selecting the file

Qui comme vous voyez va corrompre l'invite et la commande elle-même. Il me semble que ce que je dois faire est de faire un zle reset-prompt avant d'appeler compadd mais cela ne peut fonctionner que lorsque je lie la fonction à une clé, sinon, j'obtiendrai l'erreur suivante:

les widgets ne peuvent être appelés que lorsque ZLE est actif


16
2018-01-02 04:30


origine


Réponses:


J'ai finalement trouvé une solution pour le problème. Bien que je ne sois pas satisfait de la stratégie car elle n’est pas autonome dans le widget, mais cela fonctionne. La solution implique le piégeage fzf-completion après l'invocation et l'appel zle reset-prompt.

Pour enregistrer le piège, ajoutez l'extrait suivant à votre .zshrc fichier (voir L'achèvement du menu Zsh provoque des problèmes après une réinitialisation de ZLE ):

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
}

le _takenote widget:

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

p.s: J'aimerais quand même déplacer le piège à l'intérieur du widget et éviter de l'enregistrer dans le script d'initialisation (.zshrc)


0
2018-05-04 05:16