从 ZLE 小部件内部读取纯文本输入

从 ZLE 小部件内部读取纯文本输入

我想从 ZLE 小部件内部读取普通文本输入(即不是可能具有自动完成等功能的常规 ZSH 编辑器)。目前,当我尝试:

function myfunc() {
    echo -n "Your name: "
    read -re 
    echo $REPLY
}

zle -N mywidget myfunc
bindkey "\C-k" mywidget

当我调用时myfunc,一切都按预期进行,但是当我按下C-k(绑定到上面的按键bindkey)时,就像跳过了读取命令一样:

在此处输入图片描述

我没有按回车键,只按C-k了一次。

我想要的是具有类似 bash 的功能并等待我的输入。

我知道zsh 在 zle 小部件中读取输入但我不想使用 ZSH 的迷你缓冲区编辑器,因为它有自动完成等功能,而这个在 zsh 中读取一行用户输入的更好方法?(例如使用 zle?)解决方案对我不起作用

答案1

ZLE 将函数的输入重定向/dev/null手册页

关闭函数的标准输入,以防止外部命令通过从终端读取而无意中阻塞 ZLE

因此应该直接从 tty 读取输入,如下所示:

function myfunc() {
    zle -I
    echo -n "Your name: "
    read -re < /dev/tty
    echo $REPLY
}

zle -N mywidget myfunc
bindkey "\C-k" mywidget

要在小部件内部正确打印文本zle -I,请按照手册页中的说明进行操作:

如果处理程序向终端输出,则应在执行此操作之前调用“zle -I”(见下文)。处理程序不应尝试从终端读取。

相关内容