Wie kann ich einen Absatz in eine Zeile pro Satz aufteilen und ihn trotzdem visuell umbrochen lassen?

14

Dies ähnelt dem Bearbeiten von Dateien mit einem Satz pro Zeile (sowohl in Bezug auf die Funktion als auch auf das Motiv), ich möchte jedoch einen vollständigen, fließenden Absatz anstelle von visuellen Unterbrechungen bei jedem Satz haben.

Ich möchte einen Nebenmodus haben, der, wenn er aktiviert ist , visuell Zeilen aus demselben Absatz verbindet (nicht durch \n\noder paragraph-separateoder getrennt ) und dann das Verhalten aktiviert (möglicherweise abgeleitet von visual-line-mode), das die Zeile umbricht, ohne sie tatsächlich einzufügen \n.

Gibt es einen solchen Modus? Wenn nicht, wie gehe ich vor, um die Anzeigeeigenschaften eines Absatzes zu ändern, um das Ergebnis zu erzielen? (Immerhin ist dies der springende Punkt eines solchen Modus, und man könnte ihn aus dem Snippet entwickeln.)

Sean Allred
quelle
[...] wird sich visuell [...] anschließen. Meinen Sie, dass der Basiswert \nbeibehalten wird (falls vorhanden), oder möchten Sie, dass die Zeilenumbrüche tatsächlich entfernt werden, um 1 Absatz pro Zeile bereitzustellen?
Jonathan Leech-Pepin
1
Vielleicht könnten Sie das verwenden buffer-display-table, um die neuen Zeilen \nals Leerzeichen oder ähnliches erscheinen zu lassen - siehe folgendes Beispiel im Link: stackoverflow.com/a/24842771/2112489 Der Vorteil dabei wäre, dass der Text im Dokument wird nicht geändert. Die neue Linie kann so gut wie alles sein - z. B. ein Smiley, Leerzeichen, ein Pilgersymbol usw. Der visuelle Effekt besteht darin, dass eine Umhüllung erfolgt.
Gesetzesliste
@ JonathanLeech-Pepin Ich möchte die Zeilenumbrüche wo vorhanden halten. Tatsächlich möchte ich die Zeilenumbruchzeile auf ein Satzende zwingen, aber dies kann über einen separaten Haken erfolgen.
Sean Allred
1
@lawlist der visuelle effekt ist, dass newlines überall weg sein werden, nicht wahr? Werden nicht alle Absätze zu einem zusammengefasst?
Malabarba
1
Ich bin mit dieser Bitte einverstanden, denke aber, dass der von OP beschriebene Moll-Modus nicht die richtige Lösung ist. Das zugrunde liegende Problem ist, dass diff für Text nicht gut funktioniert, da es für Code entwickelt wurde. Das Umgehen dieses Problems in Emacs ist aus verschiedenen Gründen eine mögliche, aber keine saubere Lösung. Es wäre viel besser, diff zu verbessern, um gut mit Text zu arbeiten.
Tmalsburg

Antworten:

3

Wie Tom sagte, wird das Setzen einer Anzeigeeigenschaft auf die Zeilenumbrüche eine Art Arbeit sein.

Das Problem besteht darin, herauszufinden, welche Zeilen umbrochen werden sollen.

Hier ist ein Beispiel für den Einstieg:

(let ((eol-regexp "[[:graph:]] ?\\(\n\\)[^\t\n ]"))
  (font-lock-add-keywords nil
   `((,eol-regexp 1 '(face default display " ")))))

(visual-line-mode 1)

Dadurch werden Zeilenumbrüche "entfernt", wenn vor ihnen grafische Zeichen stehen und die nächste Zeile nicht eingerückt oder leer ist. Sie müssen experimentieren, um etwas zu finden, das für Sie funktioniert.

Noch ein paar Erklärungen:

  1. font-lock-add-keywordsFügt der Schriftsperre eine Liste von Regeln hinzu (daher muss die Schriftsperre aktiviert sein. Das erste Argument kann ein Modus sein (z. B. text-mode); in unserem Fall ist es null, was bedeutet, dass die Regel nur für den aktuellen Puffer hinzugefügt wird.
  2. Unsere "Regel" ist (,eol-regexp 1 '(face default display " ")). Das erste Element ist der reguläre Ausdruck, den wir zuvor erstellt haben. Der zweite ist der Teilausdruck, an dem wir interessiert sind. Das dritte ist das "Gesicht", das wir anwenden möchten.
  3. Die Verwendung einer Fläche für die Zeilenumbrüche hat für uns keine Bedeutung. Wir können jedoch Texteigenschaften hinzufügen. Wir verwenden also die Standardfläche und fügen dann eine Anzeigeeigenschaft hinzu, die die Teilzeichenfolge 1 (dh die neue Zeile) durch ein Leerzeichen ersetzt.
  4. Wenn Sie sich in den Fuß schießen, löschen Sie den Puffer oder entfernen Sie das Stichwort mit font-lock-remove-keywords.
  5. Sie können auch hinzufügen möchten displayzu font-lock-extra-managed-props(ich habe nicht versucht).
  6. Der schwierige Teil ist, die Regexp richtig zu machen. "\ (\ n \) [^ \ n]" würde mit jeder neuen Zeile übereinstimmen, die nicht unmittelbar von einer anderen gefolgt wird. ". \ {30, \} \ (\ n \)" würde nur Zeilenumbrüchen entsprechen, denen mindestens 30 Zeichen vorangestellt sind.
olaf b
quelle
Eine Implementierung des oben genannten Pakets finden Sie unter github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Wenn ich das Problem richtig verstehe, möchten Sie alle Zeilenumbrüche im Puffer so belassen, wie sie sind. Sie möchten jedoch einige davon als Leerzeichen anzeigen. Dann möchten Sie Zeilenumbruch.

Zum Zeilenumbruch kann man meiner Meinung nach verwenden visual-line-mode.

Ich denke, Sie könnten für den Umgang mit den Zeilenumbrüchen eine displayEigenschaft mit " "(eine Zeichenfolge, die aus einem einzelnen Leerzeichen besteht) als Wert in die Zeilenumbrüche einfügen, die Sie anders anzeigen möchten.

Tom Tromey
quelle