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

Emacs 如何禁用特定类型文件的语义,emacs,cedet,emacs-semantic,Emacs,Cedet,Emacs Semantic,对于使用混合编程语言类型(如.html)的文件,semantic在分析代码时遇到困难。有没有办法专门禁用这些类型文件的自动语义分析功能 我正在使用Emacs 24附带的内置cedet: CEDET Version: 1.0 Requested File Loaded Package Version Version Version --------------------------------------------

对于使用混合编程语言类型(如.html)的文件,semantic在分析代码时遇到困难。有没有办法专门禁用这些类型文件的自动语义分析功能

我正在使用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

使用
语义禁止功能
。例如,这:

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

应在所有非cc模式下禁用语义。

另一个示例,要在特定模式下禁用语义:

(add-to-list 'semantic-inhibit-functions
             (lambda () (member major-mode '(html-mode))))
从语义文档:

2.3.1不要解析某些缓冲区

可以使用语义禁止函数变量禁止解析

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

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

正确使用示例:

  ;; Disable Semantic's source referencing in lisp buffers.
  (add-hook 'semantic-inhibit-functions
            (lambda () (member major-mode '(emacs-lisp-mode))))
这会将它添加到列表中(而不是覆盖列表),并确保它仅在语义加载后运行

加载后必须将
与eval一起使用
,因为在用户配置初始化时可能不会加载语义包。在这种情况下,您将得到一个错误,说明语义禁止函数变量不存在,并且您的覆盖将不被应用

这解决了这些问题,比@Tom和@Dmitry的答案要好


哦,我强烈建议阻止emacs lisp模式,因为否则每当触发自动完成时,Semantic将尝试解析正在运行的emacs实例的整个源代码树,如果您有很多包,这将冻结emacs。

它在几天前起作用,但现在无论如何都不起作用,很奇怪。我已经将其更改为(add hook'org mode hook'(lambda()(set(make local variable'semantic mode)nil)),这很有效。您可以做得更好,使用
add hook
而不是
add to list
。这将使加载后使用eval的
也变得不必要。@Dmitry这是一个函数列表,semantic将调用它来检查它是否应该为每个缓冲区启用自己。如果列表还不存在,使用addhook(它是一个列表编写器函数)将创建该列表,如果语义在init时覆盖该列表,该列表将来可能会中断。因此,正确的方法是使用eval after load add to list包装
,就像我上面所做的那样。你可以用谷歌搜索它<代码>语义禁止功能
是一个类型为
hook
defcustom
。所以语义本身应该担心将来不会覆盖它。此外,它通过
运行带有args的hook进行处理,直到成功
@Dmitry谢谢,这是一个伟大的发现。我已经更新了代码示例,以便在加载后使用eval删除:)