Kann ich zulassen, dass die Interpunktion an der Füllspalte vorbei läuft?


12

In der Typografie gibt es eine Praxis namens "Protrusion" (oder hängende Interpunktion ), mit der bestimmte Symbole am Ende des Rands hängen können:

Vorsprung

Ich möchte dasselbe für meine Textdokumente tun.

Kann ich fill-paragraph(und Freunde?) Ändern, um die Satzzeichen am Zeilenende ( .?!:;,'"-) zu ignorieren, wenn sie den Absatz ausfüllen?


Ich bin mir nicht sicher, ob Sie die Hervorhebung (subtile Verschiebung der nachgestellten Interpunktion) von gerechtfertigtem Text wirklich so nennen können, als würde die nachgestellte Interpunktion beim Umbrechen von Text ignoriert (was standardmäßig keinen Text rechtfertigt und den Effekt im Wesentlichen unsichtbar macht). Vielleicht möchten Sie hinzufügen, dass dies für die berechtigte Variante von gilt fill-paragraph?
Wasamasa

@wasamasa Protrusion ist für Textblöcke mit linksbündigem Inhalt noch vorhanden.
Sean Allred

Gilt es dann für den linken Rand des Textes?
Wasamasa

@wasamasa Sofern Sie sich nicht mit einer RTL-Sprache und einem RTL-Editor befassen (der meines Erachtens zwar unterstützt wird, aber nicht in den Geltungsbereich fällt), ergibt dies keinen Sinn. Wenn Sie einen rechtsbündigen Block haben und am linken Rand (dh in Spalte 0) kein Platz mehr ist, können Sie die Interpunktion nicht genau in Spalte -1 einfügen. (Ich nehme an, Sie könnten den rechten Rand auf (1+ Füllspalte) verschieben, aber das würde die Füllung ändern und Sie könnten in eine Schleife geraten.)
Sean Allred

1
@wasamasa In Bezug auf die Implementierung: ungefüllt. Zur Füllspalte springen. Wenn point ein einzelnes Interpunktionszeichen und dann ein Leerzeichen betrachtet, springen Sie vorwärts. Andernfalls springen Sie in der Mitte eines Wortes zurück. Zeilenwechsel, wiederholen.
Sean Allred

Antworten:


2

Aha, ich habe die Lösung! Fügen Sie dies irgendwo in Ihre .emacs/ .emacs.d/init.el-Datei ein:

(define-advice current-fill-column (:filter-return (rtn) protrusion)
  "Advice to allow hanging punctuation when filling text."
  ;; Get the character after the proposed cutoff point
  (let ((end-char (char-after (1+ rtn))))
    (if (and end-char
             ;; Check if character is in the “punctuation” syntax table…
             (or (eq (char-syntax end-char) ?.)
                 ;; …or is any of these characters (feel free to add more)
                 (memq end-char (string-to-list ".,!?;:-"))))
        ;; If so, return the original value, plus one.
        (1+ rtn)
      ;; Otherwise, do nothing and return the original value.
      rtn)))

Ich habe dies mit getestet fill-paragraph, und es sollte für alle Füllfunktionen funktionieren (da sie alle current-fill-columnbei der Verarbeitung jeder Zeile verwenden). Ich hoffe du magst es! 😇

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.