回答:
org-map-entries
これを行う典型的な方法は次のとおりです。
(org-map-entries FUNC&optional MATCH SCOPE&rest SKIP)
SCOPEのMATCHで選択された各見出しでFUNCを呼び出します。
これはの結果を返すFUNC
ので、それらをカウントして、一致した見出しの数MATCH
(org-agenda
スタイル検索文字列)を取得できます。 ツリーポイントのみがオンになっているSCOPE
ことtree
を確認nil
するように、バッファ全体region
を検索するように、現在の領域と他のいくつかの特殊な領域を検索するように設定できます。
結果の数だけに関心がある場合、関数は何もする必要はありません。あなたの例は次のようになります:
(length (org-map-entries t "LEVEL=2" 'tree))
(length (org-map-entries t "LEVEL=3" nil))
MATCH
文字列は、タグ、プロパティまたはあなたがのための議題の検索を行うことができない何かを検索することができます。
これらはテストされていませんが、近いはずです。
(length (org-map-entries t "LEVEL=2" 'tree))
(length (org-map-entries t "LEVEL=3" 'file))
org-map-entries
非常に強力であり、数を数える以上のことができます。詳細については、ドキュメントを参照してください(これには非常に近い例が含まれています)。
そして、これは非/慣用的ではない方法です:
(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))))))