在EMACS的org模式中如何覆盖Ctrl-TAB快捷键?

14

我想在 EMACS 中使用 Ctrl + Tab,但 Emacs org mode 已经绑定了这个组合键。如何使用我自己的绑定而不是 org-mode 的绑定。

在我的 .emacs 文件中,我使用:

(global-set-key (kbd "<C-tab>") 'switch-view )

除了在org-mode中,它可以在任何地方正常工作。

3个回答

26

你描述的键绑定在org.el中定义如下:

(org-defkey org-mode-map [(control tab)] 'org-force-cycle-archived)

这意味着它仅在org-mode-map中有效,这是org-mode的本地按键映射之一。以下代码添加了一个在org-mode启动时运行的hook。它只是从org-mode-map中删除了该按键绑定。

(add-hook 'org-mode-hook
          '(lambda ()
             (define-key org-mode-map [(control tab)] nil)))
将此代码添加到您的.emacs文件中,然后重新启动emacs。

我在我的.emacs文件中添加了这个钩子,但没有任何变化。 - yazzapps.com
我也尝试在org.el中注释掉ord-defkey,但没有任何变化。我猜测有一些预编译正在进行,所以修改后的org.el文件被忽略了。 - yazzapps.com
那么假设是钩子没有起作用,我该如何启用“钩子”?或者我对它的工作方式有误解? - yazzapps.com
谢谢!!!"(define-key org-mode-map [(control tab)] nil)"现在可以工作了。是的,超出范围的错误在我的代码中...感谢您帮我解决问题! :) - yazzapps.com
使用eval-after-load也可以正常工作(代码只需要评估一次,而不是每次启动org模式时都要进行评估)。 - YoungFrog
显示剩余6条评论

5
一种更强大的设置按键绑定的方法是定义一个带有自定义键位映射的全局次要模式,以使其在任何主模式下都生效,而不受影响。

次要模式也可以有本地键位映射;每当次要模式生效时,其键位映射中的定义会覆盖主模式的本地键位映射和全局键位映射

http://www.gnu.org/software/emacs/manual/html_node/emacs/Local-Keymaps.html

这样,您就不需要每次遇到破坏您按键绑定的模式时都要深入研究主模式的本地键位映射。
请查看此问答以获取详细信息:
Globally override key binding in Emacs

2

这个不起作用,因为正如您所说,org-mode使用自己的C-TAB按键绑定。换句话说,即使您定义了全局按键绑定,一旦调用org-mode,它就会用本地按键绑定覆盖该绑定。

但是,您可以添加一个回调函数,每当您启动org-mode时调用该函数,在该回调函数中将C-TAB重置为调用switch-view:

(add-hook 'org-mode-hook (lambda () (local-set-key [(control tab)] 'switch-view)))

将上述代码放到您的 .emacs 文件中,下次启动 Emacs 时即可使用。

我将上述行添加到了我的.emacs文件的末尾,但它完全没有任何影响。 - yazzapps.com
你在 .emacs 文件中添加了那行代码后,有重新启动 Emacs 吗?你使用的是哪个版本的 Emacs? - Thomas
其实,我认为我更喜欢paprika的版本。我也尝试过那个版本,在GNU Emacs 23.1.1中它对我很有效。 - Thomas
是的,我已经重新启动了Emacs好几次。GNU版本23.2处于“-nw”模式。 - yazzapps.com
(lambda ...) 前面应该加引号吗? - John D. Cook
@JohnD.Cook 你可以引用一下,但是lambda表达式本身就是自引用的。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接