为什么END键没有terminfo条目?


8

在Debian系统上,END按键会生成^[[F

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[F     27 0033 0x1b
         91 0133 0x5b
         70 0106 0x46

但是,为什么此键盘和弦不在terminfo中

$ infocmp -1 | grep end
kend=\EOF,

但是,ncurses设法正确地将其识别为KEY_END。怎么样?

TERMxterm-256color

顺便说一句,拥有kendend不是正义的动机是end什么?(与khome和相同home

编辑

正如JohanMyré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
$ infocmp -1 | grep home
    home=\E[H,
    khome=\EOH,

1
之间的差homekhome是,khome字符串是按主页键产生序列,而home字符串是应当被发送到所述终端,将光标移动到起始位置的序列。据我所知,terminfo并没有定义end功能kend
JohanMyréen'17

@JohanMyréen能否举例说明光标的“原始位置”是什么?以及为什么在terminfo中kend定义,而终端生成?这是Debian的terminfo中的错误吗?而ncurses如何设法将其检测出来?\EOF\E[FKEY_END
伊戈尔·利弗连科

起始位置是屏幕的左上角。
JohanMyréen'8

Answers:


10

JohanMyréen的答案很接近,但问题不完全是:您将使用的大多数终端仿真器都具有特殊键的正常模式和应用程序模式。终端说明是针对一种模式编写的,模式与全屏应用程序使用的模式相对应。其他应用程序(例如交互式shell)通常不初始化屏幕以使用应用程序模式。Bash就是一个例子。

普通模式下,xterm和类似终端发送escape[(CSI),而在应用程序模式下,其键盘发送escapeO(SS3)。在terminfo语法中,该转义\E。因此infocmp向您显示说明使用了应用程序模式。该home功能将发送终端,告诉它如何将光标移动到起始位置(左上方),并且与khome终端使用键盘发送的)功能不同。

全屏应用程序(例如使用ncurses的应用程序)可以发送用于初始化键盘的终端功能字符串。有些终端说明确实使终端进入了应用程序模式,而有些则没有。

使用kendvs end是一个命名约定:在terminfo中,按约定,任何以k开头的名称均指代特殊键(功能键,光标键,小键盘键),以明确表示这些是应用程序要读取的字符串。例如,kcub1(向后光标)与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

复杂的是,curses只能识别一个字符串的名称。一些终端(例如xterm)使用不同的名称来编辑键盘上的按键,从而模拟较旧的硬件终端。在下面列出的xterm常见问题解答中,可以命名为“主页”键“插入” ...

进一步阅读:


是的,我正在使用keypad函数。但是,有了“ ncurses如何设法将其检测为KEY_END” 这个问题,我的意思是“如何keypad解码^[[Fkend”(考虑keypad使用terminfo数据库来解释琴键)。如果我正确理解,则发生这种情况是因为showkey -a它处于光标模式,而ncurses应用程序处于应用程序模式。
伊戈尔·利弗连科

showkey不能在普通/应用模式之间切换。这是一个特定于Linux的程序,对Linux控制台进行了假设,而不是使用终端数据库
Thomas Dickey

如果showkey没有在模式之间进行切换,那么它将使用某种默认状态,无论该状态如何。重点是showkey印刷品^[[F而不是^[OF,这导致了我的困惑。(我只是用来showkey直观地表示终端通过按键盘按钮发送的实际琴弦,而不会怀疑其中包含一些细微之处。)
Igor Liferenko

是的,那是“正常”模式(通常的引用方式)。您当然可以使用初始化您的终端tput smkx并获得不同的结果。
托马斯·迪基

我认为less实用程序中存在一个错误:它进入了应用程序模式,但是无法解释键盘的Enter键。我应该提交错误报告吗?(您可以通过less在键入后启动并按键盘Enter键来进行检查/-它将输出ESCOM,而不是执行Enter键必须执行的操作。)
Igor Liferenko

5

Home键的问题在于,物理终端和随后仿真它们的终端仿真器具有两种模式:普通模式和应用程序模式,并且转义序列因终端所处的模式而异。Terminfo对此无法很好地应对。在正常模式(又称“光标模式”)下,“结束”键转义序列为“ ESC [ F应用程序”模式ESC O F。谷歌搜索这个问题揭示了整个混乱。

从terminfo来源编辑

则假定光标键处于“光标模式”,并且光标键定义应符合该假设,否则应用程序可能会失败。还期望应用程序始终在退出之前将字符串传输到终端。”


切换到“应用程序模式”的过程是什么?它是由ncurses完成的吗?
伊戈尔·利弗连科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.