2012-04-22 47 views
3

在Emacs 24+的开发版本中,通过ELPA使用jtags-mode(版本0.96),我似乎无法以编程方式启用次要模式(手动调用可以正常工作)。在我钻研了我所尝试过的血淋淋的细节以及我期望能够工作的设置之前,最重要的是,在向Java钩子变量添加jtags-mode之后,当我第一次访问Java源代码时,我得到了Emacs的以下抱怨文件:如何自动启用Emacs jtags-mode?

Toggling jtags-mode off; better pass an explicit argument. [2 times] 

后彻底阅读jtags-mode设置的文档,我希望下面就足矣:

;; Support for Java coding. 
(autoload 'jtags-mode "jtags" "Toggle jtags mode." 1) 

(defun java-setup() 
    (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92) 
    indent-tabs-mode nil 
    tab-width 4 
    fill-column 96 
    c-comment-start-regexp "\\(@\\|/\\(/\\|[*][*]?\\)\\)" 
    jtags-display-menu-flag t 
    jtags-mode 1) 
    (java-mode-indent-annotations-setup)) 

(add-hook 'java-mode-hook 'java-setup) 
(add-hook 'java-mode-hook 'jtags-mode) 
... 

但是,这导致了投诉上方。自从我试图在java-setup()函数中直接调用jtags-mode,无济于事。

如果没有明显或简单的解决方案,我很乐意指出如何调试此问题。

回答

4

函数xxx-mode通常是toggle函数在没有参数的情况下被调用,即它们在模式关闭的情况下打开模式,反之亦然。正如你已经将这个函数添加到钩子,这就是它被调用的方式。几个小模式提供了一个功能,如turn-on-xxx-mode,这些功能可以直接添加到钩子中。

当用参数调用时,1通常激活它们,-1取消激活。尝试从您的设置功能调用它,而不是将jtags-mode函数添加到钩子

我建议从您的设置功能激活次要模式。此外,在您的设置代码中,您将jtags-mode变量设置为1,但这并不是正确的做法。例如:

(defun java-setup() 
    (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92) 
    indent-tabs-mode nil 
    tab-width 4 
    fill-column 96 
    c-comment-start-regexp "\\(@\\|/\\(/\\|[*][*]?\\)\\)" 
    jtags-display-menu-flag t) 
    (jtags-mode 1) 
    (java-mode-indent-annotations-setup)) 

(add-hook 'java-mode-hook 'java-setup) 

最后一个保留。我没有使用jtags-mode,这个答案是基于小模式如何工作的一般知识。

+0

是的,这是我尝试过的许多事情之一,再次无济于事。谢谢。 – pajato0 2012-04-22 20:19:15

+0

尝试清除'java-mode-hook'变量(或重新启动Emacs)。如果你不这样做,你仍然会调用添加到它的所有函数(包括'jtags-mode')。 – Lindydancer 2012-04-23 05:44:16

+0

这是问题!谢谢,很好地完成。 – pajato0 2012-04-23 05:46:52

0

顺便说一句,如果你用Emacs-24重新编译了jtags-mode文件,这个问题应该会消失,因为Emacs-24在这方面改变了次要模式的工作方式,所以缺少参数并不意味着再切换。这个改变是因为你遇到的问题而产生的。