2015-08-08 30 views
10

是否可以在Emacs中顯示當前的#ifdef塊(例如在模式行中)?在Emacs中顯示包含#ifdef塊

例如:

#ifdef A 
... | #cursor position num. 1 
#ifdef !B & C 
... 
#else /* !B & C */ 
foo(); | #cursor position num. 2 
#endif /* !B & C */ 
#endif /* A */ 

應該在模式行顯示A,如果我我已經使用隱藏-IF-除霜模式放到位1 光標並顯示A & !(!B & C)在位置2 。但有時我需要使用所有#ifdef塊。

+0

不是答案,但是用'C-C C-u'跳到最近的封閉'#ifdef'是非常有用的。然後你可以使用'C-u C- '返回你所在的位置。 –

回答

3

我並沒有總是成功地使用WhichFunction,但它應該很好地處理C/C++代碼。這種自定義將爲識別方案添加一個新功能,該功能會告訴你何時位於#ifdef塊內。

(require 'which-func) 
(which-function-mode 1) 
(defun name-of-current-conditional() 
    "rather inelegant coding, but it works" 
    (interactive) 
    (let (outer) 
    (condition-case nil 
     (dotimes (myv 10) 
      (save-excursion 
      (c-up-conditional (1+ myv)) 
      (setq outer (buffer-substring-no-properties 
           (line-beginning-position) 
           (line-end-position))))) 
     (error nil)) 
    outer)) 
(setq which-func-functions '(name-of-current-conditional)) 
+0

感謝您的工作,但我認爲這隻適用於使用簡單ifdef的情況。當我在「其他」下時顯示「ifdef A」。我想在這種情況下看到「ifdef!A」或「ifndef A」。它也不處理複雜的「ifdefs」。我的項目中有很多嵌套的ifdefs。也許有這樣的功能幾乎是不可能的。 – folq

+0

@folq - 對,你希望代碼在你出去時在子句上做實際的布爾邏輯。你可以使用我的代碼開始把它們放在一起,但這是一個比我想要做的更大的任務。 –