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

Nic*_*ung 13 zsh

Zshread出于某种原因是 echo'ing ^M's 而不是接受它们作为<Enter>击键。(如果-d已设置,则它们被识别为<Enter>'s,但仍被回显。)它也不支持退格键等基本功能。

我可以通过hacking/run来解决这个问题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
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 26

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

vared -p 'What would you like to do?: ' -c tmp
Run Code Online (Sandbox Code Playgroud)

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

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

  • vared -p '你想做什么?:' -c tmp (2认同)
  • 非常酷!不知道“vared”内置函数。事实证明,“zshzle”手册页绝对值得至少浏览一下。 (2认同)