【问题标题】:How do Linux utilities avoid accidentally splitting ANSI key sequences in stdin stream?Linux 实用程序如何避免意外拆分标准输入流中的 ANSI 键序列?
【发布时间】:2018-08-30 15:33:22
【问题描述】:

终端模拟器将键盘输入编码为 ANSI 转义序列。

转义键是单字节:\x1b
删除键为 4 个字节:\x1b '[' '3' '~'

用户按下 Delete 键和按键序列“Escape”、“[”、“3”、“~”有什么区别?

vim 等交互式程序如何区分?

终端仿真器和 SSH 等实用程序如何以确保接收程序做出正确解释的方式发送密钥序列?

【问题讨论】:

  • xfree86.org/4.8.0/ctlseqs.html 那里。读那个。玩得开心。
  • @GottZ 你能指出该文件的任何特定部分吗?我找不到任何可以回答我的问题的内容。
  • 另请参阅modifyOtherKeys,它在 xterm 和 pangoterm 中给出了明确的结果 - 请注意,有 2 种不同的编码,但您可以同时处理。

标签: linux ansi tty


【解决方案1】:

时机。

如果字符在足够短的时间内到达,则它们不太可能是单独输入的。

在 vim 中,esckeysttimeoutttimeoutlen 选项决定是否等待转义序列完成以及等待多长时间。这些不是传统的 vi 选项。在传统的 vi 中,转义只是一个转义,方向键没有用。

您可以通过键入 Esc O AEsc [ 来测试它A 在 vi​​m 中非常快。如果您的速度足够快,并且您的终端设置不是太奇特,那么其中一个将起到向上箭头键的作用。慢慢地键入相同的东西,它会做不同的事情。执行:set noesckeys,它永远不会像箭头键(即使您实际按下箭头键) - 如果您希望对转义键的响应是即时的,这是您必须付出的代价。

可以使用其他序列(例如 ^[[3~)来完成实验,但 3 个字符的序列更容易输入。

curses 库在解释终端输入时也使用超时。这是一个相关的问题:How can I know that the user hit the ESC key in a console with ncurses (Linux)?

【讨论】:

  • 谢谢。我机器上的 vim 禁用了 ttimeout 并将 ttimeoutlen 设置为 -1。这是否意味着它永远不会等待并假设在 stdin 上调用 read() 将始终能够一次读取整个 ANSI 序列?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多