如何在emacs的c++模式下很好地格式化头注释

How to nicely format header comments in C++ mode of emacs?

本文关键字:很好 格式化 注释 模式 emacs c++      更新时间:2023-10-16

这里的"header comments"指的是:

/* Program Name: Foo                */
/* Author:       Jane Doe           */
/* Date:         06/29/2014         */
/* Rev:          1.0                */

棘手的部分是:

  1. 如果使用M-;
  2. 很难对齐每行结束的*/
  3. 如果可能的话,我想在每行:之后对齐内容。

您可以通过两次调用align-regexp来做到这一点,尽管键入

有点棘手:
/* Program Name: Foo */
/* Author: Jane Doe */
/* Date: 06/29/2014 */
/* Rev: 1.0 */

选择您希望修改的区域,然后使用前缀参数执行第一个align-regexp:

C-u M-x align-regexp RET :(s-*) RET RET RET n

这个版本的align-regexp使用匹配冒号字符的正则表达式,后面跟着任意数量的空格。然后我们

  • 接受修改捕获组1(空白)的默认选项,
  • 则默认在调整时至少留下一个空格,
  • 然后告诉Emacs不要对整行重复,因为我们不需要这个特性。

剩下的应该是

/* Program Name: Foo */
/* Author:       Jane Doe */
/* Date:         06/29/2014 */
/* Rev:          1.0 */

现在,C-x C-x交换点和标记,重新选择你的文本,并做另一个align-regexp。这个不需要前缀参数:

 M-x align-regexp RET */ RET

这个版本要简单得多。我们提供了一个匹配关闭注释指示符*/的正则表达式,转义星号。

你应该做完了!最终结果如下所示:

/* Program Name: Foo        */
/* Author:       Jane Doe   */
/* Date:         06/29/2014 */
/* Rev:          1.0        */
编辑:

您应该能够编写一个函数来自动执行此过程。我不是代码专家,但这似乎很管用:

(defun my-align-c-comment-block ()
  (interactive)
  (when (use-region-p)
    (align-regexp (region-beginning) (region-end) ":\(\s-*\)")
    (exchange-point-and-mark)
    (align-regexp (region-beginning) (region-end) "\(\s-*\)\*/")))