如何在不更改TAB的情况下将命令绑定到Ci?

Ste*_*eve 29 emacs

在emacs中,我想将命令绑定到Ci.所以我说(global-set-key "\C-i" 'forward-word)

在我的.emacs文件中.这是有效的,除了现在TAB键也被绑定到'前向词.

如何在不更改TAB的情况下将命令绑定到Ci?

Tre*_*son 31

简而言之,这应该为您解决问题:

(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map))
(global-set-key (kbd "C-i") 'forward-word)
Run Code Online (Sandbox Code Playgroud)

更长的版本:

功能键上的emacs lisp文档:

在ASCII中,Ci和<TAB>是相同的字符.如果终端可以区分它们,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 is <tab> key
(global-set-key (kbd "<tab>") (lambda () (interactive) (message "<tab>")))
Run Code Online (Sandbox Code Playgroud)

请注意,每种模式都以不同方式设置各种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)
Run Code Online (Sandbox Code Playgroud)

  • 这不适合我.没有任何更改,'tab'键保持unbounrd状态.我尝试为<tab>做第二个"global-set-key",这部分解决了问题,但阻止了tab在迷你缓冲区中完成.使用下面的Caio解决方案似乎可以解决问题. (3认同)

小智 26

我发现这个解决方案经过多次痛苦后,在邮件档案中丢失了.它很简单,避免与其他模式冲突,并且是唯一适用于我的模式:

;; 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)
Run Code Online (Sandbox Code Playgroud)


小智 14

我推荐以下内容:

(define-key input-decode-map (kbd "C-i") (kbd "H-i"))
(global-set-key (kbd "H-i") 'whatever-you-want)
Run Code Online (Sandbox Code Playgroud)

它至少应该起作用于Emacs 23.

这类似于Caio答案中的键盘翻译技术,但操作稍高一些.

键盘翻译的缺点是,即使Emacs没有运行读键序列,它也会生效,特别是C-q C-i 不再作为插入文字制表符的方式.

修改local-function-key-map不能很好地工作,因为通常您希望<tab>密钥继续执行当前模式定义的任何内容TAB.