Как заставить Emacs заполнить абзац, чтобы он хорошо сочетался с комментариями, подобными javadoc
Вопрос
Я пишу основной режим Emacs для диалекта APL, который я использую на работе.Я получил базовую блокировку шрифта для работы, и после настройки comment-start и comment-start-skip, область комментариев / раскомментирования и заполнение абзаца также работают.
Однако блоки комментариев часто содержат комментарии в стиле javadoc, и я хотел бы, чтобы fill-paragraph не склеивал строки, начинающиеся с таких команд.
Если у меня есть это (\ вместо javadoc @):
# 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
Но я хочу:
# This is a comment that is long and
# should be wrapped.
# \arg Description of argument
# \ret Description of return value
Я попытался настроить paragraph-start и paragraph-separate на соответствующие значения, но fill-paragraph по-прежнему не работает внутри блока комментариев .Если я удалю маркеры комментариев, M-q будет работать так, как я хочу , поэтому регулярное выражение, которое я использую для начала абзаца, похоже, работает.
Должен ли я писать пользовательский заполняющий абзац для моего основного режима ?в cc-mode есть один, который обрабатывает подобные случаи, но он действительно сложный, я бы хотел избежать этого, если это возможно.
Решение
Проблема заключалась в том, что регулярное выражение, начинающее абзац, должно соответствовать всей строке, чтобы работать, включая фактический символ комментария.Следующий 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, являются хорошими примерами.
Что я делаю в этих случаях, так это открываю пустую строку между строками абзаца и строками аргумента, затем использую M-q для переноса строк абзаца, затем убираю пустую строку между ними.Не идеально, но это работает, и его достаточно легко записать в макрос, если вам нужно его повторить.