【问题标题】:Using bindkey to call a function in zsh requires pressing enter after function runszsh中使用bindkey调用函数需要在函数运行后回车
【发布时间】:2020-06-04 23:11:46
【问题描述】:

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

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

按 Ctrl-Y 将调用该函数,我会看到“hello”打印到终端,但在我得到另一个 zsh 提示之前,我需要再次按 Enter。只需在 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'

【问题讨论】:

  • 您是打算在^Y 上运行命令还是只是在命令行中插入文本?
  • @MartinTournoij 不,我真正想运行的功能涉及更改当前目录,我只是在此处的示例中使用echo 命令来说明我不理解的行为。跨度>
  • 严格来说,zsh 已经在等待你的输入了;在输入下一个命令之前,您不需要 按 Enter 键(导致重新显示提示)。输出只是将“hello”和一个换行符写到终端中,您的输入将被终端回显。
  • 您可能对print -z 感兴趣,它会直接写入输入缓冲区,就像您输入了文本一样。可以这么说,这可能是让zle 调用“带外”函数的替代方法。
  • @chepner 谢谢。所以我添加了一个我真正想要的示例 - 一个更改工作目录的函数,它使用键绑定运行。你能推荐一下如何使这项工作,以便在函数完成后我会得到我的 zsh 提示符吗?

标签: zsh zshrc


【解决方案1】:

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

【讨论】:

  • 很高兴知道,但我只是在这里使用echo 来显示我不理解的行为 - 我真正想要在函数中做的不仅仅是打印一些东西
  • woops 错过了这个答案的 zle reset-prompt 部分 - 这是我正在寻找的关键部分
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2018-06-11
  • 2016-12-05
相关资源
最近更新 更多