【问题标题】:what is terminal escape sequence for ctrl + arrow (left, right,...) in TERM=linuxTERM = linux中ctrl +箭头(左,右,...)的终端转义序列是什么
【发布时间】:2011-10-14 12:38:29
【问题描述】:

我正在浏览器中构建一个终端窗口(例如 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 不能正常工作。

【问题讨论】:

  • 一个典型的默认 readline 配置(bash 使用 readline)有 Alt-B 表示 backward-word。 terminfo 甚至没有Ctrl-← 的条目。
  • 但它可以在 xterm 控制台上运行...您能否详细介绍一下 terminfo,最好是在答案中?
  • Linux 控制台甚至没有接近到 vt220。它是(功能较弱的)vt100 的子集。此问题的每个答案都至少有一个错误。

标签: linux terminal keycode xterm vt100


【解决方案1】:

od -c 的快速检查表明 gnome-termainal 生成了这些值:

左箭头生成ESC-[-D

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

【讨论】:

  • 好的,但是 gnome-terminal 是 TERM=xterm... linux 呢?
  • Linux 控制台为两次击键生成ESC-[-D
  • 我知道是这样,我是这么写的... :) 不过,这是特定于控制台还是特定于终端?
  • @johndodo:您所说的特定于控制台或特定于终端是什么意思? xterm 是一个终端仿真器。 pyte 是一个终端仿真库。 Konsole 和 Gnome-Terminal 也是终端仿真器。 Linux 控制台是一个终端仿真器,在 Linux 内核中实现。控制台实际上是系统管理员指定的特殊终端仿真器,因此他可以读取系统日志并从那里启动某些特权操作。
  • @ninjalj:“控制台”是指终端的特定实现(Linux 控制台)。换句话说:Ctrl+Left 是否在所有 TERM=linux 终端或仅在 Linux 控制台中生成与 Left 相同的序列?
【解决方案2】:

终端是由键盘和输出设备(最初是硬拷贝打印机,后来是 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,可在@ 中配置) 987654331@) 代替。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Linux 控制台开始尝试模拟 VT100,但在 1990 年代后期添加 UTF-8 支持时,其中的一部分(字符集之间的切换)丢失了。 Linux 控制台已经实现了基于 VT220(或 1990 年代早期的 xterm 实现)的功能键(VT100 不包含的功能)。与 xterm 不同,Linux 功能键特性没有被扩展。
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多