Как красиво форматировать комментарии к заголовкам в режиме C emacs?

#c #emacs

#c #emacs

Вопрос:

Здесь «комментарии к заголовку» относятся к:

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

Сложные части:

  1. Сложно выровнять окончание */ в каждой строке, если использовать M-;
  2. Если возможно, я бы хотел выровнять содержимое после : каждой строки.

Заранее спасибо.

Ответ №1:

Вы можете сделать это с помощью двух вызовов 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        */
 

Редактировать:

Вы должны быть в состоянии написать функцию для автоматизации этого процесса. Я не эксперт по elisp, но, похоже, это помогает:

 (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-*\)\*/")))
 

Комментарии:

1. Код работает отлично. Скоро я перейду к части регулярных выражений.