Linux - 重新映射 Ctrl-[ 键

Linux - 重新映射 Ctrl-[ 键

在 Linux 上,Ctrl-[组合键似乎相当于按下该Esc键。我想将Ctrl-定义[为 Emacs 中的快捷键,但我无法做到这一点,因为当击键到达 Emacs 时,它看起来就像Esc按下了该键。有没有办法禁用此行为,以便Ctrl-[只是意味着Ctrl- [

使用 GNOME 运行 Ubuntu 9.10。

答案1

假设您直接在窗口系统(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))

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

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

  • 字符编号 27,在某些系统上由键发送Esc。Emacs 显示为ESC显示按键序列时,\e在字符串中。

  • Esc本身(在 X Window 中,这表示Escape键符)。Emacs 将其显示为escape除非翻译(见下文)。

Emacs 通常翻译escapeESC,但这是在相对较高的层次上完成的,在function-key-map,因此可以通过修改或在全局键映射或本地键映射中function-key-map定义绑定来覆盖它。GNU Emacs 23 引入了适用于每种终端类型的功能。escapelocal-function-key-map

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

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

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


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

  • C-i,,TAB\t tab
  • C-m,,,,RET\rreturn

答案2

根据您的 xterm,您可能能够使用bindkey。尝试在 shell 提示符下执行此命令:

bindkey ^] tty-dsusp

相关内容