비슷한 문제가 있었기 때문에 이것이 도움이 될 것입니다. 조직 내보내기 또는 조직 내부에 익숙하지 않지만 조직 파일을 트리 구조로 구문 분석하는 것을 찾을 수 없습니다. 그러나 같은 버퍼가 주어졌습니다.
* england
** london
** bristol
* france
그것은 당신에게 줄 것이다
(org-get-header-tree) => ("england" ("london" "bristol") "france")
트리의 다른 정보도 포함 할 수 있습니다.
따라서 평평한 레벨 목록이 주어지면 (1 1 2 3 1) => (1 1 (2 (3)) 1)과 같은 나무를 만들어야합니다. 나는 이것을 할 함수를 찾을 수 없었기 때문에 많은 cons 셀을 그린 후에 하나를 작성했습니다 .- 더 좋은 방법이 있지만 확실합니다. 이 함수 unflatten
는 간단한 목록과 몇 가지 함수를 사용하여 목록 및 항목 수준에서 원하는 정보를 추출하고 트리 구조를 생성합니다.
에서 org-get-header-list
를 호출하여 각 항목에서 추출 할 정보를 더 추가 org-element-property
한 다음 org-get-header-tree
목록에서 정보를 추출하는 기능을 포함 할 수 있습니다.
이것은 대시 목록 처리를 포함하지 않지만 너무 많은 문제없이 처리하도록 조정할 수 있습니다 ...
(defun unflatten (xs &optional fn-value fn-level)
"Unflatten a list XS into a tree, e.g. (1 2 3 1) => (1 (2 (3)) 1).
FN-VALUE specifies how to extract the values from each element, which
are included in the output tree, FN-LEVEL tells how to extract the
level of each element. By default these are the `identity' function so
it will work on a list of numbers."
(let* ((level 1)
(tree (cons nil nil))
(start tree)
(stack nil)
(fn-value (or fn-value #'identity))
(fn-level (or fn-level #'identity)))
(dolist (x xs)
(let ((x-value (funcall fn-value x))
(x-level (funcall fn-level x)))
(cond ((> x-level level)
(setcdr tree (cons (cons x-value nil) nil))
(setq tree (cdr tree))
(push tree stack)
(setq tree (car tree))
(setq level x-level))
((= x-level level)
(setcdr tree (cons x-value nil))
(setq tree (cdr tree)))
((< x-level level)
(while (< x-level level)
(setq tree (pop stack))
(setq level (- level 1)))
(setcdr tree (cons x-value nil))
(setq tree (cdr tree))
(setq level x-level)))))
(cdr start)))
; eg (unflatten '(1 2 3 2 3 4)) => '(1 (2 (3) 2 (3 (4))))
(defun org-get-header-list (&optional buffer)
"Get the headers of an org buffer as a flat list of headers and levels.
Buffer will default to the current buffer."
(interactive)
(with-current-buffer (or buffer (current-buffer))
(let ((tree (org-element-parse-buffer 'headline)))
(org-element-map
tree
'headline
(lambda (el) (list
(org-element-property :raw-value el) ; get header title without tags etc
(org-element-property :level el) ; get depth
;; >> could add other properties here
))))))
; eg (org-get-header-list) => (("pok" 1) ("lkm" 1) (("cedar" 2) ("yr" 2)) ("kjn" 1))
(defun org-get-header-tree (&optional buffer)
"Get the headers of the given org buffer as a tree."
(interactive)
(let* ((headers (org-get-header-list buffer))
(header-tree (unflatten headers
(lambda (hl) (car hl)) ; extract information to include in tree
(lambda (hl) (cadr hl))))) ; extract item level
header-tree))
; eg (org-get-header-tree) => ("pok" "lkm" ("cedar" "yr") "kjn")
no-recursion
가org-element-map
원하는 것을해야 한다고 생각합니다 .