答案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 smkx
,Up按键发送\eOA
,而 aftertput rmkx
,它发送\e[A
序列,该序列恰好对应于向上移动光标的序列(与 发送的相同tput cuu1
)。某些终端还支持其他模式,这些模式会影响按键时发送的内容,我们在此不予讨论。
因此,为了让终端规则本地回显在您按下箭头键时移动光标,您需要:
tput rmkx; stty -icanon echo -echoctl; cat > /dev/null