【问题标题】:How to disable semantic for specific type of files如何禁用特定类型文件的语义
【发布时间】:2012-12-30 18:46:25
【问题描述】:

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

【问题讨论】:

    标签: emacs cedet emacs-semantic


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 几天前可以用,但现在不管用了,奇怪。我已经将其更改为 (add-hook 'org-mode-hook '(lambda() (set (make-local-variable 'semantic-mode) nil))),这样就可以了。
      【解决方案3】:

      来自语义文档:

      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。

      【讨论】:

      • 你可以做得更好,使用add-hook而不是add-to-list。这也会使with-eval-after-load 变得不必要。
      • @Dmitry 这是一个函数列表,语义将调用来检查它是否应该为每个缓冲区启用自身。如果列表尚不存在,则使用 add-hook(这是一个列表编写器函数)将创建列表,如果语义在初始化时覆盖列表,则将来可能会中断。因此,正确的方法是像我在上面所做的那样包含with-eval-after-load add-to-list。你可以谷歌一下。 ;-)
      • semantic-inhibit-functionsdefcustom,类型为 hook。所以 Semantic 本身应该担心将来不会覆盖它。此外,它使用run-hook-with-args-until-success处理。
      • @Dmitry 谢谢,这是一个很棒的发现。我已经更新了代码示例以删除 with-eval-after-load :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2017-05-24
      • 2013-05-03
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多