【问题标题】:Determining escape sequences for cursor keys canonically规范地确定光标键的转义序列
【发布时间】:2013-09-10 14:20:24
【问题描述】:

我想对光标键做出反应;为此,我想找出当前终端以规范方式使用的转义序列。大多数解决方案在源代码中只包含字符串"\e[A" 等。我知道如果目标系统使用不同的转义序列,这不是可移植的。

我尝试使用tput 来获得正确的转义序列,但tput kcud1 返回的转义序列与用于向下箭头键的转义序列不同:它返回"\eOB",但键结果为"\e[B"。但是没有给 tput 的 capname 导致这个字符串;我能做到的最好的是 tput cud ,它返回 "\e[%p1%dB" ,从中剥离所有参数最终将成为所需的字符串。但是去掉参数也不好听。

找出箭头键在按下时会产生的正确转义序列的规范方法是什么?我会很高兴使用tputcurses 或什至完全不同的方法的解决方案。

【问题讨论】:

标签: shell terminal arrow-keys ansi-escape


【解决方案1】:

光标键发送的内容取决于键盘模式。

tput 报告他们的应用程序模式值,但默认情况下,键盘处于标准模式。

DEKCKM 命令可以用来改变光标键的行为,例如:

printf "\033[?1h"

或者您可以使用smkx 命令将键盘设置为应用程序模式:

tput smkx

重置:

printf "\033[?1l"

tput rmkx

【讨论】:

  • ①我可以将键盘模式设置为应用程序模式,然后我得到像"\eOB"这样的序列(是的,我检查过)。这是最佳实践吗?在终端中运行并对箭头键做出反应的程序通常会这样做吗?他们通常会在退出时重置它吗? ②DECCKM现在终端普遍存在吗?我可以假设报告的键序列已经正常工作并且正确的是 DECCKM 不存在吗? ③ 有没有办法查出光标模式中的序列是什么?这个开关有什么好处(在我看来,只是多了一个)?
  • ① 是的,这是大多数基于诅咒的应用程序的常见做法。这就是为什么它首先被称为应用程序模式的原因。这些应用程序在离开时会重置为标准模式。 ② DECCKM 应该存在于大多数与 VT100/xterm/ansi 等兼容的终端仿真器中。 ③ 我认为没有标准的方式,curses 抽象了终端特性,但 DECCKM 是特定的/私有的。
【解决方案2】:

我认为您需要的是tput cud1(没有k)。您还可以在此处获取tput 命令的列表:

http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html

您还可以通过VAR=$(tput xyz) 将这些序列存储在一个变量中。

一切都在man terminfo。在线:http://www.manpagez.com/man/5/terminfo/

【讨论】:

  • 对不起,没有。 tput cud1 为我提供了一个换行符(0x0a,"\n"),而不是想要的"\e[B"。而且我了解文档,因此密钥应该是kcud1,因此当前系统似乎无论如何都不符合规范。您提到的文档也没有就这个问题提供更多线索(他们只是说明官方的,而不是遵循的路径)。
  • cud“可能”是一个转义序列,但终端数据库中的约定是存储最短/最快的字符序列以完成给定的功能。 ASCII ^J 可以做到这一点(因为 curses 应用程序初始化终端以允许这种行为,这与默认终端设置不同)。它的传统名称“换行符”具有误导性。
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多