我已经处理这个问题近一个月了,我感到沮丧,任何帮助都将不胜感激。
我正试图为我的takenote命令编写一个小部件。小部件的目的是将~/notes文件夹中的所有标记文件输入fzf,以便用户可以选择其中的一个并开始编辑它。在用户键入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,上面的代码无法工作,如果我删除它,结果将如下所示:

在选择文件之后,它将变成:

如您所见,这将破坏提示符和命令本身。在我看来,我需要做的是在调用zle reset-prompt之前执行一个compadd,但是只有当我将函数绑定到一个键时才能工作,否则,我将得到以下错误:
只有当ZLE处于活动状态时才能调用小部件。
发布于 2022-08-16 22:42:34
两天后,由于出色的fzf选项卡完成项目,我终于找到了如何实现它的提示:
所以实际上,你所需要做的就是:
#compdef takenote
local file=$( find -L "$HOME/notes/" -print 2> /dev/null | fzf-tmux +m )
compadd $file
TRAPEXIT() {
zle reset-prompt
}
return 0终于起作用了。干杯!
发布于 2018-05-04 05:16:46
我终于找到了解决这个问题的办法。虽然我对这个策略不满意,因为它并不包含在小部件本身中,但是它可以工作。解决方案包括在调用fzf-completion之后捕获它并调用zle reset-prompt。
为了注册陷阱,在.zshrc文件中添加以下代码段(请参阅Zsh menu completion causes problems after 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 0p.s:我仍然希望移动小部件中的陷阱,并避免在init脚本(.zshrc)中注册它。
发布于 2020-04-29 04:20:18
在试图使用bindkey对小部件使用vim打开选定的fzf文件时,我也遇到了同样的错误。结果,我必须在function1中打开文件,然后使用function2调用function1,然后使用reset-prompt来避免这个widgets can only be called when ZLE is active错误。就像你说的,这真的是令人沮丧的,几乎花了我一天的时间才弄清楚!
示例代码:
## use rg to get file list
export FZF_DEFAULT_COMMAND='rg --files --hidden'
## file open (function1)
__my-fo() (
setopt localoptions pipefail no_aliases 2> /dev/null
local file=$(eval "${FZF_DEFAULT_COMMAND}" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS --preview 'bat --color=always --line-range :500 {}'" $(__fzfcmd) -m "$@" | while read item; do
echo -n "${(q)item}"
done)
local ret=$?
if [[ -n $file ]]; then
$EDITOR $file
fi
return $ret
)
## define zsh widget(function2)
__my-fo-widget(){
__my-fo
local ret=$?
zle reset-prompt
return $ret
}
zle -N __my-fo-widget
bindkey ^p __my-fo-widgethttps://stackoverflow.com/questions/48055589
复制相似问题