2012-12-30 63 views
3

對於具有混合類型的編程語言(如.html)的文件,語義分析代碼時出現問題。有沒有什麼辦法可以針對這些類型的文件專門禁用語義自動分析?如何爲特定類型的文件禁用語義

我使用的是內置CEDET使用Emacs 24來:

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 

回答

1

使用semantic-inhibit-functions。例如:

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

應該在所有非cc-mode緩衝區中禁用語義。

+0

'語義抑制功能'似乎很有用。謝謝 – RNA

+1

警告警告警告請勿運行上述代碼。它會覆蓋整個語義禁止函數列表!看看我的答案,而不是正確的方式添加到列表中的東西。 – buggy3

2

再如,禁用它特定模式:

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

它幾天前就開始工作了,但現在反正不會起作用,很奇怪。我已經把它改成了(add-hook'org-mode-hook'(lambda()(設置 (make-local-variable'semantic-mode)nil))),這是有效的。 – CodyChan

2

從語義文檔:

2.3.1不解析某些緩衝區

可以抑制使用解析語義抑制函數變量。

- 變量:功能語義禁制函數列表之前沒有參數的語義建立一個緩衝區 調用。如果這些 函數中的任何一個返回非零,則當前緩衝區未設置爲使用 語義。

你可以有這樣的抑制非常大的文件,或者造成特殊問題的語義文件 解析。

正確使用例如:

;; Disable Semantic's source referencing in lisp buffers. 
    (add-hook 'semantic-inhibit-functions 
      (lambda() (member major-mode '(emacs-lisp-mode)))) 

此將其添加到列表中(而不是覆蓋列表),並確保語義已被加載之後,它只能運行。

必須使用with-eval-after-load,因爲當你的用戶配置初始化語義包可能不會被加載。在這種情況下,你會得到一個錯誤,說明語義抑制函數變量不存在,並且你的覆蓋不會被應用。

這解決這些問題,比@湯姆和@德米特里的回答更好。

噢,我強烈建議阻止emacs-lisp模式,因爲否則Semantic會嘗試解析運行Emacs實例的整個源代碼樹,只要自動完成觸發,如果有很多軟件包會凍結Emacs。

+2

你可以做得更好,使用'add-hook'而不是'add-to-list'。這樣做會使'加載後不必要的'也是不必要的。 – Dmitry

+0

@Dmitry它是一個函數的**列表**,它將調用語義來檢查它是否應該爲每個緩衝區啓用它自己。使用add-hook(這是一個列表編寫器函數)會創建列表,如果該列表尚不存在,如果在init處語義覆蓋列表,將來可能會中斷。因此,正確的做法是像上面所做的那樣在'加載後加載列表'中進行換行。你可以谷歌它。 ;-) – buggy3

+1

'semantic-inhibit-functions'是一個'hook'類型的'defcustom'。所以語義本身應該擔心未來不會覆蓋它。而且,它是用'run-hook-with-args-until-success'處理的。 – Dmitry

相關問題