Czy mogę pozwolić, aby interpunkcja przebiegała poza kolumną wypełnienia?

12

W typografii istnieje praktyka zwana „wypukłością” (lub wiszącą interpunkcją ), która pozwala niektórym symbolom zawiesić się na końcu marginesu:

występ

Chciałbym zrobić to samo dla moich dokumentów tekstowych.

Czy mogę zmienić fill-paragraph(i znajomych?), Aby ignorować interpunkcję na końcu wiersza ( .?!:;,'"-), gdy wypełnia akapit?

Sean Allred
źródło
Nie jestem pewien, czy naprawdę można nazwać wysunięcie (subtelne przesunięcie końcowej interpunkcji) uzasadnionego tekstu, porównywalne do ignorowania końcowej interpunkcji w przypadku zawijania tekstu (co domyślnie nie usprawiedliwia tekstu, czyniąc efekt zasadniczo niewidocznym). Być może chciałbyś dodać, że dotyczy to uzasadnionego wariantu fill-paragraph?
wasamasa
@ Wasamasa Protrusion nadal istnieje dla opróżnienia bloków lewego tekstu.
Sean Allred
Czy ma to zastosowanie do lewej krawędzi tekstu?
wasamasa
@wasamasa O ile nie masz do czynienia z językiem RTL i edytorem (który, choć obsługiwany, wydaje mi się poza zakresem), nie ma to sensu. Jeśli masz flush w prawym bloku i „zabraknie Ci miejsca” na lewym marginesie (tj. W kolumnie 0), nie możesz dokładnie umieścić interpunkcji w kolumnie -1. (Podejrzewam, że mógłbyś przesunąć prawy margines do (1 + kolumna wypełnienia), ale to zmieniłoby wypełnienie i mógłbyś zostać złapany w pętlę.)
Sean Allred
1
@wasamasa Pod względem wdrożenia: wypelnij. przejdź do kolumny wypełnienia. jeśli punkt patrzy na pojedynczy znak interpunkcyjny, a następnie na spację, przejdź do przodu. w przeciwnym razie pomiń w tył. nowa linia, powtórz.
Sean Allred

Odpowiedzi:

2

Aha, mam rozwiązanie! Umieść to gdzieś w swoim pliku .emacs/ .emacs.d/init.el:

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

Przetestowałem to z fill-paragraph, i powinno działać dla wszystkich funkcji wypełniania (ponieważ wszystkie one używają current-fill-columnpodczas przetwarzania każdej linii). Mam nadzieję, że to lubisz! 😇

Tina Russell
źródło