在 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 通常翻译escape
成ESC
,但这是在相对较高的层次上完成的,在function-key-map
,因此可以通过修改或在全局键映射或本地键映射中function-key-map
定义绑定来覆盖它。GNU Emacs 23 引入了适用于每种终端类型的功能。escape
local-function-key-map
Emacs 总是在非常低的级别(在)转换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
答案2
根据您的 xterm,您可能能够使用bindkey
。尝试在 shell 提示符下执行此命令:
bindkey ^] tty-dsusp