Bearbeiten von Dateien mit einem Satz pro Zeile

28

Ein bisschen Hintergrund.

Ich versuche, meine Latexdokumente einer Versionskontrolle zu unterziehen, und die Wirksamkeit dieser Initiative würde sich erheblich verbessern, wenn ich einen Ein-Satz-pro-Zeile- Ansatz einsetze.

Im Folgenden sehen Sie beispielsweise, wie meine Dokumente aussehen werden.

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

Meine Frage ist einfach.
Wie viel davon kann ich mit Emacs automatisieren / verbessern?

Die folgenden zwei Punkte sind das, was ich im Sinn habe.

  1. Meine Sätze sind lang , daher muss ich Zeilen umbrechen, ohne sie tatsächlich zu füllen. Das heißt, ein sehr langer Satz muss über mehrere Zeilen auf meinem Bildschirm angezeigt werden, es muss sich jedoch um eine einzelne Zeile in der „.tex“ -Datei handeln. Dies würde vorzugsweise auf eine Weise erfolgen, die keine Gleichungen umschließt.

    visual-line-modeWraps bei Fensterbreite, das ist zu breit. Ich brauche etwas, das Zeilen umbricht und deren Breite auf ungefähr 80 Zeichen begrenzt. Genau wie fill-paragraphnormalerweise, aber ohne die Zeilen in der Datei zu brechen.

  2. Ich kann die Zeile nach jedem Satz manuell umbrechen, aber es wäre sehr zu empfehlen, wenn ich auch einen Satz pro Zeile setzen könnte fill-paragraph(oder vielleicht sogar auto-fill-mode).
Malabarba
quelle
1
Welche Art von Verbesserung / Automatisierung suchen Sie genau? Möchten Sie wissen, wie Sie Dateien wie diese effektiv bearbeiten können?
Rangi Lin
@RangiLin Ja. Der erste Punkt, den ich erwähnte, ist das Wichtigste für mich. Aber alles andere, um dies effektiver zu machen, ist willkommen.
Malabarba
Die Beschreibung im ersten Punkt sieht so aus visual-line-mode. Aber zusätzlich zum Zeilenumbruch müssen Sie auch nach jedem Satz automatisch ein Zeilenumbruchzeichen einfügen, richtig?
Kaushal Modi
@kaushalmodi Ja, aber der Zeilenumbruch nach jedem Satz ist echt, er sollte in der Datei sein. Das Problem mit dem visuellen Linienmodus ist, dass er standardmäßig zu breit ist. Wenn es eine Möglichkeit gibt, es zu reduzieren, wäre es großartig.
Malabarba
@ Malabarba: Weißt du warum? Für mich ist es der mit Abstand nützlichste Wrapping-Modus ...
Tikhon Jelvis

Antworten:

11

Wenn Sie nur etwas möchten, das visual-line-modeaber konfigurierbar ist, können Sie versuchen, longlines-modewelches ich für den größten Teil meiner Prosa verwende. longlines-modebricht Ihren Text ähnlich wie visual-line-modemit der durch konfigurierten Breite um fill-column.

Hier ist ein Screenshot mit der fill-columnEinstellung auf 70(das Fenster erstreckt sich sogar noch weiter nach rechts).

Ein Beispiel für das Umbrechen von Text im Langzeilenmodus.

Das Konfigurieren fill-paragraphwäre ordentlich, aber ich bin mir nicht sicher, wie ich es machen soll. Stattdessen ist hier ein vernünftiger vorübergehender Hack: Machen Sie Ihren .Charakter im TeX-Modus elektrisch und fügen Sie eine neue Zeile ein. Dies beinhaltet nur das erneute Binden mit dem entsprechenden Modus-Hook:

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)
Tikhon Jelvis
quelle
1
Vielen Dank für den Hinweis auf den Longlines-Modus! Ich habe es geschafft, Gleichungen nicht zu umbrechen und sogar das Aussehen eingerückter Linien zu korrigieren. Hier ist das Wesentliche gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@ Malabarba: Cool. Ich werde wahrscheinlich einige dieser Änderungen selbst verwenden! Ihr Link funktioniert jedoch nicht richtig. Hier ist eine web-freundliche Version: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis
Vielen Dank. Ich habe auch vergessen zu erwähnen, dass der Rat eine Funktion aus dem Latex-Extra-Paket verwendet.
Malabarba
Übrigens ist anzumerken, dass der Longlines-Modus in 24.4 als veraltet markiert ist (nicht, dass es eine gleichwertige Alternative gibt),
Malabarba
2
Der elektrische Punkt wird nicht gut funktionieren, da Punkte nicht nur zum Beenden von Sätzen, sondern auch für alle anderen Zwecke verwendet werden. Es ist besser, einen Punkt gefolgt von zwei Leerzeichen durch einen Punkt gefolgt von einer neuen Zeile zu ersetzen.
Tmalsburg
13

