Можно ли разрешить пунктуацию проходить мимо столбца заполнения?

12

В типографии есть практика, называемая «выступ» (или висящая пунктуация ), которая позволяет определенным символам свисать с конца поля:

выступ

Я хотел бы сделать то же самое для моих текстовых документов.

Могу ли я изменить fill-paragraph(и друзей?), Чтобы игнорировать пунктуацию в конце строки ( .?!:;,'"-), когда он заполняет абзац?

Шон Оллред
источник
Я не уверен, что вы действительно можете назвать выпуклость (тонкое смещение конечной пунктуации) оправданного текста, сравнимую с игнорированием конечной пунктуации при жестком переносе текста (который не выравнивает текст по умолчанию, делая эффект практически невидимым). Возможно, вы хотели бы добавить, что это относится к обоснованному варианту fill-paragraph?
Васамаса
@wasamasa Выступ по-прежнему существует для скрытых текстовых блоков слева.
Шон Оллред
Это относится к левому краю текста тогда?
васамаса
@wasamasa Если вы не имеете дело с языком RTL и редактором (который, хотя и поддерживается, я считаю, выходит за рамки), это не имеет смысла. Если у вас есть чистый правый блок, и вы «исчерпали место» на левом поле (т. Е. Столбец 0), вы не можете точно поставить пунктуацию в столбце -1. (Полагаю, вы могли бы сдвинуть правое поле до (1+ fill-column), но это изменило бы заполнение, и вы могли бы попасть в цикл.)
Шон Оллред
1
@wasamasa С точки зрения реализации: заполнить. перейти к заполнению столбца. если точка смотрит на один символ пунктуации, а затем на пробел, переходите вперед. иначе, если в середине слова, пропустить назад. перевод строки, повтор.
Шон Оллред

Ответы:

2

Ага, у меня есть решение! Поместите это где-нибудь в ваш .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)))

Я проверил это с fill-paragraph, и это должно работать для всех функций заполнения (так как все они используют current-fill-columnпри обработке каждой строки). Я надеюсь тебе это понравится! 😇

Тина Рассел
источник