Як змусити заповнити область / абзац ідентифікувати префікс абзацу?


11

Скажімо, у мене є наступний буфер.

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Попадання M-qсюди під час text-modeприводить до такого.

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
ipsum lorem ipsum lorem ipsum lorem ipsum

З іншого боку, якщо я активую markdown-mode, я отримую наступне (Markdown - це лише приклад, ви бачите подібну поведінку в різних режимах).

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
   ipsum lorem ipsum lorem ipsum lorem ipsum

Як налаштувати текстовий режим для цього?

Я вважаю , це може бути досягнуто шляхом написання спеціального fill-paragraph-function, але ця змінна просто встановлений nilв систему markdown-mode, так що, ймовірно , більш простий спосіб.

Відповіді:


6

Я давно був щасливим користувачем режиму filladapt, який дуже добре поводиться з подібними речами. Для отримання інформації див

http://emacswiki.org/emacs/FillAdapt

З цієї сторінки:

Filladapt від KyleJones розширює функції заповнення Emacs шляхом відгадування префіксу заповнення, такого як послідовність коментарів у програмному коді та обробка пунктів відмітки як "1." або "*".

Наприклад, це могло перетворити це

* Pretend I'm a really super long line.
* And the window's narrow.

в

* Pretend I'm a really super
  long line.
* And the window's narrow.

Гаразд, відредагований для вирішення цього питання.
Кріс

щоб увімкнути цей режим спільно з іншим режимом, додайте щось подібне (add-hook 'org-mode-hook 'turn-on-filladapt-mode)до вашого конфігураційного файлу (ця інформація не доступна безпосередньо на пов'язаній сторінці вікі).
Марк

Прекрасно працює, щоб змусити fill-paragraphсебе правильно поводитись у блок-котируваннях markdown-mode.
Радон Росборо

З моменту відповіді минуло 2 роки. Посилання для завантаження wonderworks.com/download/filladapt.el більше не доступне.
Танкмен 六四

Посилання для мене працює зараз. Можливо, виникла тимчасова проблема із сайтом.
Кріс

3
(fill-paragraph &optional JUSTIFY REGION)

[...]

If `fill-paragraph-function' is non-nil, we call it (passing our
argument to it), and if it returns non-nil, we simply return its value.

If `fill-paragraph-function' is nil, return the `fill-prefix' used for filling.

[...]

markdown-modeімовірно встановлює fill-paragraph-functionдля nilтого , щоб функція використовує , fill-prefixщоб зробити начинку.

(let ((fill-prefix (make-string (length "1. ") ? ))
  (fill-paragraph))

Повний приклад:

(let* ((num 15)
       (numstr (format "%d. " num))
       (fill-prefix (make-string (length numstr) ? )))
  (with-temp-buffer
    (loop for i from 1 to 15 do
          (insert (format "lorem ipsum (%d) doler sit amet " i)))
    (beginning-of-line)
    (insert numstr)
    (fill-paragraph)
    (buffer-string)))

;; =>

"\
15. lorem ipsum (1) doler sit amet lorem ipsum (2) doler sit amet
    lorem ipsum (3) doler sit amet lorem ipsum (4) doler sit amet
    lorem ipsum (5) doler sit amet lorem ipsum (6) doler sit amet
    lorem ipsum (7) doler sit amet lorem ipsum (8) doler sit amet
    lorem ipsum (9) doler sit amet lorem ipsum (10) doler sit amet
    lorem ipsum (11) doler sit amet lorem ipsum (12) doler sit amet
    lorem ipsum (13) doler sit amet lorem ipsum (14) doler sit amet
    lorem ipsum (15) doler sit amet "

1
"Режим розмітки, імовірно, встановлює функцію заповнення абзацу на нуль, так що функція використовує префікс fill для виконання заповнення." Це не може бути вся історія. Коли я натискаю M-q, fill-paragraphвикликається безпосередньо (навколо цього немає жодної прив’язки). Хоча можливо, що fill-prefixв кінцевому рахунку використовується для цієї мети, має бути певна змінна конфігурація, яка дозволяє її автоматично визначати.
Малабарба

1
@Malabarba Схоже, що markdown-modeнасправді це відбувається через визначення абзацу: gist.github.com/vermiculus/88759fd9f8368adbf663
Шон Олред

Так, це схоже більше.
Малабарба

2

Шона Шона вказала мені в правильному напрямку, і ось фрагмент, який вирішив це.

(defun my-adaptive-fill-function ()
  "Return prefix for filling paragraph or nil if not determined."
  (cond
   ;; List item inside blockquote
   ((looking-at "^[ \t]*>[ \t]*\\([0-9]+\\.\\|[*+-]\\)[ \t]+")
    (replace-regexp-in-string
     "[0-9\\.*+-]" " " (match-string-no-properties 0)))
   ;; Blockquote
   ((looking-at "^[ \t]*>[ \t]*")
    (match-string-no-properties 0))
   ;; List items
   ((looking-at "^\\([ \t]*\\)\\([0-9]+\\.\\|[\\*\\+-]\\)\\([ \t]+\\)")
    (match-string-no-properties 0))
   ;; No match
   (t nil)))

;; Paragraph filling in text-mode.
(add-hook 'text-mode-hook
  (lambda ()
    (set (make-local-variable 'paragraph-start)
         "\f\\|[ \t]*$\\|[ \t]*[*+-] \\|[ \t]*[0-9]+\\.[ \t]\\|[ \t]*: ")
    (set (make-local-variable 'paragraph-separate)
         "\\(?:[ \t\f]*\\|.*  \\)$")
    (set (make-local-variable 'adaptive-fill-first-line-regexp)
         "\\`[ \t]*>[ \t]*?\\'")
    (set (make-local-variable 'adaptive-fill-function)
         'my-adaptive-fill-function)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.