在zsh中使用bindkey调用函数需要在函数运行后按回车

Using bindkey to call a function in zsh requires pressing enter after function runs

我是 zsh 的新手,我正在尝试将键序列绑定到我 .zshrc 中的函数:

say_hello(){
    echo "hello"
}
zle -N say_hello
bindkey '^Y' say_hello

按 Ctrl-Y 将调用该函数,我会看到 "hello" 打印到终端,但在我需要再次按 Enter 之后,我会得到另一个 zsh 提示。只需在 zsh 提示符下键入 say_hello 并按 Enter 键即可调用该函数,这就是我想要的 - 我看到 hello 打印出来,然后我得到另一个 zsh 提示符。将函数绑定到键序列时如何获得此行为?

上面是一个简单的例子,下面是我真正想写的函数:

my_cd() {
    if [[ "$#" -ne 0 ]]; then
        cd $(autojump $@)
        return
    fi
    dir_to_cd_to=$(fasd_cd -dl |  fzf --height 40% --reverse --inline-info)
    # above isn't so important - dir_to_cd_to could be obtained in any way
    cd "$dir_to_cd_to"
}

zle -N my_cd
bindkey -v '^Y' 'my_cd'

要在 zle 小部件中显示消息,您应该使用 zle -M 而不是 echoecho 将在当前光标位置输出您的消息,这不是特别有用。如果你真的想使用 echo,之后调用 zle reset-prompt 将重绘一个新的提示。如果您不希望终端出现潜在的混乱,请考虑以 \r 开头将光标移动到行首,以 $termcap[ce] 结尾以清除行尾。