Come formattare / riempire gli elementi bullet non formattati in modalità organizzazione?


9

D: come posso formattare / riempire gli articoli scarsamente formattati in un org-modeelenco puntato?

Sto cercando di capire come far fill-paragraphfunzionare un org-modeelenco puntato di elementi formattati male . Per "mal formattato" intendo proiettili a lunga durata che usano più righe ma devono essere ripuliti per renderli leggibili. La difficoltà è che org-modenon sembra riconoscere le righe successive come parte dello stesso punto elenco quando il primo carattere non bianco si trova nella stessa colonna del punto elenco stesso.

Pertanto, nell'esempio seguente, il punto elenco (1) non necessita di riempimento, i punti elenco (2) e (3) devono essere riempiti e rispondono come previsto fill-paragraph, ma i punti elenco (4) e (5) non si riempiono come previsto:

* 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

Prima di tutto, perché succede? Secondo, e più precisamente, come posso convincere org-modea trattare tutte le linee fino al prossimo proiettile come parte dello stesso proiettile per fill-paragraphscopi?

Risposte:


10

Succede perché Org utilizza il rientro per definire il testo come appartenente a un elemento.

(info "(org)Plain lists")

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

Per convincere Org a fare quello che vuoi, devi far rientrare il testo a livello dell'articolo. Puoi usare C-x r t( string-rectangle) o C-x C-i( indent-rigidly) per fare questo e poi il riempimento funzionerà come in # 2 e # 3.

Se ci si trova nella riga dell'elemento e si desidera inserire il testo sottostante, è possibile utilizzare C-j( org-return-indent) per passare alla stessa rientranza nella riga successiva. In questo modo, puoi evitare la formattazione come in # 4 e # 5.


2

Come spiega @KyleMeyer nella sua risposta, il org-modetesto non fa parte di un elemento dell'elenco se non è rientrato oltre il livello del punto corrispondente. Quindi, essenzialmente, abbiamo bisogno di un modo per assorbire i paragrafi negli elementi dell'elenco .

Con il punto posizionato all'interno di un elemento dell'elenco, il comando seguente consente di farlo senza dover occuparsi manualmente del rientro:

(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'idea principale è quella di sostituire le occorrenze di \ncon SPCnella voce di elenco da riempire prima di richiamarla org-fill-paragraph.

Nota che se hai più di un paragrafo all'interno di una voce di elenco:

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

puoi fare in modo che Some more text(il secondo paragrafo) diventi parte dell'elemento dell'elenco chiamando il comando in questo modo:

M-2 C-M-q

Più specificamente, org-fill-paragraph-handle-listsassorbirà un singolo paragrafo sotto una voce di elenco per impostazione predefinita, ma può essere incaricato di assorbire qualsiasi numero di paragrafi chiamandolo con un prefisso numerico arg.


Intelligente! C'è un punto che non funziona ancora del tutto. Se il punto è nel testo quelloorg , per impostazione predefinita, non prenderebbe in considerazione parte dell'elemento (ad esempio, se ci troviamo nella riga "NON ..." nell'esempio), non verrà riempito come previsto, ovvero, si riempie come un paragrafo separato e assorbe anche l'elemento 5). Il problema sembra essere nella org-mark-elementscelta dell'elemento. Ci penserò ancora.
Dan

@Dan Questo problema può essere risolto definendo una funzione che torna al punto precedente dell'elenco e chiamandolo prima di contrassegnare i paragrafi. Vedi il codice aggiornato nella mia risposta.
itsjeyd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.