виджеты можно вызывать только при активном 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
)