Comment formater / remplir des éléments de puce mal formatés en mode org?

9

Q: comment formater / remplir des éléments mal formatés dans une org-modeliste à puces?

J'essaie de comprendre comment faire fill-paragraphfonctionner les éléments à puce mal formatés dans une org-modeliste. Par «mal formaté», je veux dire des balles longues qui utilisent plusieurs lignes mais doivent être nettoyées pour être lisibles. La difficulté est qu'il org-modene semble pas reconnaître les lignes suivantes comme faisant partie de la même puce lorsque le premier caractère non blanc se trouve dans la même colonne que la puce elle-même.

Par conséquent, dans l'exemple ci-dessous, la puce (1) n'a pas besoin d'être remplie, les puces (2) et (3) doivent être remplies et répondent comme prévu fill-paragraph, mais les puces (4) et (5) ne se remplissent pas comme prévu:

* 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

Tout d'abord, pourquoi cela se produit-il? Deuxièmement, et plus précisément, comment puis-je convaincre org-modede traiter toutes les lignes jusqu'à la puce suivante comme faisant partie de la même puce à des fill-paragraphfins?

Dan
la source

Réponses:

10

Cela se produit car Org utilise l'indentation pour définir le texte comme appartenant à un élément.

(info "(org)Plain lists")

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

Pour convaincre Org de faire ce que vous voulez, vous devez mettre le texte en retrait au niveau de l'élément. Vous pouvez utiliser C-x r t( string-rectangle) ou C-x C-i( indent-rigidly) pour ce faire, puis le remplissage fonctionnera comme dans # 2 et # 3.

Si vous êtes sur la ligne d'élément et que vous souhaitez saisir du texte en dessous, vous pouvez utiliser C-j( org-return-indent) pour passer au même retrait sur la ligne suivante. De cette façon, vous pouvez éviter le formatage comme dans # 4 et # 5.

Kyle Meyer
la source
2

Comme @KyleMeyer l'explique dans sa réponse, org-modene considère pas le texte comme faisant partie d'un élément de liste s'il n'est pas en retrait au-delà du niveau de la puce correspondante. Donc, essentiellement, nous avons besoin d'un moyen d' absorber les paragraphes dans les éléments de liste .

Avec un point positionné à l'intérieur d'un élément de liste, la commande suivante vous permet de le faire sans avoir à prendre soin de l'indentation manuellement:

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

L'idée principale est de remplacer les occurrences de \npar SPCdans l'élément de liste à remplir avant de l'appeler org-fill-paragraph.

Notez que si vous avez plusieurs paragraphes dans un élément de liste:

  ...
  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) ...

vous pouvez faire Some more text(le deuxième paragraphe) faire partie de l'élément de liste en appelant la commande comme ceci:

M-2 C-M-q

Plus précisément, org-fill-paragraph-handle-listsabsorbera un seul paragraphe sous un élément de liste par défaut, mais peut être chargé d'absorber n'importe quel nombre de paragraphes en l'appelant avec un préfixe numérique arg.

itsjeyd
la source
Intelligent! Il y a un point qui ne fonctionne pas encore tout à fait. Si le point est dans le texte qui org, par défaut, ne prendrait pas en compte une partie de l'élément (par exemple, si nous sommes sur la ligne "NOT ..." dans l'exemple), il ne se remplit pas comme prévu - c'est-à-dire, il remplit un paragraphe séparé et englobe également le point 5). Le problème semble résider dans la façon de org-mark-elementchoisir l'élément. Je vais y réfléchir davantage.
Dan
@Dan Ce problème peut être résolu en définissant une fonction qui déplace le point vers l'élément de liste précédent et en l'appelant avant de marquer les paragraphes. Voir le code mis à jour dans ma réponse.
itsjeyd