在TERM = linux中ctrl + arrow(左,右,…)的terminal转义序列是什么?

我正在浏览器中build立一个terminal窗口(例如ajaxterm),不知道将哪个转义序列发送到ssh隧道(通过paramiko.SSHClient().invoke_shell(term='linux')打开paramiko.SSHClient().invoke_shell(term='linux') )。

我find了一个键盘logging器 ,并在$ TERM =='linux'的terminal上试过,但是它返回的是同样的顺序,按ctrl+leftleft (27,91,68)。

如果我在另一个terminal(使用$ TERM =='xterm')尝试使用键盘logging程序,我会得到代码(27,91,49,59,53,68)。 但是这些代码不会移动从SSH通道中产生预期的输出(这会将光标移到正常的linuxshell上留下一个字)。 即使我用term ='xterm'开始paramiko也是如此。

任何想法我应该使用什么序列? 或者为什么上面的顺序不起作用?

更新 :我会很高兴使用另一种terminaltypes(不是“linux”),但不幸的是pyte只适用于VTxxxterminal(我相信“linux”是vt220的terminal – 无论如何,它的工作原理),所以xterm不起作用正常。

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

终端仿真器是仿真那些较旧的终端之一的应用程序。 它允许执行像光标定位,设置前景色和背景色等功能。终端仿真程序试图仿效一些特定的终端协议,但每个都有自己的一套怪癖和偏差。

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

由于直接使用功能进行编程可能非常麻烦,因此应用程序通常使用像curses / ncurses,俚语等更高级别的库。

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

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

假设你的主应用程序是bash或其他一些使用readline库的应用程序,那么你可以不用readline的backward-word (默认是Meta-b / Alt-b / ESC b,可以在inputrc配置)。

使用od -c快速检查可以发现,gnome-termainal生成这些值:

向左箭头生成ESC[D

控制左阵列产生ESC[1;5D

Ctrl +箭头键是由xterm引入的,而Gnome Terminal和KDE Konsole等人试图与xterm兼容。 实际的VT100和VT220终端没有用于这种组合的单独的键码。 据我所知,Linux控制台的目标是与VT100兼容,有一些补充,而xterm模拟VT220,有很多补充。