Показывать закрытые блоки #ifdef в Emacs

Можно ли отображать текущие блоки #ifdef в Emacs (например, в строке режима)?

Например:

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

Он должен показывать A в строке режима, если я помещаю курсор в позицию 1 и покажите A & !(!B & C) в позиции 2. Я уже использую режим hide-if-def. Но иногда мне нужно работать со всеми блоками #ifdef.

Ответ 1

Я не всегда имел успех с WhatFunction, но он должен хорошо работать с кодом 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))