是否有任何可以处理所有组合键的 linux 终端?

Yos*_*ian 11 terminal-emulator terminal konsole tty

我喜欢在终端模式 ( -nw)下使用 emacs ,但似乎大多数(所有?)终端无法处理某些组合键 - 例如,C-<RET>C-M-%. 我知道这是因为大多数终端模拟 VT-100,它没有这些组合。是否有任何 linux 终端(最好是 KDE)可以处理这些组合键,或者这是所有终端的基本限制?

Gil*_*il' 17

当您按下终端中的一个键或组合键时,它会作为一个或多个字符的序列传输到终端中运行的应用程序。例如,当您按下 时a,应用程序会收到a。当您按下 时Enter,应用程序会收到字符CR(又名^M(发音为“control-emm”),又名字符号 13,又名\r\015)。涉及的键组合Alt通常以字符ESC^[又名\e\033)的形式传输,后跟不带 的键或键组合的序列Alt。功能键和其他组合键作为以\e[或开头的转义序列传输\eO

转义序列没有完全标准化,终端通常会忽略某些键的某些属性。例如,Ctrl+ Shift+letter经常发送酷似Ctrl+letter默认。

你可以看到通过按组合键终端发送的内容Ctrl+V其次是组合键,在shell提示下,或C-qC-h c之后在Emacs的组合键。

使用某些终端模拟器,您可以为每个键配置转义序列。在 Xterm 上,这是通过X resources完成的。大多数设置从~/.XresourcesX 启动时读取资源,您可以使用xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")
Run Code Online (Sandbox Code Playgroud)

一个常见的约定是使用ESC [ number1 ; number2 ~带有修饰符的功能键形式的转义序列。number1表示功能键(15to 24for F5to F12— 由于历史原因,F1 到F4有不同的转义序列)并number2表示修饰符(2for Shift3for Meta5for Ctrl7for Ctrl+ Meta,并加 1 forShift与至少之一CtrlMeta)。

Emacs 通过input-decode-maplocal-function-key-map(或function-key-map在 Emacs 23 之前)将转义序列转换为其内部密钥表示。

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
Run Code Online (Sandbox Code Playgroud)

  • @Yossarian 是的。除了不冲突之外,转义序列需要是明确的,即没有转义序列应该是另一个的前缀。这意味着实际上第一个字符必须是`ESC`(除非你想尝试一些≥128的字符,但这会限制可能的输入编码),而第二个字符必须是你不想要`ESC foo的东西` 绑定。 (2认同)
  • 请注意,[Thomas Dickey 的 xterm](http://invisible-island.net/xterm/xterm.html) 正在积极开发中。使用 `XTerm*modifyOtherKeys: 2` 资源,即使对于 `CM-` 组合,它也会生成唯一的序列,但使用该设置,您将需要提供大量自定义映射(`XTerm*modifyOtherKeys: 1` 能力较弱,但远开箱即用的更多功能)。举个例子(尽管它对我不起作用)请参阅 [easymacs](http://sourceforge.net) 中的 `xterm-extras.el` 库和相关的 `.Xresources` 和 `.inputrc` 文件/projects/easymacs/) 下载。 (2认同)