Emacs: заполнить весь текст, кроме указанных регионов
Используя elisp в gnu emacs, я хотел бы иметь возможность заполнять весь текст в буфере, кроме текста, который обозначен специальными идентификаторами. Идентификаторы могут быть чем угодно, но ради этого вопроса давайте просто предположим, что это любой текст, который попадает между тегами [nofill] и [/nofill].
Например, предположим, что мой буфер выглядит так:
Now is the time
for all good
men to come to the aid
of their party. Now is
the time for all good
men to come to the aid
of their party.
[nofill]
The quick
brown fox
jumped over the
lazy sleeping dog
[/nofill]
When in the course of
human events, it becomes
it becomes necessary for one
people to dissolve the
political bands
[nofill]
baa-baa
black sheep,
have you
any wool
[/nofill]
После того вида заполнения, который я ищу, я хочу, чтобы буфер выглядел следующим образом:
Now is the time for all good men to come to the aid of their
party. Now is the time for all good me to come to the aid of
their party
[nofill]
The quick
brown fox
jumped over the
lazy sleeping dog
[/nofill]
When in the course of human events, it becomes it becomes
necessary for one people to dissolve the political bands
[nofill]
baa-baa
black sheep,
have you
any wool
[/nofill]
Я знаю elisp, и я мог бы написать кое-что, что делает это. Однако, прежде чем я попытаюсь "изобрести колесо", я хотел бы знать, знает ли кто-нибудь о каких-либо существующих модулях elisp, которые могут уже обеспечивать эту функциональность.
Заранее спасибо.
2 ответа
Вы можете просто оправдать все между [/nofill]
а также [nofill]
(или, возможно, начало / конец буфера).
(defun fill-special () "fill special"
(interactive)
(goto-char (point-min))
(while (< (point) (point-max))
(let ((start (point)))
(if (search-forward "[nofill]" nil 1)
(forward-line -1))
(fill-region start (point) 'left)
(if (search-forward "[/nofill]" nil 1)
(forward-line 1)))))
Это кажется слишком сложным по сравнению с другим ответом, но в основном я отмечаю текущую точку, ищу тег (который можно параметризировать) и заполняю область. Затем я рекурсивно fill-region-ignore-tags-helper
, используя первый символ после начальной точки в качестве начала региона, а затем следующий [nofill]
пометить как конец региона. Это продолжается до тех пор, пока весь буфер не будет заполнен. Кажется, что это работает с некоторыми случайными тривиальными случаями, хотя могут быть некоторые крайние случаи, которые не охвачены.
(defun fill-region-ignore-tags ()
(interactive)
(save-excursion
(fill-region-ignore-tags-helper (point-min) (search-forward "[nofill]"))))
(defun fill-region-ignore-tags-helper (begin end)
(let ((cur-point begin)
(next-point end))
(if (eq next-point nil)
nil
(progn
(fill-region cur-point next-point)
(fill-region-ignore-tags-helper (progn
(search-forward "[/nofill]")
(re-search-forward "\\S-")
(point))
(progn
(search-forward "[nofill]")
(previous-line)
(point)))))))