如何禁用特定类型文件的语义

时间:2012-12-30 18:46:25

标签: emacs cedet emacs-semantic

对于混合类型的编程语言(如.html)的文件,语义分析代码时遇到问题。有没有办法专门为这些类型的文件禁用语义自动分析?

我正在使用Emacs 24附带的内置cedet:

CEDET Version:  1.0
            Requested   File        Loaded
  Package       Version     Version     Version
  ----------------------------------------------------------
  cedet:        1.0     nil     ok
  eieio:        1.3     nil     ok
  semantic:     2.0     nil     ok
  srecode:      1.0     nil     ok
  ede:          1.0     nil     ok
  speedbar:     1.0     nil     ok

3 个答案:

答案 0 :(得分:2)

另一个例子,为特定模式禁用它:

(add-to-list 'semantic-inhibit-functions
             (lambda () (member major-mode '(html-mode))))

答案 1 :(得分:2)

来自语义文档:

  

2.3.1不要解析某些缓冲区

     

您可以使用semantic-inhibit-functions变量禁止解析。

     

- 变量:semantic-inhibit-functions要调用的函数列表   语义之前没有参数设置缓冲区。如果有的话   函数返回非nil,当前缓冲区未设置使用   语义。

     

你可以在非常大的文件或文件中禁止解析   这会导致特定的语义问题。

正确的用法示例:

  ;; Disable Semantic's source referencing in lisp buffers.
  (add-hook 'semantic-inhibit-functions
            (lambda () (member major-mode '(emacs-lisp-mode))))

这会将其添加到列表中(而不是覆盖列表),并确保它仅在语义加载后运行。

您必须使用with-eval-after-load,因为在您的用户配置初始化时可能无法加载语义包。在这种情况下,你会得到一个错误,说语义禁止函数变量不存在,你的覆盖也不会被应用。

这解决了这些问题,并且比@ Tom和@Dmitry的答案更好。

哦,我强烈建议阻止emacs-lisp-mode,因为否则Semantic会在触发自动完成时尝试解析正在运行的Emacs实例的整个源代码树,如果你有很多软件包,它将冻结Emacs。

答案 2 :(得分:1)

使用semantic-inhibit-functions。例如,这个:

(setq semantic-inhibit-functions
      (list (lambda () (not (and (featurep 'cc-defs)
                                 c-buffer-is-cc-mode)))))

应该禁用所有非cc-mode缓冲区中的语义。