tty 线路规则是否回显垂直箭头键?

tty 线路规则是否回显垂直箭头键?

当我的程序读取用户输入时,垂直箭头键不执行任何操作。如果行规则将所有内容回显给主控端,那么光标是否不会向上移动到终端的上一行?如果我是对的,还有其他字符是线路规则没有回应的吗?

顺便说一句,我认为 bash 使用“原始模式”(这会禁用 echo 等),但运行会stty -echo“挂起”终端,这表明在正常 bash 执行期间启用了 echo。

Zsh 没有表现出这种行为,但我认为这是因为它重置回显标志当命令退出时。

答案1

如果不知道“我的程序”指的是什么,以及该程序如何改变终端线的设置,则很难回答。

它可以是一个文本编辑器,然后您可以在文件中移动光标。它可能是另一个 shell,然后它可能会滚动历史条目。它可能是一个音频控制软件,可以增加/减少音量。 ETC。

如果它类似于sleep 1000,您会看到^[[A^[[B出现,因为行规则不会以其原始形式回显它们,而是将字节转换ESC为人类可读的文字^[字符。

如果是cat,当您点击时Enter,您会看到光标垂直移动。延迟的原因是行门徒延迟将字符发送到应用程序(即cat),直到整个输入行完成。光标垂直移动的原因与行规则无关,这只是因为cat回显原始数据,并且因为箭头键生成的输入转义序列与在行中移动光标的输出转义序列相同。说方向。

答案2

TUI 应用程序或更普遍的自行处理键盘输入的应用程序禁用行规则自己的行编辑器 ( ICANON) 和本地回显 ( ECHO),因为它们需要读取按键时发送的字符并执行自己的操作echo

这些应用程序在启动时会更改 termios 设置,并在离开(或暂停)时恢复它们。

readline(bash 使用的行编辑器)和 zle(zsh 行编辑器)也不例外。

这些行编辑器是开始了当 shell 发出提示符并且停止了当你执行命令时。

因此,当您运行stty -a或任何其他命令时,您不会看到 readline / zle 中使用的 termios 设置,您会看到它们在离开时恢复的设置。

ECHO启用时,来自终端的输入会回显,但对于控制字符,还需要考虑其他两件事,第三个是专门针对箭头键的:

  • 如果ICANON打开(默认情况下),行规则内部行编辑器将拦截一些控制字符,例如 BS 或 DEL、^W^U以进行自己的行编辑。 ESC(方向键上发送的第一个字符通常不是这些字符)。
  • 如果ECHOCTL也打开(默认情况下通常也是如此),则控制字符将按原样回显,^X而不是按原样回显。
  • 终端通常可以发送不同的转义序列,无论它们是否处于“键盘传输”模式。您会注意到 after tput smkxUp按键发送\eOA,而 after tput rmkx,它发送\e[A序列,该序列恰好对应于向上移动光标的序列(与 发送的相同tput cuu1)。某些终端还支持其他模式,这些模式会影响按键时发送的内容,我们在此不予讨论。

因此,为了让终端规则本地回显在您按下箭头键时移动光标,您需要:

tput rmkx; stty -icanon echo -echoctl; cat > /dev/null

相关内容