对于混合类型的编程语言(如.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
答案 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
缓冲区中的语义。