2009-09-22 68 views
1

我在使用C模式的emacs缩进功能的Doxygen风格多行注释时遇到问题。根据Doxygen手册(http://www.stack.nl/~dimitri/doxygen/docblocks.html),接受下面的表格。Doxygen风格的Emacs C模式缩进问题评论

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

我想使用在Emacs这种格式,但是当我在上线“* ...文本”选项卡中的*结束了以下/ **在像这样的第一行的末尾:

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

关于如何解决这个问题的任何建议?仍在学习所有emacs的进出。

谢谢。

回答

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-mode处理注释缩进的方式,但是看起来您希望它执行的操作(在这种情况下)是识别您正在使用的c注释之前是另一个 c注释, 评论是你想要排列缩进的人。

你是怎么做的?我能想到的最简单的方法是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)(或类似的东西),基本上是愚弄程序进入在行首开始排队,而不是你正在修改的评论。

+0

是有可能的块注释完全禁用缩进? – fakedrake 2011-08-26 12:59:26

+0

@fakedrake你可以通过自定义各种评论风格变量来做到这一点。在上面的答案中查看cc模式手动链接的自定义部分。 – 2011-08-29 16:09:41

0

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