Puis-je autoriser la ponctuation à s'exécuter après la colonne de remplissage?

12

En typographie, il existe une pratique appelée `` saillie '' (ou ponctuation suspendue ) qui permet à certains symboles de suspendre la fin de la marge:

saillie

Je voudrais faire la même chose pour mes documents texte.

Puis-je changer fill-paragraph(et amis?) Pour ignorer la ponctuation de fin de ligne ( .?!:;,'"-) lorsqu'il remplit le paragraphe?

Sean Allred
la source
Je ne sais pas si vous pouvez vraiment appeler la protrusion (décalage subtil de la ponctuation de fin) de texte justifié comparable à ignorer la ponctuation de fin lors de l'habillage du texte (ce qui ne justifie pas le texte par défaut, ce qui rend l'effet essentiellement invisible). Peut-être aimeriez-vous ajouter que cela s'applique à la variante justifiée de fill-paragraph?
wasamasa
@wasamasa La protrusion existe toujours pour les blocs de texte à gauche.
Sean Allred
S'applique-t-il alors au bord gauche du texte?
wasamasa
@wasamasa À moins que vous n'ayez affaire à un langage RTL et à un éditeur (qui, bien que pris en charge, je pense qu'il est hors de portée), cela n'a aucun sens. Si vous avez un bloc à droite et que vous «manquez de place» sur la marge gauche (c'est-à-dire la colonne 0), vous ne pouvez pas exactement mettre la ponctuation dans la colonne -1. (Je suppose que vous pouvez déplacer la marge de droite sur (1+ colonne de remplissage), mais cela changerait le remplissage et vous pourriez être pris dans une boucle.)
Sean Allred
1
@wasamasa En termes d'implémentation: unfill. passer à la colonne de remplissage. si le point regarde un seul caractère de ponctuation puis un espace, sautez en avant. sinon si au milieu d'un mot, sautez en arrière. nouvelle ligne, répétez.
Sean Allred

Réponses:

2

Aha, j'ai la solution! Mettez cela quelque part dans votre fichier .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)))

J'ai testé cela avec fill-paragraph, et cela devrait fonctionner pour toutes les fonctions de remplissage (car elles utilisent toutes current-fill-columnlors du traitement de chaque ligne). J'espère que tu aimes! 😇

Tina Russell
la source