組織モードのサブツリーを数える慣用的な方法?


7

組織モードのサブツリーをカウントする慣用的な方法はありますか?

emacs.sxなどの検索エンジンで検索しましたが、答えが見つかりませんでした。

正規表現を使用してサブツリーを簡単にカウントできることはわかっていますが、組織のAPIに次のようなより高度なカウントのニーズを満たす手段があるかどうか疑問に思っていました。

  • 現在のツリーの下に第2レベルの見出しはいくつありますか?
  • 現在のバッファに合計で第3レベルの見出しはいくつありますか?

回答:


4

org-map-entries これを行う典型的な方法は次のとおりです。

(org-map-entries FUNC&optional MATCH SCOPE&rest SKIP)

SCOPEのMATCHで選択された各見出しでFUNCを呼び出します。

これはの結果を返すFUNCので、それらをカウントして、一致した見出しの数MATCHorg-agendaスタイル検索文字列)を取得できます。 ツリーポイントのみがオンになっているSCOPEことtreeを確認nilするように、バッファ全体regionを検索するように、現在の領域と他のいくつかの特殊な領域を検索するように設定できます。

結果の数だけに関心がある場合、関数は何もする必要はありません。あなたの例は次のようになります:

  • (length (org-map-entries t "LEVEL=2" 'tree))
  • (length (org-map-entries t "LEVEL=3" nil))

MATCH文字列は、タグ、プロパティまたはあなたがのための議題の検索を行うことができない何かを検索することができます。


1
ジンクス!素晴らしい心は常に会う:-)
NickD

4

これらはテストされていませんが、近いはずです。

(length (org-map-entries t "LEVEL=2" 'tree))

(length (org-map-entries t "LEVEL=3" 'file))

org-map-entries非常に強力であり、数を数える以上のことができます。詳細については、ドキュメントを参照してください(これには非常に近い例が含まれています)。


1
私は2つの答えを受け入れることができればいいのに、あなたの答えはエリクトークスと同じくらい良いです。出来ないのでタイミングを優先しました。リンクありがとうございます。
gsl

1
それは完全に適切です。
NickD

1

そして、これは非/慣用的ではない方法です:

(defun count-subtrees ()
  (interactive)
  (let (lvs)
    (save-excursion
      (goto-char (point-max))
      (while (outline-previous-heading)
        (let* ((hl (org-element-at-point))
               (lv (org-element-property :level hl)))
          (push lv lvs))))
    (let* ((depth (cl-sort lvs #'<))
           (min-lv (car depth))
           (max-lv (car (last depth))))
      (cl-loop for lv from min-lv to max-lv
               for count = (cl-count-if (lambda (elt)
                                          (= elt lv))
                                        lvs)
               collect (print (cons lv count))))))

ありがとう、私は数時間前にコードをテストしましたが、機能しませんでしたが、今では完全に機能します。「慣用的な方法」の答えとしてそれを受け入れることはできませんが、それでもコードを高く評価して賛成しています。非常に素晴らしい。ありがとうございました。
gsl

1
ふew。私は反対投票からそれほど近かった。とにかく、優しい言葉をありがとう。
jagrg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.