Emacs CEDET Hook

时间:2014-03-10 04:15:31

标签: emacs elisp cedet

我想将CEDET模式挂钩到c ++模式。我在.emacs文件中使用以下脚本:

(add-hook 'c++-mode-hook
      (lambda ()
        ...
        (my_cedet_load)
        )
      )

,其中

(defun my_cedet_load ()
  (interactive)
  (semantic-mode)
  (global-semantic-stickyfunc-mode t)
  (global-semantic-idle-scheduler-mode t)
  (global-semantic-idle-completions-mode t)
  (global-semantic-highlight-edits-mode t)
)

现在,问题在于,一旦打开.cpp文件,就会在所有缓冲区中启用语义模式。我如何仅在.cpp文件中启用此类模式?

2 个答案:

答案 0 :(得分:2)

语义是全局次要模式。来自semantic.el

  

要启用语义,请启用“语义模式”,即全局次要模式(M-x   语义模式RET,或“工具”菜单中的“源代码解析器”)。至   在启动时启用它,将(语义模式1)放入init文件中。

当你执行semantic-mode时,它会在所有缓冲区中启用。您可以使用semantic-inhibit-functions来限制激活semantic的缓冲区。从文档

  

在设置Semantic之前无需参数调用的函数列表。   如果这些函数中的任何一个返回非nil,则当前缓冲区不返回   设置使用Semantic。

以下是使用此变量的示例。它会指示semantic仅在c-modecc-modejava-mode个缓冲区中激活

(add-to-list 'semantic-inhibit-functions
                 (lambda () (not (member major-mode '(java-mode c-mode c++-mode)))))

答案 1 :(得分:1)

我猜测关键在于global这个词。 因此,请使用semantic-stickyfunc-mode代替global-semantic-stickyfunc-mode等。

UPDATE:

试试这个:

(add-hook 'c++-mode-hook 'my-c++-hook)

(defun my-c++-hook ()
  (semantic-mode 1)
  (semantic-stickyfunc-mode 1)
  (semantic-idle-scheduler-mode 1)
  (semantic-idle-completions-mode 1)
  (semantic-highlight-edits-mode 1))