Emacs C模式缩进问题与Doxygen风格评论

时间:2009-09-22 19:48:48

标签: emacs

我在c-mode中使用emacs缩进功能进行doxygen风格的多行注释时出现问题。根据doxygen手册(http://www.doxygen.nl/manual/docblocks.html),接受以下表格。

 /********************************************//**
 *  ... text
 ***********************************************/

我正在尝试在emacs中使用这种格式,但是当我在'* ... text'行中选中时,*最终会在第一行末尾的/ **下面,如下所示:

 /********************************************//**
                                                *  ... text
 ***********************************************/

有关如何解决此问题的任何建议?仍在学习emacs的所有内容。

2 个答案:

答案 0 :(得分:4)

它缩进的原因是(默认情况下)多行注释与前一行注释的开头对齐。在这种情况下,包含注释的开始位于第47列。

现在,如何解决它。以下是我如何解决问题的方法,解决方案就在最后。

首先是cc-mode manual,特别是customizing indentation上的部分。一个有用的键是C-c C-s,它告诉您哪种语法用于缩进。在这种情况下,它是((c 61)) - c是目前的重要部分。

要以交互方式自定义它,您可以键入C-c C-o(当该点位于要修复其缩进的行上时)。系统将提示您要自定义哪个语法条目(在这种情况下默认为c b / c,这是当前语法),然后系统会提示您要将语法条目更改为(默认为c-lineup-C-comments)。

现在我们可以查看该功能,了解我们如何定制它以满足您的需求。 M-x find-function c-lineup-C-comments

这就是变得更加困难的地方。您可以自定义cc模式处理注释缩进的方式,但您希望它执行的操作(在本例中)是识别您所在的c-comment紧接着另一个 c-comment,以及 注释是您要将缩进对齐的那个。

你是怎么做到的?我能想到的最简单的方法是advise 'c-lineup-C-comments识别这种特殊情况,并将其第一个参数的值更改为您想要的值。我的有限测试显示这适用于您的示例:

(defadvice c-lineup-C-comments (before c-lineup-C-comments-handle-doxygen activate)
  (let ((langelm (ad-get-arg 0)))
    (save-excursion
      (save-match-data 
        (goto-char (1+ (c-langelem-pos langelem)))
        (if (progn
              (beginning-of-line)
              ;; only when the langelm is of form (c . something)
              ;; and we're at a doxygen comment line
              (and (eq 'c (car langelm))
                   (looking-at "^\\(\\s-*\\)/\\*+//\\*\\*$")))
            ;; set the goal position to what we want
            (ad-set-arg 0 (cons 'c (match-end 1))))))))

这个建议的最终结果应该是传递给c-lineup-C-comments的参数应该从(c . 61)转换为(c . 17)(或类似的东西),实际上是欺骗例行程序排队使用该行开头的注释,而不是您当前正在修改的注释。

答案 1 :(得分:0)

您使用的是哪个版本的emacs?我的emacs 22有这个问题,但在emacs 23的另一台机器上没有。由于一些“电”压痕,这是probalby。尝试使用M-x describe-key RET RET和M-x describe-mode来获得开始搜索线索的好地方。还有http://doxymacs.sourceforge.net/但我没有亲自去过它。