在zsh中读取一行用户输入的更好方法?(例如与zle?)


11

read出于某种原因,Zsh的是echo ^M's而不是接受它们作为<Enter>击键。(如果-d已设置,则它们将被识别为<Enter>,但仍会回显。)它也不支持诸如Backspace键之类的基础知识。

我可以通过入侵/运行来解决这个问题bash

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

但我想知道是否有更清洁的方法。


无法在全新的zsh4.3.10安装中进行确认;% read a在这里工作正常。
user1686

这是在OS X上使用iterm;read可以在Linux机器上使用。
董建华

Answers:


19

要在zsh下舒适地输入一行文本,请使用vared。使用vared而不是read调用zle等效于传入-ebash来调用readline。

vared -p 'What would you like to do?: ' -c tmp

用简单描述的行为read看起来像是配置错误的终端,而不是外壳问题。运行stty -a以显示您的终端设置,并确保将eol其设置为,^M并将erase其设置为Backspace密钥发送的内容。根据操作系统及其设置方式以及在终端上,Backspace发送^H^?。退格设置通常由于某些试图手动设置的配置文件而出错,因此,您应该做的第一件事就是跟踪并删除所有此类错误配置。如果找不到任何内容,请查看终端仿真器的设置以检查它是否未设置为某些历史兼容模式。如果其他所有方法均失败,则将以下内容添加到您的~/.zshrc

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi

1
vared -p'您想做什么?:'-c tmp
zzapper 2014年

非常酷!不知道vared内置的。事实证明,zshzle手册页绝对值得至少浏览一下。
ratijas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.