Für (1) würde ich einen vergrößerten Rand verwenden, damit visual-line-modeZeilen an der gewünschten Stelle umgebrochen werden fill-column. Dies wirkt sich jedoch sowohl auf Textzeilen als auch auf Gleichungen aus.

Wie bei (2) kann man einen benutzerdefinierten Füllbefehl definieren M-q, um Absätze zu binden und korrekt zu füllen. Es ist mir noch nicht gelungen, einen Befehl mit dem richtigen Verhalten für das automatische Ausfüllen zu schreiben.

Das alles in einem Nebenmodus zu verpacken könnte wie folgt aussehen. Es ist kein sehr schöner Code, sollte aber in den meisten Fällen funktionieren. (Ich habe die unfill-paragraphFunktion schon init.elseit geraumer Zeit in meinem gehabt, ohne Probleme zu bemerken).

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 
ffevotte
quelle
Die Absatzfüllung funktioniert prima, ich wünschte, ich könnte zwei Antworten akzeptieren. Ersetzen Sie einfach unfill-paragraphmit ospl/unfill-paragraph. Die Ränder funktionieren auch, aber eingerückter Text sieht schlecht aus und sie schließen auch Gleichungen ein, während ich es geschafft habe, die Longlines-Methode unten zu hacken, um diese beiden Probleme zu beheben.
Malabarba
Behoben, danke. Wie gesagt, ich habe mich schon lange unfill-paragraph(nicht mehr fixiert) in meinem init.el. Ich habe es gestern der Konsistenz
halber
Ja, ich dachte es wäre so etwas. Mir wurde auch klar, dass wir den Absatz wahrscheinlich auffüllen können, indem wir einfach so etwas tun (let ((fill-column 1000000)) (fill-pragraph)). Habe es aber noch nicht getestet.
Malabarba
Ja, eine solche Lösung funktioniert. Ich mag es einfach nicht, magische Konstanten zu haben (aber mein Code ist auch nicht sehr schön, daher könnte man argumentieren, welcher besser ist ...)
ffevotte
1
Ich liebe diese Lösung. Gibt es eine einfache Möglichkeit, um zu vermeiden, dass kommentierte Zeilen in mehrere Zeilen aufgeteilt werden?
Ramprasad
9

Würden Ihre Versionskontrollprobleme vermieden / behoben, wenn Sie git diff --color-words oder latexdiff verwenden? Dann können Sie sich geänderte Wörter ansehen.

Sacha Chua
quelle
2
Das Färben von Wörtern ist in der Tat hepful! Aber ich brauche immer noch den olps- Ansatz, um Konflikte beim Zusammenführen der Beiträge anderer Leute und beim Zurücksetzen alter Verpflichtungen zu vermeiden.
Malabarba
2

Eine Möglichkeit , dies zu verbessern , dass ich (manchmal) verwendet seit mehreren Jahren ist Sätze angezeigt werden mit Zeilenumbrüche wie nach jedem anderen fließt durch Falten die Zeilenumbrüche die Einrichtungen der Verwendung tex-fold(eines Teils AUCTeX).

Dies bedeutet, dass dies

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

wird zu gefaltet

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

Ich habe dies kürzlich als Nebenmodus in einem Paket zusammengefasst. Vielleicht findet auch jemand anderes dies nützlich: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
quelle