Igo*_*nko 9 termcap terminal ncurses terminfo
在 Debian 系统上END按键生成^[[F:
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[F 27 0033 0x1b
91 0133 0x5b
70 0106 0x46
Run Code Online (Sandbox Code Playgroud)
但是为什么这个键和弦不在terminfo 中?
$ infocmp -1 | grep end
kend=\EOF,
Run Code Online (Sandbox Code Playgroud)
尽管如此,ncurses设法正确地将其识别为KEY_END. 如何?
TERM 是 xterm-256color
顺便说一句,拥有kendandend而不仅仅是背后的动机是end什么?(对于khome和home)
编辑
正如 Johan Myréen 的评论中所说,khome字符串是按下 Home 键产生的序列。但是在 Debian 上按 Home 键会产生home. 为什么?
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
Run Code Online (Sandbox Code Playgroud)
$ infocmp -1 | grep home
home=\E[H,
khome=\EOH,
Run Code Online (Sandbox Code Playgroud)
Tho*_*key 11
Johan Myréen 的回答很接近,但不完全是问题:您将使用的大多数终端模拟器都具有特殊键的正常和应用程序模式。终端描述是为一种模式编写的,它对应于全屏应用程序使用的模式。其他应用程序(例如交互式shell)通常不会初始化屏幕以使用应用程序模式。Bash 就是一个例子。
在正常模式下,xterm 和类似终端发送escape[(CSI),而在应用程序模式下,它们的键盘发送escapeO(SS3)。在 terminfo 语法中,该转义符是\E. 所以infocmp向您展示了描述使用应用程序模式。该home功能被发送到终端,告诉它如何移动光标到家庭位置(左上),并且是不一样的khome(发送从使用键盘的终端)。
全屏应用程序(例如使用 ncurses 的应用程序)可能会发送用于初始化键盘的终端功能字符串。有些终端描述确实将终端置于应用程序模式,有些则没有。
kendvs的使用end是一种命名约定:在 terminfo 中,按照约定,任何以k开头的名称都指代一个特殊的键(功能键、光标键、键盘键),以明确这些是应用程序要读取的字符串。例如,kcub1(cursor-backward key ) 不同于cub1(将光标移回一列)。
ncurses 识别该键是KEY_END因为您正在使用的应用程序将调用keypad函数以使用smkx(助记符表示“启动键盘传输模式”)来初始化终端。这可能/可能不会实际打开应用程序模式。Linux 控制台的终端描述没有,xterm 的有。
原则上,您可以tput用于切换模式(并从中获得不同的结果showkey):
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
^C 3 0003 0x03
^D 4 0004 0x04
$ tput smkx
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[OH 27 0033 0x1b
79 0117 0x4f
72 0110 0x48
Run Code Online (Sandbox Code Playgroud)
复杂的是,curses 将只识别字符串的一个名称。某些终端(例如 xterm)使用不同名称的编辑键盘上的键来模拟较旧的硬件终端。在下面列出的 xterm 常见问题解答中,有可能将“Home”键命名为“Insert”...
进一步阅读:
getch手册页)Home 键的问题是物理终端和后来模拟它们的终端模拟器有两种模式:普通模式和应用模式,并且转义序列根据终端所处的模式而不同。 Terminfo 无法很好地应对这一点。在正常模式(又名“光标模式”)下,结束键转义序列是ESC [ F,在应用程序模式下ESC O F。谷歌搜索这个问题揭示了整个混乱。
从 terminfo 源编辑:
然后假定光标键处于“光标模式”,并且光标键定义应符合该假设,否则应用程序可能会失败。还期望应用程序始终在退出之前将字符串传输到终端。”
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |