12

我正在浏览器中构建一个终端窗口(例如 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 不起作用适当地。

4

3 回答 3

24

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

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

Unix 系统具有描述终端和终端仿真器的数据库,因此应用程序从正在使用的特定终端(或终端仿真器)中抽象出来。较旧的数据库是termcap(5),而terminfo(5)是较新的数据库。这些数据库允许应用程序查询正在使用的终端的功能。能力可以是布尔值、数字能力,甚至是字符串能力,例如:如果特定终端类型具有/支持 F12 键,它将具有能力“key_f12”(长期信息名称)、“kf12”(短期信息名称)、 “F2”(termcap 名称)描述 key 产生的字符串。试试看: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)。

于 2011-10-16T11:23:18.803 回答
11

快速检查od -c显示 gnome-termainal 生成这些值:

左箭头生成ESC- [- D

Control-left-array 生成ESC- [- 1- ;- 5-D

于 2011-10-14T14:23:07.993 回答
4

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

于 2011-10-15T19:05:50.230 回答