在Emacs中显示封闭的#ifdef块

10
在Emacs中是否可以显示当前的#ifdef块(例如在模式行中)?
例如:
#ifdef A
... | #cursor position num. 1
#ifdef !B & C
...
#else /* !B & C */
foo(); | #cursor position num. 2
#endif /* !B & C */
#endif /* A */

如果我将光标放在位置1,则模式行应显示A,如果我将光标放在位置2,则应显示A & !(!B & C)。我已经使用了hide-if-def模式,但有时需要处理所有#ifdef块。


虽然这不是一个回答,但使用 C-c C-u 跳转到最近的 #ifdef 非常有用。之后,您可以使用 C-u C-<SPC> 返回到原来的位置。 - Duncan Jones
1个回答

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))

谢谢你的工作,但我认为它只在使用简单的ifdef时有用。当我处于“else”状态时,它显示“ifdef A”。我希望在这种情况下看到“ifdef!A”或“ifndef A”。它也无法处理复杂的“ifdefs”。我的项目中有很多嵌套的ifdefs。也许实现这样的功能几乎是不可能的。 - folq
@folq - 没错,您想要代码来执行子句上的实际布尔逻辑,随着您的推进。您可以使用我的代码开始组装它,但这是一个比我想承担的更大的任务。 - Trey Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接