emacs делает комментарии квадратного блока с выровненной по правому краю границей

Мне нужно написать комментарии к коду с выровненными границами со всех четырех сторон из-за внешнего стандарта кодирования.

Какой самый простой способ в Emacs:

  1. Преобразование некоторого текста в блочный комментарий в этом формате
  2. Отредактируйте текст в блочном комментарии, чтобы Emacs правильно переформулировал его.

Примеры форматов комментариев:

#*****************************************************************************#
#* This is a block comment. It has right-aligned borders.                    *#
#*                                                                           *#
#* It can have separate paragraphs. Text in a long paragraph flows from one  *#
#* line to the next with one space of internal padding.                      *#
#*                                                                           *#
#* The right hand border is at char 78                                       *#
#*****************************************************************************#
sub MySub
{
  #***************************************************************************#
  #* The left hand edge of the comment is aligned with the current code      *#
  #* block, but the right hand border is still at char 78                    *#
  #***************************************************************************# 
  my $var = 3;
}

auto-fill-mode сам по себе не сохраняет правую границу.


person Rich    schedule 13.08.2013    source источник
comment
Может попробовать artist-mode? Я не уверен, что вы можете изменить символ, который он использует для рисования ящиков, но есть вероятность, что это не будет слишком сложно изменить, если это уже возможно.   -  person    schedule 13.08.2013


Ответы (4)


Почтенная и универсальная библиотека "rebox2" может сделать это.

Для установки загрузите https://raw.github.com/lewang/rebox2/master/rebox2.el в папку site-lisp и добавьте в файл .emacs следующее:

(require 'rebox2)

; The following template defines the specific style required here,
; which does not correspond to any built-in rebox2 style.
;
; "75" means that the style is registered as x75, where "x" depends
; on the current langauge mode. The "?" char is switched for the language
; specific comment char
;
; "999" is the weighting used for recognising this comment style.
; This value works for me.
(rebox-register-template
 75
 999
 '("?*************?"
   "?* box123456 *?"
   "?*************?"))

(add-hook 'perl-mode-hook (lambda ()
; The "style loop" specifies a list of box styles which rebox will cycle
; through if you refill (M-q) a box repeatedly. Having "11" in this loop
; will allow you to easily "unbox" a comment block, e.g. for "uncomment-region"
                (set (make-local-variable 'rebox-style-loop) '(75 11))
; The "min-fill-column" setting ensures that the box is not made narrower
; when the text is short
                (set (make-local-variable 'rebox-min-fill-column) 79)
                (rebox-mode 1)))

В настоящее время:

  1. Чтобы преобразовать некоторый текст в блочный комментарий в этом формате, вы просто выбираете текст и делаете M-q
  2. Чтобы отредактировать текст в блочном комментарии, вы можете просто отредактировать текст напрямую, и emacs автоматически переформатирует поле. (Возможно, вам придется выполнить M-q, чтобы запросить перекомпоновку, если emacs не делает этого автоматически.)
person Rich    schedule 13.08.2013
comment
Привет, @Rich, когда количество строк в поле комментариев увеличивается, ввод клавиши Space после слов или просто непрерывных клавиш Space, которые заменяются на rebox-space в поле комментариев rebox, станет очень запаздывающим. Это случается со мной, когда я кодирую на C. Вы знаете, как решить эту проблему??? Я разместил проблему на сайте Github, но автор не обновлял ее годами. - person CodyChan; 25.09.2014
comment
@CodyChan - без понятия, извини - person Rich; 25.09.2014

M-x настраиваемая переменная RET в стиле комментария RET

Затем выберите «коробку» в меню значений.

person Andreas Röhler    schedule 13.08.2013
comment
Это выглядит близко, но имеет несколько проблем для меня. Все строки ####, а не #****#, как в примерах. Нет внутренней * границы слева и справа. Ширина не соответствует действительности. - person Rich; 13.08.2013
comment
@Rich AFAIU, какие символы используются, зависит от типа определенного комментария. См. в newcomment.el со строки 967, ;; коробочный комментарий. Заполняющий символ может быть взломан там. - person Andreas Röhler; 13.08.2013

Вы можете использовать yasnippet для вставки и overwrite-mode для редактирования.

Если вам нужен перенос слов, вы также можете уничтожить прямоугольник C-x r k, переключиться на временный буфер C-x b, скопировать прямоугольник C-x r y. Отредактируйте там, что душе угодно. После этого уничтожьте прямоугольник из временного буфера и вставьте его в исходный код.

Вот фрагмент начала/конца блока:

# -*- mode: snippet -*-
# name: block comment
# key: bb
# --
`(concat "#" (make-string (- 80 aya-tab-position) ?*) "#")`
$0
`(concat "#" (make-string (- 80 aya-tab-position) ?*) "#")`

Вот фрагмент строки блока:

# -*- mode: snippet -*-
# name: block comment line
# key: bl
# --
`"#* "`$1${1:$(make-string (- 78 aya-tab-position (length text)) ? )}#

Обратите внимание, что здесь я использую переменную пакета auto-yasnippet aya-tab-position. Чтобы использовать его во фрагменте, вы должны расширить фрагмент с помощью aya-open-line. Вы можете получить оба пакета от MELPA.

person abo-abo    schedule 13.08.2013

Частичный ответ на (1) (но я хотел бы услышать лучший):

  • Введите комментарий как обычный текст
  • M-x set-fill-column 76
  • Поместите курсор в начало параграфа комментария и вручную введите в начале «#*» (примечание пробел)
  • Наведя курсор на первую букву комментария, запустите M-x set-fill-prefix
  • Теперь используйте M-q для перекомпоновки параграфа.
  • Это отсортирует перенос слов и установит левую границу на место.
  • Наконец, вручную добавьте верхнюю, нижнюю и правую границы.

См. http://www.gnu.org/software/emacs/manual/html_node/emacs/Fill-Prefix.html

Тот же подход можно использовать для некоторых из (2):

  • Убедитесь, что set-fill-column и set-fill-prefix указаны правильно (см. выше)
  • Удалить все правые маркеры границы
  • Перекомпонуйте параграф, используя M-q
  • Наконец, вручную добавьте верхнюю, нижнюю и правую границы.
person Rich    schedule 13.08.2013