3

对于具有混合类型的编程语言的文件,例如 .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
4

3 回答 3

2

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

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

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

于 2012-12-30T21:42:53.753 回答
2

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

(add-to-list 'semantic-inhibit-functions
             (lambda () (member major-mode '(html-mode))))
于 2013-12-03T01:51:12.280 回答
2

来自语义文档:

2.3.1 不要解析某些缓冲区

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

— 变量:semantic-inhibit-functions 在语义设置缓冲区之前要调用的不带参数的函数列表。如果这些函数中的任何一个返回非零,则当前缓冲区未设置为使用语义。

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

正确使用示例:

  ;; 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。

于 2016-12-11T22:49:09.920 回答