Получение заполненного абзаца 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 для переноса строк абзаца, а затем уничтожаю пустую строку между ними. Не идеально, но это работает и достаточно просто для записи в макрос, если вам нужно повторить это.