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?


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! 😇

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.