首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当ZLE处于活动状态时才能调用小部件。

只有当ZLE处于活动状态时才能调用小部件。
EN

Stack Overflow用户
提问于 2018-01-02 04:30:18
回答 3查看 3.8K关注 0票数 23

我已经处理这个问题近一个月了,我感到沮丧,任何帮助都将不胜感激。

我正试图为我的takenote命令编写一个小部件。小部件的目的是将~/notes文件夹中的所有标记文件输入fzf,以便用户可以选择其中的一个并开始编辑它。在用户键入takenote并按下<tab>之后,我希望小部件能够运行。

下面是_takenote.zsh小部件的定义:

代码语言:javascript
复制
#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处于活动状态时才能调用小部件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-16 22:42:34

两天后,由于出色的fzf选项卡完成项目,我终于找到了如何实现它的提示:

https://github.com/lincheney/fzf-tab-completion/blob/c91959d81320935ae88c090fedde8dcf1ca70a6f/zsh/fzf-zsh-completion.sh#L120

所以实际上,你所需要做的就是:

代码语言:javascript
复制
#compdef takenote
local file=$( find -L "$HOME/notes/" -print 2> /dev/null | fzf-tmux +m )
compadd $file
    
TRAPEXIT() {
   zle reset-prompt
}
return 0

终于起作用了。干杯!

票数 2
EN

Stack Overflow用户

发布于 2018-05-04 05:16:46

我终于找到了解决这个问题的办法。虽然我对这个策略不满意,因为它并不包含在小部件本身中,但是它可以工作。解决方案包括在调用fzf-completion之后捕获它并调用zle reset-prompt

为了注册陷阱,在.zshrc文件中添加以下代码段(请参阅Zsh menu completion causes problems after zle reset-prompt ):

代码语言:javascript
复制
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小部件:

代码语言:javascript
复制
#compdef takenote
local file=$( find -L "$HOME/notes/" -print 2> /dev/null | fzf-tmux +m )
compadd $file
return 0

p.s:我仍然希望移动小部件中的陷阱,并避免在init脚本(.zshrc)中注册它。

票数 5
EN

Stack Overflow用户

发布于 2020-04-29 04:20:18

在试图使用bindkey对小部件使用vim打开选定的fzf文件时,我也遇到了同样的错误。结果,我必须在function1中打开文件,然后使用function2调用function1,然后使用reset-prompt来避免这个widgets can only be called when ZLE is active错误。就像你说的,这真的是令人沮丧的,几乎花了我一天的时间才弄清楚!

示例代码:

代码语言:javascript
复制
## 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-widget
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48055589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档