виджеты можно вызывать только при активном ZLE

Я имею дело с этой проблемой почти месяц, и я чувствую себя расстроенным, Любая помощь будет очень признательна.

Я пытаюсь написать виджет для моей команды takenote. Цель виджета - fzf все файлы fzf в папку ~/notes в fzf чтобы пользователь мог выбрать один из них и fzf редактирование. После того, как пользователь takenote и takenote <tab> я ожидаю, что виджет будет запущен.

Вот определение виджета _takenote.zsh:

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

К сожалению, приведенный выше код не работает из zle reset-prompt, если я удалю его, результат будет таким:

before selection

И после выбора файла он превратился бы в:

After selecting the file

Это, как вы видите, приведет к повреждению подсказки и самой команды. Мне кажется, что мне нужно сделать вызов zle reset-prompt перед вызовом compadd но это может работать только тогда, когда я привязываю функцию к ключу, иначе я получу следующую ошибку:

виджеты можно вызывать только при активном ZLE

Ответ 1

Я, наконец, нашел обходное решение проблемы. Хотя меня не устраивает эта стратегия, поскольку она сама не содержится в самом виджетах, но она работает. Решение включает захват fzf-completion после его вызова и вызов zle reset-prompt.

Чтобы зарегистрировать ловушку, добавьте следующий фрагмент в ваш .zshrc файл (см. Завершение меню Zsh вызывает проблемы после вызова 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
}

Виджет _takenote:

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

ps: Мне все равно хотелось бы переместить ловушку внутри виджета и не регистрировать ее в скрипте init (.zshrc)