Emacs 如何禁用特定类型文件的语义
对于使用混合编程语言类型(如.html)的文件,semantic在分析代码时遇到困难。有没有办法专门禁用这些类型文件的自动语义分析功能 我正在使用Emacs 24附带的内置cedet: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 --------------------------------------------
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删除:)