Linux - 重新映射 Ctrl-[ 键

3 linux keyboard-shortcuts emacs

在 Linux 上,Ctrl-[组合键似乎等同于Esc按下键。我想将Ctrl-定义[为 Emacs 中的快捷方式,但我无法定义,因为当按键到达 Emacs 时,它看起来像是Esc按下了键。无论如何要禁用这种行为,以便Ctrl-[只是意味着Ctrl- [

使用 GNOME 运行 Ubuntu 9.10。

Gil*_*il' 5

假设您直接在窗口系统(Cocoa、MS-DOS、Windows、X 等)下运行 Emacs,而不是在文本终端(gnome-terminal、konsole、rxvt、xterm 等)内运行,这是可能的.

(define-key key-translation-map [?\C-\[] [(control left_bracket)])
(define-key key-translation-map [escape] [?\e])
(define-key function-key-map [escape] nil)
(define-key function-key-map [?\e] nil)
(when (boundp 'local-function-key-map)
  ;;(define-key local-function-key-map [escape] nil)
  (defun remove-escape-from-local-function-key-map ()
    (define-key local-function-key-map [?\e] nil)
    (define-key local-function-key-map [escape] nil))
  (add-hook 'term-setup-hook 'remove-escape-from-local-function-key-map))
Run Code Online (Sandbox Code Playgroud)

这里有三个不同的输入事件:

  • Ctrl+ [,即control修饰符和发送字符的键[。如果没有特殊情况,Emacs 通常会将其显示为C-[(并被C-[接受kbd),如下所述。

  • 字符号 27,Esc在某些系统上由密钥发送。Emacs 将其显示为ESC显示键序列和\e字符串。

  • Esc密钥本身(在X Window,这意味着Escape键符)。Emacs 将此显示为escape除非已翻译(见下文)。

Emacs 通常转换escapeESC,但这是在相对较高的级别完成的, in function-key-map,因此可以通过修改function-key-map或定义escape全局键映射或本地键映射中的绑定来覆盖它。GNU Emacs 23 介绍了local-function-key-map哪个适用于每个终端类型。

Emacs 总是在非常低的级别(in )转换C-[ESC, keyboard.c。这是不可配置的。

然而,Emacs 提供了一种在相对较低级别翻译键的方法:key-translation-map. 这适用于任何全局或本地绑定之前,但仅适用于不在function-key-map. 因此,关键是交流ESC,并escape在这一点上。

这些机制在 Emacs Lisp 手册的“翻译键盘映射”标题下进行了描述。


顺便说一下,类似的原则适用于

  • C-i, TAB,\t tab
  • C-m, RET, \r,return