我在c-mode中使用emacs缩进功能进行doxygen风格的多行注释时出现问题。根据doxygen手册(http://www.doxygen.nl/manual/docblocks.html),接受以下表格。
/********************************************//**
* ... text
***********************************************/
我正在尝试在emacs中使用这种格式,但是当我在'* ... text'行中选中时,*最终会在第一行末尾的/ **下面,如下所示:
/********************************************//**
* ... text
***********************************************/
有关如何解决此问题的任何建议?仍在学习emacs的所有内容。
答案 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/但我没有亲自去过它。