¿Cómo formatear / rellenar elementos de viñeta mal formateados en modo org?


9

P: ¿cómo puedo formatear / rellenar elementos mal formateados en una org-modelista con viñetas?

Estoy tratando de descubrir cómo hacer que el fill-paragraphtrabajo en elementos con viñetas mal formateados en una org-modelista. Por "mal formateado", me refiero a las viñetas de larga duración que usan múltiples líneas pero que necesitan ser limpiadas para que sean legibles. La dificultad es que org-modeno parece reconocer líneas posteriores como parte de la misma viñeta cuando el primer carácter que no es un espacio en blanco está en la misma columna que la viñeta misma.

Por lo tanto, en el siguiente ejemplo, la viñeta (1) no necesita relleno, las viñetas (2) y (3) necesitan llenarse y responder como se espera fill-paragraph, pero las viñetas (4) y (5) no se llenan como se esperaba:

* a header

  1) a simple bullet
  2) a bullet that responds nicely
     to
     fill-paragraph
     (try it!)
  3) another bullet that also responds nicely
    to
     fill-paragraph
    even though the "t" in "to" and the
     "e" in "even" line up with the space
         in between the "4)" and the start of the bullet
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet
  5) a similar problem:
the text is flush entirely to the left

En primer lugar, ¿por qué sucede esto? En segundo lugar, y más al punto, ¿cómo puedo convencer org-modede tratar todas las líneas hasta la próxima viñeta como parte de la misma viñeta para fill-paragraphfines?

Respuestas:


10

Ocurre porque Org utiliza la sangría para definir el texto como perteneciente a un elemento.

(info "(org)Plain lists")

Items belonging to the same list must have the same indentation on
the first line.

Para convencer a Org de que haga lo que quiere, debe sangrar el texto al nivel del elemento. Puede usar C-x r t( string-rectangle) o C-x C-i( indent-rigidly) para hacer esto y luego el relleno funcionará como en # 2 y # 3.

Si está en la línea del artículo y desea ingresar texto debajo de ella, puede usar C-j( org-return-indent) para pasar a la misma sangría en la línea siguiente. De esa manera, puede evitar formatear como en # 4 y # 5.


2

Como @KyleMeyer explica en su respuesta, org-modeno considera que el texto sea parte de un elemento de la lista si no está sangrado más allá del nivel de la viñeta correspondiente. Entonces, esencialmente, necesitamos una forma de absorber los párrafos en los elementos de la lista .

Con el punto colocado dentro de un elemento de la lista, el siguiente comando le permite hacerlo sin tener que ocuparse de la sangría manualmente:

(defun org-back-to-item ()
  (re-search-backward "^ *[-+*]\\|^ *[1-9]+[)\.] " nil nil 1))

(defun org-fill-paragraph-handle-lists (&optional num-paragraphs)
  (interactive "p")
  (save-excursion
    (let ((bound (if mark-active
                     (- (region-end) 2)
                   (progn
                     (org-back-to-item)
                     (while (>= num-paragraphs 0)
                       (call-interactively 'org-mark-element)
                       (setq num-paragraphs (1- num-paragraphs)))
                     (- (region-end) 2)))))
      (while (search-forward "\n" bound t)
        (replace-match " ")))
    (org-fill-paragraph)))

(define-key org-mode-map (kbd "C-M-q") 'org-fill-paragraph-handle-lists)

La idea principal es reemplazar las ocurrencias de \ncon SPCen el elemento de la lista para llenar antes de llamarlo org-fill-paragraph.

Tenga en cuenta que si tiene más de un párrafo dentro de un elemento de la lista:

  ...
  4) a bullet that does
  NOT respond to fill-paragraph
  because the "N" in "NOT" is in the same column
  as the start of the bullet

  Some more text
  5) ...

puede hacer que Some more text(el segundo párrafo) se convierta en parte del elemento de la lista llamando al comando de esta manera:

M-2 C-M-q

Más específicamente, org-fill-paragraph-handle-listsabsorberá un solo párrafo debajo de un elemento de la lista de forma predeterminada, pero se le puede indicar que absorba cualquier número de párrafos llamándolo con un prefijo numérico arg.


¡Inteligente! Hay un punto que todavía no funciona del todo. Si el punto está en el texto que org, por defecto, no consideraría parte del elemento (por ejemplo, si estamos en la línea "NO ..." en el ejemplo), no se llena como se esperaba, es decir, se llena como un párrafo separado y absorbe el ítem 5) también. El problema parece estar en cómo org-mark-elementelige el elemento. Lo pensaré un poco más.
Dan

@Dan Este problema puede abordarse definiendo una función que mueva el punto al elemento de la lista anterior y llamándolo antes de marcar los párrafos. Ver el código actualizado en mi respuesta.
itsjeyd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.