2012-12-30 65 views
3

对于具有混合类型的编程语言(如.html)的文件,语义分析代码时出现问题。有没有什么办法可以针对这些类型的文件专门禁用语义自动分析?如何为特定类型的文件禁用语义

我使用的是内置CEDET使用Emacs 24来:

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 

回答

1

使用semantic-inhibit-functions。例如:

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

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

+0

'语义抑制功能'似乎很有用。谢谢 – RNA

+1

警告警告警告请勿运行上述代码。它会覆盖整个语义禁止函数列表!看看我的答案,而不是正确的方式添加到列表中的东西。 – buggy3

2

再如,禁用它特定模式:

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

它几天前就开始工作了,但现在反正不会起作用,很奇怪。我已经把它改成了(add-hook'org-mode-hook'(lambda()(设置 (make-local-variable'semantic-mode)nil))),这是有效的。 – CodyChan

2

从语义文档:

2.3.1不解析某些缓冲区

可以抑制使用解析语义抑制函数变量。

- 变量:功能语义禁制函数列表之前没有参数的语义建立一个缓冲区 调用。如果这些 函数中的任何一个返回非零,则当前缓冲区未设置为使用 语义。

你可以有这样的抑制非常大的文件,或者造成特殊问题的语义文件 解析。

正确使用例如:

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

此将其添加到列表中(而不是覆盖列表),并确保语义已被加载之后,它只能运行。

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

这解决这些问题,比@汤姆和@德米特里的回答更好。

噢,我强烈建议阻止emacs-lisp模式,因为否则Semantic会尝试解析运行Emacs实例的整个源代码树,只要自动完成触发,如果有很多软件包会冻结Emacs。

+2

你可以做得更好,使用'add-hook'而不是'add-to-list'。这样做会使'加载后不必要的'也是不必要的。 – Dmitry

+0

@Dmitry它是一个函数的**列表**,它将调用语义来检查它是否应该为每个缓冲区启用它自己。使用add-hook(这是一个列表编写器函数)会创建列表,如果该列表尚不存在,如果在init处语义覆盖列表,将来可能会中断。因此,正确的做法是像上面所做的那样在'加载后加载列表'中进行换行。你可以谷歌它。 ;-) – buggy3

+1

'semantic-inhibit-functions'是一个'hook'类型的'defcustom'。所以语义本身应该担心未来不会覆盖它。而且,它是用'run-hook-with-args-until-success'处理的。 – Dmitry

相关问题