Cách thành ngữ để đếm cây con chế độ org?


7

Có một cách thành ngữ để đếm các cây con chế độ org?

Tôi đã tìm kiếm ở đây trên emacs.sx và các công cụ tìm kiếm khác, nhưng tôi không thể tìm thấy câu trả lời.

Tôi biết người ta có thể dễ dàng đếm số cây con với biểu thức chính quy, nhưng tôi đã tự hỏi liệu API org có nghĩa là đáp ứng các nhu cầu đếm phức tạp hơn không, như,

  • Có bao nhiêu tiêu đề cấp hai dưới cây hiện tại?
  • Có bao nhiêu tiêu đề cấp ba trong tổng số trong bộ đệm hiện tại?

Câu trả lời:


4

org-map-entries là một cách điển hình để làm điều này:

(org-map-entry FUNC & MATCH SCOPE tùy chọn & phần còn lại SKIP)

Gọi FUNC ở mỗi tiêu đề được chọn bởi MATCH trong SCOPE.

Nó trả về kết quả FUNC, vì vậy bạn có thể đếm chúng để lấy số lượng tiêu đề phù hợp MATCH(là org-agendachuỗi tìm kiếm kiểu). SCOPEcó thể được đặt để treechỉ kiểm tra điểm cây đang bật, nilđể tìm kiếm toàn bộ bộ đệm, regionđể tìm kiếm khu vực hiện tại và một vài điểm chuyên biệt khác.

Nếu bạn chỉ quan tâm đến số lượng kết quả, thì hàm không phải làm gì cả. Ví dụ của bạn biến thành:

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

Các MATCHchuỗi có thể tìm kiếm thẻ, tài sản hay bất cứ điều gì khác mà bạn có thể thực hiện một tìm kiếm chương trình nghị sự cho.


1
Jinx! Những bộ óc vĩ đại luôn gặp nhau :-)
NickD

4

Đây là chưa được kiểm tra nhưng họ nên được gần gũi:

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

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

org-map-entriesrất mạnh mẽ và có thể làm được nhiều việc hơn là đếm mọi thứ: xem tài liệu để biết chi tiết (bao gồm một ví dụ rất gần với điều này).


1
Tôi ước tôi có thể chấp nhận hai câu trả lời, câu trả lời của bạn cũng tốt như erikstokes '. Vì nó không thể được thực hiện, tôi phải ưu tiên thời gian. Cảm ơn bạn rất nhiều cho các liên kết.
gsl

1
Điều đó là hoàn toàn phù hợp.
NickD

1

Và đây là cách không / ít thành ngữ:

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

Cảm ơn bạn, tôi đã kiểm tra mã một vài giờ trước và nó không hoạt động, nhưng bây giờ nó hoạt động hoàn hảo. Tôi không thể chấp nhận nó như là câu trả lời cho "cách thành ngữ", nhưng tôi vẫn đánh giá cao mã và được nâng cấp. Rất đẹp. Cảm ơn bạn.
gsl

1
Phù. Tôi đã ở gần đó từ một downvote. Nhưng dù sao, cảm ơn những lời tốt đẹp.
jagrg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.