什么是Ttrl = linux中的ctrl + arrow(左,右,......)的终端转义序列

时间:2011-10-14 12:38:29

标签: linux terminal keycode xterm vt100

我正在浏览器中建立一个终端窗口(像ajaxterm一样)并且不知道要发送到ssh隧道的哪个转义序列(通过paramiko.SSHClient().invoke_shell(term='linux')打开)。

我找到了key logger并在$ TERM =='linux'的终端中尝试了它,但它返回了ctrl+leftleft的相同序列(27,91, 68)。

如果我在另一个终端尝试键盘记录器($ TERM =='xterm'),我会得到代码(27,91,49,59,53,68)。但是这些代码不会移动从SSH通道生成预期的输出(这将在正常的Linux shell上移动光标一个字)。即使我用term ='xterm'开始paramiko也是如此。

知道我应该使用什么序列?或者为什么上述顺序不起作用?

更新:我很乐意使用其他终端类型(不是“linux”),但遗憾的是pyte仅适用于VTxxx终端(我相信“linux”就像vt220一样终端 - 无论如何,它的工作原理),所以xterm无法正常工作。

3 个答案:

答案 0 :(得分:23)

终端是由键盘和输出设备组成的硬件设备(最初是硬拷贝打印机,后来是CRT监视器)。大型计算机可以连接多个远程终端。每个终端将具有用于与计算机有效通信的协议,对于基于CRT的终端,这包括具有改变光标位置的特殊“控制序列”,擦除当前行/屏幕的部分,切换到备用全屏模式,。 ..

终端仿真器是一个模拟其中一个旧终端的应用程序。它允许执行诸如光标定位,设置前景色和背景色等功能,...终端模拟器尝试模拟某些特定的终端协议,但每个都有自己的一组怪癖和偏差。

Unix系统具有描述终端和终端仿真器的数据库,因此应用程序被抽象出使用中的特定终端(或终端仿真器)。较旧的数据库为termcap(5),而terminfo(5)是较新的数据库。这些数据库允许应用程序查询正在使用的终端的功能。功能可以是布尔值,数字功能,甚至字符串功能,例如:如果特定终端类型具有/支持F12密钥,它将具有“key_f12”(长终端名称),“kf12”(短终端名称), “F2”(termcap名称)描述密钥产生的字符串。尝试使用:tput kf12 | od -tx1

由于直接使用功能进行编程可能很麻烦,因此应用程序通常使用更高级别的库,如curses / ncurses,slang等...

有一个名为TERM的特殊环境变量告诉应用程序他们正在与哪个终端类型进行通信。如果数据存在于数据库中,则应将此变量设置为确切的终端类型,以获得最佳结果。这只是告诉应用程序终端能够理解哪些精确的协议和协议偏差。更改TERM变量会更改终端类型,它只会更改应用程序认为正在与之通话的终端类型。

所有这一切,Ctrl+arrow是一个xterm行为(取决于配置选项),在terminfo / termcap数据库中根本没有反映,所以大多数应用程序都不知道它。无论哪种方式,您的终端模拟器(在您的情况下为pyte)都支持它,或者它不支持。

假设您的主应用程序是bash或其他使用readline库的应用程序,您可能会使用readline的backward-word(Meta-b / Alt-b / ESC b)默认情况下,可以在inputrc)中配置。

答案 1 :(得分:9)

使用od -c进行快速检查后发现,gnome-termainal会生成以下值:

左箭头会生成ESC - [ - D

Control-left-array geneates ESC - [ - 1 - ; - 5 - D

答案 2 :(得分:4)

Ctrl +箭头键码是由xterm引入的,而Gnome Terminal和KDE Konsole等类似于与xterm兼容。实际的VT100和VT220终端没有针对此类组合的单独密钥代码。据我所知,Linux控制台旨在与VT100兼容,增加一些功能,而xterm模拟VT220,增加了很多。

相关问题