我想从 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”(见下文)。处理程序不应尝试从终端读取。