TERM=linux中,ctrl + 箭头(左、右...)的终端转义序列是什么?

13
我正在浏览器中构建一个终端窗口(类似于ajaxterm),但不知道要发送哪个转义序列到ssh隧道(通过paramiko.SSHClient().invoke_shell(term='linux')打开)。
我已经找到了一个键盘记录器,并在$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无法正常工作。

一个典型的默认readline配置(bash使用readline)将Alt-B用于向后单词。terminfo甚至没有Ctrl-←的条目。 - ninjalj
但是它在xterm控制台上可以运行... 您能否详细介绍一下terminfo,最好是作为答案? - johndodo
Linux控制台甚至不接近vt220。它是(功能较弱的)vt100的子集。这个问题的每个答案都至少有一个错误。 - Thomas Dickey
3个回答

25

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

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

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

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

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

总之,Ctrl+箭头键是一种xterm行为(取决于配置选项),在终端信息/ termcap数据库中根本没有反映出来,因此大多数应用程序都不知道它。无论如何,你的终端仿真器(在你的情况下是pyte)支持它还是不支持都有可能。

假设你的主要应用程序是bash或其他使用readline库的应用程序,则可以尝试使用readline的backward-word(默认情况下为Meta-b / Alt-b / ESC b,可在inputrc中进行配置)。


12

使用 od -c 快速检查发现,gnome-terminal 生成了以下数值:

左箭头生成 ESC-[-D

组合键 Control+左箭头生成 ESC-[-1-;-5-D


好的,但gnome-terminal是TERM=xterm...那Linux呢? - johndodo
2
Linux控制台为两个按键生成ESC-[-D - Robᵩ
我知道它是这样的,因为我写了这个... :) 不过,这是针对控制台还是终端特定的? - johndodo
@johndodo:你所说的控制台特定或终端特定是什么意思?xterm是一个终端仿真器。pyte是一个终端仿真库。Konsole和Gnome-Terminal也是终端仿真器。Linux控制台是一个终端仿真器,实现在Linux内核中。控制台只是一个特殊的终端仿真器,系统管理员指定它以便从那里读取系统日志并启动某些特权操作。 - ninjalj
@ninjalj:所谓“console”,我指的是终端的一个特定实现(Linux console)。换句话说,Ctrl+Left在所有TERM=linux终端中是否生成与Left相同的序列,还是只在Linux控制台中生成? - johndodo

4

Ctrl+箭头键的编码是由xterm引入的,像Gnome终端和KDE Konsole等终端尝试与xterm兼容。实际上,VT100和VT220终端没有为这样的组合键提供单独的编码。据我所知,Linux终端旨在与VT100兼容,并添加了一些功能,而xterm则模拟了VT220,并添加了大量功能。


Linux控制台最初是试图模拟VT100,但在1990年代末添加UTF-8支持时,其中一部分(在字符集之间切换)丢失了。Linux控制台已经实现了基于VT220(或早期1990年代的xterm实现)的功能键(不是VT100的一部分)。与xterm不同,Linux功能键特性没有被扩展。 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接