Posso permitir que a pontuação passe pela coluna de preenchimento?


12

Na tipografia, existe uma prática chamada 'protrusão' (ou pontuação suspensa ) que permite que certos símbolos permaneçam no final da margem:

protrusão

Eu gostaria de fazer o mesmo pelos meus documentos de texto.

Posso alterar fill-paragraph(e amigos?) Para ignorar a pontuação de final de linha ( .?!:;,'"-) quando preencher o parágrafo?


Não tenho certeza se você pode realmente chamar a protrusão (alteração sutil da pontuação final) de texto justificado comparável a ignorar a pontuação final quando o texto é encapsulado (que não justifica o texto por padrão, tornando o efeito essencialmente invisível). Talvez você queira acrescentar que isso se aplica à variante justificada de fill-paragraph?
Wasamasa

@wasamasa A protrusão ainda existe para liberar os blocos de texto à esquerda.
Sean Allred

Isso se aplica à borda esquerda do texto?
wasamasa

@wasamasa A menos que você esteja lidando com uma linguagem e editor RTL (que, apesar de suportado, me parece fora do escopo), não faz sentido. Se você tiver um bloco nivelado à direita e ficar sem espaço na margem esquerda (ou seja, coluna 0), não poderá colocar exatamente a pontuação na coluna -1. (Eu suponho que você poderia mudar a margem direita como (1+ fill-coluna), mas que iria mudar o recheio e você pode ser pego em um loop.)
Sean Allred

1
@wasamasa Em termos de implementação: não preenchida. pule para a coluna de preenchimento. se point estiver visualizando um único caractere de pontuação e depois espaço em branco, pule para frente. caso contrário, se no meio de uma palavra, pule para trás. nova linha, repita.
Sean Allred

Respostas:


2

Aha, eu tenho a solução! Coloque isso em algum lugar do seu arquivo .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)))

Eu testei isso com fill-paragraph, e deve funcionar para todas as funções de preenchimento (já que todas elas são usadas current-fill-columnno processamento de cada linha). Espero que você goste! 😇

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.