Wie formatiere / fülle ich schlecht formatierte Aufzählungszeichen im Organisationsmodus?

9

F: Wie kann ich schlecht formatierte Elemente in einer org-modeListe mit Aufzählungszeichen formatieren / füllen ?

Ich versuche herauszufinden, wie man fill-paragraphschlecht formatierte Elemente mit org-modeAufzählungszeichen in einer Liste bearbeitet . Mit "schlecht formatiert" meine ich lange Aufzählungszeichen, die mehrere Zeilen verwenden, aber bereinigt werden müssen, um sie lesbar zu machen. Die Schwierigkeit besteht darin, dass org-modenachfolgende Zeilen nicht als Teil desselben Aufzählungszeichens erkannt werden, wenn sich das erste Nicht-Leerzeichen in derselben Spalte wie das Aufzählungszeichen selbst befindet.

Daher muss im folgenden Beispiel das Aufzählungszeichen (1) nicht gefüllt werden, die Aufzählungszeichen (2) und (3) müssen gefüllt werden und wie erwartet reagieren fill-paragraph, aber die Aufzählungszeichen (4) und (5) werden nicht wie erwartet gefüllt:

* a header

  1) a simple bullet
  2) a bullet that responds nicely
     to
     fill-paragraph
     (try it!)
  3) another bullet that also responds nicely
    to
     fill-paragraph
    even though the "t" in "to" and the
     "e" in "even" line up with the space
         in between the "4)" and the start of the bullet
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet
  5) a similar problem:
the text is flush entirely to the left

Warum passiert das zuerst? Zweitens, und genauer gesagt, wie kann ich davon überzeugen org-mode, alle Zeilen bis zur nächsten Kugel für fill-paragraphZwecke als Teil derselben Kugel zu behandeln?

Dan
quelle

Antworten:

10

Dies geschieht, weil Org Einrückungen verwendet, um Text als zu einem Element gehörend zu definieren.

(info "(org)Plain lists")

Items belonging to the same list must have the same indentation on
the first line.

Um Org davon zu überzeugen, das zu tun, was Sie wollen, müssen Sie den Text auf die Ebene des Elements einrücken. Sie können dazu C-x r t( string-rectangle) oder C-x C-i( indent-rigidly) verwenden, und dann funktioniert das Füllen wie in # 2 und # 3.

Wenn Sie sich in der Elementzeile befinden und Text darunter eingeben möchten, können Sie mit C-j( org-return-indent) in der nächsten Zeile zum gleichen Einzug wechseln. Auf diese Weise können Sie Formatierungen wie in # 4 und # 5 vermeiden.

Kyle Meyer
quelle
2

Wie @KyleMeyer in seiner Antwort erklärt, org-modewird Text nicht als Teil eines Listenelements betrachtet, wenn er nicht über die Ebene des entsprechenden Aufzählungszeichens hinaus eingerückt ist. Im Wesentlichen brauchen wir also eine Möglichkeit, Absätze in Listenelemente aufzunehmen .

Mit dem Punkt innerhalb eines Listenelements können Sie dies mit dem folgenden Befehl tun, ohne sich manuell um das Einrücken kümmern zu müssen:

(defun org-back-to-item ()
  (re-search-backward "^ *[-+*]\\|^ *[1-9]+[)\.] " nil nil 1))

(defun org-fill-paragraph-handle-lists (&optional num-paragraphs)
  (interactive "p")
  (save-excursion
    (let ((bound (if mark-active
                     (- (region-end) 2)
                   (progn
                     (org-back-to-item)
                     (while (>= num-paragraphs 0)
                       (call-interactively 'org-mark-element)
                       (setq num-paragraphs (1- num-paragraphs)))
                     (- (region-end) 2)))))
      (while (search-forward "\n" bound t)
        (replace-match " ")))
    (org-fill-paragraph)))

(define-key org-mode-map (kbd "C-M-q") 'org-fill-paragraph-handle-lists)

Die Hauptidee besteht darin, Vorkommen von \ndurch SPCdas zu füllende Listenelement zu ersetzen , bevor Sie es aufrufen org-fill-paragraph.

Beachten Sie Folgendes: Wenn Sie mehr als einen Absatz in einem Listenelement haben:

  ...
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet

  Some more text
  5) ...

Sie können Some more text(den zweiten Absatz) zum Teil des Listenelements machen, indem Sie den Befehl wie folgt aufrufen:

M-2 C-M-q

Genauer gesagt, org-fill-paragraph-handle-listswird einen einzelnen Absatz unten ein Listenelement standardmäßig absorbieren kann aber eine beliebige Anzahl von Absätzen zu absorbieren angewiesen werden , indem sie mit einem numerischen Präfix arg aufrufen.

itsjeyd
quelle
Klug! Es gibt einen Punkt, der noch nicht ganz funktioniert. Wenn sich ein Punkt im Text befindet org, der standardmäßig keinen Teil des Elements berücksichtigt (z. B. wenn wir uns im Beispiel in der Zeile "NICHT ..." befinden), wird er nicht wie beabsichtigt ausgefüllt, d. H. es füllt sich als separater Absatz und schlürft auch Punkt 5). Das Problem scheint darin zu liegen, wie org-mark-elementdas Element ausgewählt wird. Ich werde noch etwas darüber nachdenken.
Dan
@Dan Dieses Problem kann behoben werden, indem eine Funktion definiert wird, die den Punkt zurück zum vorherigen Listenelement verschiebt, und diese aufgerufen wird, bevor Absätze markiert werden. Siehe den aktualisierten Code in meiner Antwort.
Itsjeyd