組織モードで不十分なフォーマットの箇条書き項目をフォーマット/入力する方法は?


9

Q:org-mode箇条書きリストの形式の悪いアイテムをどのようにフォーマット/入力できますか?

リストfill-paragraph内の不適切な形式の箇条書き項目を処理する方法を理解しようとしていorg-modeます。「フォーマットが悪い」とは、複数行を使用しているが、読みやすくするためにクリーンアップする必要がある、長めの箇条書きを意味します。問題はorg-mode、最初の空白以外の文字が箇条書き自体と同じ列にある場合、後続の行が同じ箇条書きの一部として認識されないように見えることです。

したがって、以下の例では、箇条書き(1)は埋める必要がなく、箇条書き(2)および(3)は埋める必要があり、期待どおりに応答しますfill-paragraphが、箇条書き(4)および(5)は期待どおりに埋められません。

* 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

まず、なぜこれが起こるのですか?第二に、そして要点org-modeとして、次の箇条書きまでのすべての行をfill-paragraph目的のために同じ箇条書きの一部として扱うことをどのように説得できますか?

回答:


10

Orgはインデントを使用してテキストをアイテムに属するものとして定義するために発生します。

(info "(org)Plain lists")

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

Orgにあなたがやりたいことをさせるには、テキストをアイテムのレベルまでインデントする必要があります。これを行うにはC-x r tstring-rectangle)または C-x C-iindent-rigidly)を使用できます。その後、#2および#3のように入力が機能します。

アイテム行にいて、その下にテキストを入力したい場合は、C-jorg-return-indent)を使用して次の行の同じインデントに移動できます。そうすれば、#4や#5のようなフォーマットを回避できます。


2

@KyleMeyerが彼の回答で説明しorg-modeているように、対応する箇条書きのレベルを超えてインデントされていない場合、テキストはリストアイテムの一部とは見なされません。したがって、本質的に、段落をリストアイテム吸収する方法が必要です。

ポイントがリストアイテム内に配置されている場合、次のコマンドを使用すると、手動でインデントを処理する必要がありません。

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

主なアイデアは、それを呼び出す前に、埋めるリスト項目内のの出現を\nで置き換えることです。SPCorg-fill-paragraph

リストアイテム内に複数の段落がある場合は注意してください。

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

Some more text次のようなコマンドを呼び出すことで(2番目の段落)をリスト項目の一部にすることができます。

M-2 C-M-q

より具体的にorg-fill-paragraph-handle-listsは、デフォルトではリスト項目の下の単一の段落を吸収しますが、数値の接頭辞argを付けて呼び出すことにより、任意の数の段落を吸収するように指示できます。


賢い!まだ十分に機能していない点が1つあります。ポイントがorgデフォルトでアイテムの一部と見なされないテキスト内にある場合(たとえば、例の「NOT ...」行にある場合)、意図したとおりに入力されません-つまり、別の段落として記入され、項目5)も丸められます。問題org-mark-elementは、要素の選択方法にあるようです。もう少し考えてみます。
ダン

@Danこの問題は、ポイントを前のリストアイテムに戻す関数を定義し、段落をマークする前に呼び出すことで解決できます。私の回答で更新されたコードを参照してください。
itsjeyd 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.