¿Cómo hacer que la región de relleno / párrafo identifique un prefijo de párrafo?

11

Digamos que tengo el siguiente búfer.

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

Golpear M-qaquí mientras está en text-modeconduce a lo siguiente.

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

Por otro lado, si activo markdown-mode, obtengo lo siguiente (Markdown es solo un ejemplo, ves un comportamiento similar en varios modos).

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

¿Cómo configuro el modo de texto para hacer eso?

Me imagino que esto se puede lograr escribiendo un especial fill-paragraph-function, pero esta variable solo se establece nilen markdown-mode, por lo que probablemente haya una manera más fácil.

Malabarba
fuente

Respuestas:

6

He sido un usuario feliz del modo filladapt durante mucho tiempo, que maneja este tipo de cosas realmente bien. Para información, ver

http://emacswiki.org/emacs/FillAdapt

De esa página:

Filladapt por KyleJones mejora las funciones de relleno de Emacs adivinando un prefijo de relleno, como una secuencia de comentarios en el código del programa, y ​​manejando viñetas como "1". o "*".

Por ejemplo, podría convertir esto

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

dentro

* Pretend I'm a really super
  long line.
* And the window's narrow.
Chris
fuente
Ok, editado para abordar eso.
Chris
para habilitar este modo junto con otro modo, agregue algo parecido (add-hook 'org-mode-hook 'turn-on-filladapt-mode)a su archivo de configuración (esta información no está directamente disponible en la página wiki vinculada).
Marcar
Funciona maravillosamente para que se fill-paragraphcomporte correctamente dentro de las comillas en bloque markdown-mode.
Radon Rosborough
Han pasado 2 años desde la respuesta. El enlace de descarga wonderworks.com/download/filladapt.el ya no está disponible.
Tankman 六四
El enlace funciona para mí en este momento. Tal vez hubo un problema temporal con el sitio.
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-modepresumiblemente se establece fill-paragraph-functionen nilpara que la función utilice fill-prefixpara realizar el relleno.

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

Ejemplo 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 "
Sean Allred
fuente
1
"el modo markdown presumiblemente establece la función de párrafo de relleno en nulo para que la función use el prefijo de relleno para realizar el relleno". Esa no puede ser toda la historia. Cuando golpeo M-q, fill-paragraphse invoca directamente (no hay ningún lazo alrededor). Si bien es posible que fill-prefixfinalmente se use para este propósito, tiene que haber alguna variable de configuración que permita que se detecte automáticamente.
Malabarba
1
@Malabarba Parece que en markdown-moderealidad hace esto a través de definiciones de párrafo: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred
Sí, eso se parece más a eso.
Malabarba
2

La esencia de Sean me señaló en la dirección correcta, y aquí está el fragmento que lo resolvió.

(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)))
Malabarba
fuente