Como formatar / preencher itens de marcador mal formatados no modo organizacional?


9

P: como posso formatar / preencher itens mal formatados em uma org-modelista com marcadores?

Estou tentando descobrir como fazer o fill-paragraphtrabalho em itens com marcadores mal formatados em uma org-modelista. Por "mal formatado", quero dizer marcadores longos que usam várias linhas, mas precisam ser limpos para torná-los legíveis. A dificuldade é que org-modeparece não reconhecer as linhas subseqüentes como parte do mesmo marcador quando o primeiro caractere que não estiver em branco estiver na mesma coluna que o marcador em si.

Portanto, no exemplo abaixo, o marcador (1) não precisa ser preenchido, os marcadores (2) e (3) precisam ser preenchidos e respondem conforme o esperado fill-paragraph, mas os marcadores (4) e (5) não são preenchidos conforme o esperado:

* 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

Primeiro de tudo, por que isso acontece? Segundo, e mais ao ponto, como posso convencer org-modea tratar todas as linhas até o próximo item como parte do mesmo item para fill-paragraphfins?

Respostas:


10

Isso acontece porque a organização usa recuo para definir o texto como pertencente a um item.

(info "(org)Plain lists")

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

Para convencer a organização a fazer o que você deseja, é necessário obter o recuo do texto no nível do item. Você pode usar C-x r t( string-rectangle) ou C-x C-i( indent-rigidly) para fazer isso e o preenchimento funcionará como nos itens 2 e 3.

Se você estiver na linha do item e quiser inserir texto abaixo dela, poderá usar C-j( org-return-indent) para mover para o mesmo recuo na próxima linha. Dessa forma, você pode evitar a formatação como nos itens 4 e 5.


2

Como @KyleMeyer explica em sua resposta, org-modeo texto não considera parte de um item da lista se não for recuado além do nível do marcador correspondente. Essencialmente, precisamos de uma maneira de absorver parágrafos em itens de lista .

Com o ponto posicionado dentro de um item da lista, o comando a seguir permite fazer isso sem precisar cuidar manualmente do recuo 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)

A idéia principal é substituir as ocorrências de \npor SPCno item da lista para preencher antes de chamá org-fill-paragraph-lo.

Observe que se você tiver mais de um parágrafo dentro de um item da 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) ...

você pode fazer Some more text(o segundo parágrafo) se tornar parte do item de lista chamando o comando da seguinte maneira:

M-2 C-M-q

Mais especificamente, org-fill-paragraph-handle-listsabsorverá um único parágrafo abaixo de um item da lista por padrão, mas pode ser instruído a absorver qualquer número de parágrafos chamando-o com um prefixo numérico arg.


Inteligente! Há um ponto que ainda não está funcionando. Se houver um ponto no texto que org, por padrão, não considere parte do item (por exemplo, se estivermos na linha "NÃO ..." no exemplo), ele não será preenchido conforme o esperado - ou seja, ele é preenchido como um parágrafo separado e contém também o item 5). A questão parece estar em como org-mark-elementescolhe o elemento. Vai pensar um pouco mais.
Dan

@ Dan Este problema pode ser solucionado através da definição de uma função que retorna ao item de lista anterior e o chama antes de marcar parágrafos. Veja o código atualizado na minha resposta.
itsjeyd
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.