Wie kann ein Füllbereich / Absatz ein Absatzpräfix identifizieren?

11

Angenommen, ich habe den folgenden Puffer.

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

Hier zu treffen M-q, während man drin ist, text-modeführt zu Folgendem.

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

Wenn ich dagegen aktiviere markdown-mode, erhalte ich Folgendes (Markdown ist nur ein Beispiel, Sie sehen ein ähnliches Verhalten in verschiedenen Modi).

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

Wie konfiguriere ich den Textmodus dafür?

Ich stelle mir vor, dass dies durch das Schreiben eines Specials erreicht werden kann fill-paragraph-function, aber diese Variable ist nur auf nilin gesetzt markdown-mode, also gibt es wahrscheinlich einen einfacheren Weg.

Malabarba
quelle

Antworten:

6

Ich bin seit langer Zeit ein glücklicher Benutzer des Filladapt-Modus, der so etwas wirklich gut handhabt. Informationen finden Sie unter

http://emacswiki.org/emacs/FillAdapt

Von dieser Seite:

Filladapt von KyleJones verbessert die Füllfunktionen von Emacs, indem ein Füllpräfix wie eine Kommentarsequenz im Programmcode erraten und Aufzählungszeichen wie "1" behandelt werden. oder "*".

Zum Beispiel könnte es dies drehen

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

in

* Pretend I'm a really super
  long line.
* And the window's narrow.
Chris
quelle
Ok, bearbeitet, um das anzugehen.
Chris
Um diesen Modus in Verbindung mit einem anderen Modus zu aktivieren, fügen Sie (add-hook 'org-mode-hook 'turn-on-filladapt-mode)Ihrer Konfigurationsdatei so etwas hinzu (diese Informationen sind nicht direkt auf der verlinkten Wiki-Seite verfügbar).
Mark
Funktioniert wunderbar, um fill-paragraphsich innerhalb von Blockzitaten richtig zu verhalten markdown-mode.
Radon Rosborough
2 Jahre sind seit der Antwort vergangen. Der Download-Link Wonderworks.com/download/filladapt.el ist nicht mehr verfügbar.
Tankman
Der Link funktioniert gerade für mich. Möglicherweise gab es ein vorübergehendes Problem mit der Website.
Chris
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-modevermutlich fill-paragraph-functionauf nilso eingestellt, dass die Funktion fill-prefixdas Füllen verwendet.

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

Vollständiges Beispiel:

(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 "
Sean Allred
quelle
1
"Der Markdown-Modus setzt vermutlich die Füll-Absatz-Funktion auf Null, so dass die Funktion das Füll-Präfix verwendet, um die Füllung durchzuführen." Das kann nicht die ganze Geschichte sein. Wenn ich drücke M-q, fill-paragraphwird direkt aufgerufen (es gibt kein Let-Bind darum herum). Während es möglich ist, dass fill-prefixes letztendlich für diesen Zweck verwendet wird, muss es eine Konfigurationsvariable geben, die es ermöglicht, es automatisch zu erkennen.
Malabarba
1
@ Malabarba Sieht so aus, als ob dies markdown-modetatsächlich über Absatzdefinitionen geschieht
Sean Allred
Ja, das sieht eher so aus.
Malabarba
2

Seans Kern zeigte mich in die richtige Richtung, und hier ist der Ausschnitt, der es gelöst hat.

(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)))
Malabarba
quelle