Получение заполненного абзаца Emacs для приятной игры с javadoc-подобными комментариями

Я пишу основной режим Emacs для диалекта APL, который я использую на работе. Я получил базовую блокировку шрифта для работы, и после установки комментария-начала и комментария-запуска-пропуска, области комментария / раскомментирования и заполнения абзаца также работают.

Тем не менее, блоки комментариев часто содержат комментарии в стиле javadoc, и я хотел бы, чтобы fill-абзац не склеивал строки, начинающиеся с таких команд.

Если у меня есть это (\ вместо javadoc @):

# This is a comment that is long and should be wrapped.
# \arg Description of argument
# \ret Description of return value

Mq дает мне:

# This is a comment that is long and
# should be wrapped. \arg Description
# of argument \ret Description of
# return value

Но я хочу:

# This is a comment that is long and
# should be wrapped.
# \arg Description of argument
# \ret Description of return value

Я попытался настроить параграф-начало и абзац-разделение на соответствующие значения, но заполнение абзаца по-прежнему не работает внутри блока комментариев. Если я уберу маркеры комментариев, Mq будет работать так, как я хочу, поэтому регулярное выражение, которое я использую для начала абзаца, похоже, сработает.

Должен ли я написать собственный абзац заполнения для моего основного режима? В cc-mode есть такой, который обрабатывает подобные случаи, но он действительно сложный, и я хотел бы избежать его, если это возможно.

3 ответа

Решение

Проблема заключалась в том, что регулярное выражение начала абзаца должно соответствовать всей строке, включая фактический символ комментария. Следующее elisp работает для примера, который я дал:

(setq paragraph-start "^\\s-*\\#\\s-*\\\\\\(arg\\|ret\\).*$")

Вот страница с примером регулярного выражения для php-режима, который делает это: http://barelyenough.org/blog/2006/10/nicer-phpdoc-comments/

Есть другие режимы, которые имеют менее сложные функции, используемые для fill-paragraph-function, Просматривая мою установку, похоже, что те, что в ada-mode и make-mode, являются хорошими примерами.

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

Другие вопросы по тегам