行尾小部件在函数中不起作用(zsh-autosuggestions)

行尾小部件在函数中不起作用(zsh-autosuggestions)

为什么会这样

bindkey '^ ' end-of-line

有效,并接受建议,但是

function accept {
  zle end-of-line
}
zle -N accept
bindkey '^ ' accept

这是行不通的。

我不明白为什么。我也尝试在函数中替换end-of-line为,但仍然没有任何反应......autosuggest-accept


我尝试做的是有两个键绑定:

  • Ctrl+空格键:接受建议并执行轻松完成的行bindkey '^ ' autosuggest-accept
  • Ctrl+Alt+空格:接受建议,sudo在开头添加并执行。我试过这个:
function insert-sudo-accept {
  zle end-of-line
  LBUFFER="sudo $LBUFFER"
  zle accept-line
}

但正如我所说,zle end-of-line不起作用,请帮忙。

答案1

  • 当激活键绑定的小部件时,Zsh 行编辑器 (ZLE) 会将$WIDGET参数设置为激活的小部件的名称。
  • 依次zsh-autosuggestions检查 的值是否$WIDGET是 的成员$ZSH_AUTOSUGGEST_ACCEPT_WIDGETS。如果是这样,它将接受该建议。
  • 但是,在您的小部件函数内,当您调用 时zle end-of-line,这将不是改变 的值$WIDGET

有以下三种方法可以解决这个问题:

  • zsh-autosuggestion将自己的小部件绑定autosuggest-acceptCtrlSpace
    bindkey '^@' autosuggest-accept
    
  • 称呼zle end-of-line -w。这将更新$WIDGET为您正在调用的小部件的名称。
  • 将您的小部件添加到$ZSH_AUTOSUGGEST_ACCEPT_WIDGETS
    ZSH_AUTOSUGGEST_ACCEPT_WIDGETS+=(
        <insert widget name here>
    )
    

相关内容