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

标签 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 channel 生成预期的输出(这会使光标在普通的 linux shell 上向左移动一个词)。即使我以 term='xterm' 开始 paramiko 也是如此。

知道我应该使用什么顺序吗?或者为什么上面的顺序不起作用?

更新:我很乐意使用另一种终端类型(不是“linux”),但不幸的是pyte仅适用于 VTxxx 终端(我相信“linux”是类似 vt220 的终端 - 无论如何,它可以工作),所以 xterm 无法正常工作。

最佳答案

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

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

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

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

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

综上所述,Ctrl+arrow 是一种 xterm 行为(取决于配置选项),完全没有反射(reflect)在 terminfo/termcap 数据库中,因此大多数应用程序都不知道它.无论哪种方式,您的终端仿真器(在您的情况下为 pyte)支持或不支持。

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

关于linux - TERM=linux 中 ctrl + 箭头(左、右、...)的终端转义序列是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767702/

相关文章:

c++ - Mongodb 客户端的 SCons 找不到 libboost_system

javascript - 为什么框架和 github 要求你使用 Terminal?

javascript - knockout - keyCode 属性未通过包装函数传递

javascript - 使用 Javascript 动态移动元素位置

c - 从同一目录杀死进程

linux - "source in"如何使用shell脚本设置环境变量

c - 正在使用原子指针访问类型为 sig_atomic_t 的变量

java - 在 Java 中授予 macOS 上的权限后运行 .command 文件

java - 你能在 Linux 中仅使用名称而不使用 "java"命令来运行 Java 程序吗?

Javascript 不适用于移动设备,但适用于桌面,用于选项卡到四个 otp 框的下一个字段