在emacs中,我想将命令绑定到Ci.所以我说(global-set-key "\C-i" 'forward-word)
在我的.emacs文件中.这是有效的,除了现在TAB键也被绑定到'前向词.
如何在不更改TAB的情况下将命令绑定到Ci?
简而言之,这应该为您解决问题:
(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map)) (global-set-key (kbd "C-i") 'forward-word)
更长的版本:
从功能键上的emacs lisp文档:
在ASCII中,Ci和
是相同的字符.如果终端可以区分它们,Emacs通过将前者表示为整数9,将后者表示为符号制表符,将区别传达给Lisp程序. 大多数时候,区分这两者并没有用.因此,通常将local-function-key-map(请参见翻译键映射)设置为将制表符映射到9.因此,字符代码9(字符Ci)的键绑定也适用于制表符.同样,对于该组中的其他符号.函数read-char同样将这些事件转换为字符.
因此,一旦执行以下操作,您就可以看到键绑定的不同之处:
(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map)) ;; this is C-i (global-set-key (kbd "C-i") (lambda () (interactive) (message "C-i"))) ;; this iskey (global-set-key (kbd " ") (lambda () (interactive) (message " ")))
请注意,每种模式都以不同方式设置各种TAB绑定,因此您可能需要按照您关心的每种模式进行自定义.
版本依赖性:
以上适用于Emacs 23.1.来自NEWS文件:
现在使用`local-function-key-map'(一个新变量)映射功能键序列.这继承自全局变量function-key-map,不再直接使用.
这意味着,在版本22和更早版本中,您可以通过使用变量获得相同的效果function-key-map
.我测试了这个并发现它可以与Emacs 21一起使用.
(setq local-function-key-map (delq '(kp-tab . [9]) function-key-map)) (global-set-key (kbd "C-i") 'forward-word)
我发现这个解决方案经过多次痛苦后,在邮件档案中丢失了.它很简单,避免与其他模式冲突,并且是唯一适用于我的模式:
;; Translate the problematic keys to the function key Hyper: (keyboard-translate ?\C-i ?\H-i) (keyboard-translate ?\C-m ?\H-m) ;; Rebind then accordantly: (global-set-key [?\H-m] 'delete-backward-char) (global-set-key [?\H-i] 'iswitchb-buffer)
我推荐以下内容:
(define-key input-decode-map (kbd "C-i") (kbd "H-i")) (global-set-key (kbd "H-i") 'whatever-you-want)
它至少应该起作用于Emacs 23.
这类似于Caio答案中的键盘翻译技术,但操作稍高一些.
键盘翻译的缺点是,即使Emacs没有运行读键序列,它也会生效,特别是C-q C-i
不再作为插入文字制表符的方式.
修改local-function-key-map不能很好地工作,因为通常您希望
密钥继续执行当前模式定义的任何内容TAB
.