Como fazer com que a região de preenchimento / parágrafo identifique um prefixo de parágrafo?


11

Digamos que eu tenho o seguinte buffer.

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Bater M-qaqui enquanto em text-modeleva ao seguinte.

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
ipsum lorem ipsum lorem ipsum lorem ipsum

Por outro lado, se eu ativar markdown-mode, recebo o seguinte (Markdown é apenas um exemplo, você vê um comportamento semelhante em vários modos).

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
   ipsum lorem ipsum lorem ipsum lorem ipsum

Como configurar o modo de texto para fazer isso?

Eu imagino que isso pode ser conseguido através escrevendo um especial fill-paragraph-function, mas esta variável é apenas um conjunto de nilno markdown-mode, então não há provavelmente uma maneira mais fácil.

Respostas:


6

Sou um usuário feliz do modo filladapt há muito tempo, que lida com esse tipo de coisa muito bem. Para informações, consulte

http://emacswiki.org/emacs/FillAdapt

A partir dessa página:

O Filladapt da KyleJones aprimora as funções de preenchimento do Emacs, adivinhando um prefixo de preenchimento, como uma sequência de comentários no código do programa e lidando com pontos de marcador como "1". ou "*".

Por exemplo, poderia transformar isso

* Pretend I'm a really super long line.
* And the window's narrow.

para dentro

* Pretend I'm a really super
  long line.
* And the window's narrow.

Ok, editado para resolver isso.
Chris

para ativar esse modo em conjunto com outro modo, adicione algo como (add-hook 'org-mode-hook 'turn-on-filladapt-mode)ao seu arquivo de configuração (essas informações não estão disponíveis diretamente na página wiki vinculada).
Mark

Funciona lindamente para fazer com que fill-paragraphse comporte corretamente dentro de citações em markdown-mode.
Radon Rosborough

2 anos se passaram desde a resposta. O link para download wonderworks.com/download/filladapt.el não está mais disponível.
Tankman #

O link funciona para mim agora. Talvez tenha havido um problema temporário com o site.
28417 Chris

3
(fill-paragraph &optional JUSTIFY REGION)

[...]

If `fill-paragraph-function' is non-nil, we call it (passing our
argument to it), and if it returns non-nil, we simply return its value.

If `fill-paragraph-function' is nil, return the `fill-prefix' used for filling.

[...]

markdown-modepresumivelmente define fill-paragraph-functioncomo nilpara que a função use fill-prefixpara fazer o preenchimento.

(let ((fill-prefix (make-string (length "1. ") ? ))
  (fill-paragraph))

Exemplo completo:

(let* ((num 15)
       (numstr (format "%d. " num))
       (fill-prefix (make-string (length numstr) ? )))
  (with-temp-buffer
    (loop for i from 1 to 15 do
          (insert (format "lorem ipsum (%d) doler sit amet " i)))
    (beginning-of-line)
    (insert numstr)
    (fill-paragraph)
    (buffer-string)))

;; =>

"\
15. lorem ipsum (1) doler sit amet lorem ipsum (2) doler sit amet
    lorem ipsum (3) doler sit amet lorem ipsum (4) doler sit amet
    lorem ipsum (5) doler sit amet lorem ipsum (6) doler sit amet
    lorem ipsum (7) doler sit amet lorem ipsum (8) doler sit amet
    lorem ipsum (9) doler sit amet lorem ipsum (10) doler sit amet
    lorem ipsum (11) doler sit amet lorem ipsum (12) doler sit amet
    lorem ipsum (13) doler sit amet lorem ipsum (14) doler sit amet
    lorem ipsum (15) doler sit amet "

1
"o modo markdown presumivelmente define a função de parágrafo de preenchimento como nula, para que a função use o prefixo de preenchimento para fazer o preenchimento." Essa não pode ser a história toda. Quando eu acerto M-q, fill-paragraphé invocado diretamente (não há como deixar de ligar). Embora seja possível que fill-prefixseja usado para esse fim, deve haver alguma variável de configuração que permita que ela seja detectada automaticamente.
Malabarba

1
@Malabarba Parece que, markdown-modena verdade, faz isso através das definições de parágrafo: gist.github.com/vermiculus/88759fd9f8368adbf663 #
Sean Allred

Sim, parece mais com isso.
Malabarba

2

A essência de Sean me apontou na direção certa, e aqui está o trecho que a resolveu.

(defun my-adaptive-fill-function ()
  "Return prefix for filling paragraph or nil if not determined."
  (cond
   ;; List item inside blockquote
   ((looking-at "^[ \t]*>[ \t]*\\([0-9]+\\.\\|[*+-]\\)[ \t]+")
    (replace-regexp-in-string
     "[0-9\\.*+-]" " " (match-string-no-properties 0)))
   ;; Blockquote
   ((looking-at "^[ \t]*>[ \t]*")
    (match-string-no-properties 0))
   ;; List items
   ((looking-at "^\\([ \t]*\\)\\([0-9]+\\.\\|[\\*\\+-]\\)\\([ \t]+\\)")
    (match-string-no-properties 0))
   ;; No match
   (t nil)))

;; Paragraph filling in text-mode.
(add-hook 'text-mode-hook
  (lambda ()
    (set (make-local-variable 'paragraph-start)
         "\f\\|[ \t]*$\\|[ \t]*[*+-] \\|[ \t]*[0-9]+\\.[ \t]\\|[ \t]*: ")
    (set (make-local-variable 'paragraph-separate)
         "\\(?:[ \t\f]*\\|.*  \\)$")
    (set (make-local-variable 'adaptive-fill-first-line-regexp)
         "\\`[ \t]*>[ \t]*?\\'")
    (set (make-local-variable 'adaptive-fill-function)
         'my-adaptive-fill-function)))
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.