-
-
Save xcodebuild/87b116291aa87fde72cb to your computer and use it in GitHub Desktop.
| ;; org-archive-subtree-hierarchical.el | |
| ;; modified from https://lists.gnu.org/archive/html/emacs-orgmode/2014-08/msg00109.html | |
| ;; In orgmode | |
| ;; * A | |
| ;; ** AA | |
| ;; *** AAA | |
| ;; ** AB | |
| ;; *** ABA | |
| ;; Archiving AA will remove the subtree from the original file and create | |
| ;; it like that in archive target: | |
| ;; * AA | |
| ;; ** AAA | |
| ;; And this give you | |
| ;; * A | |
| ;; ** AA | |
| ;; *** AAA | |
| (require 'org-archive) | |
| (defun org-archive-subtree-hierarchical--line-content-as-string () | |
| "Returns the content of the current line as a string" | |
| (save-excursion | |
| (beginning-of-line) | |
| (buffer-substring-no-properties | |
| (line-beginning-position) (line-end-position)))) | |
| (defun org-archive-subtree-hierarchical--org-child-list () | |
| "This function returns all children of a heading as a list. " | |
| (interactive) | |
| (save-excursion | |
| ;; this only works with org-version > 8.0, since in previous | |
| ;; org-mode versions the function (org-outline-level) returns | |
| ;; gargabe when the point is not on a heading. | |
| (if (= (org-outline-level) 0) | |
| (outline-next-visible-heading 1) | |
| (org-goto-first-child)) | |
| (let ((child-list (list (org-archive-subtree-hierarchical--line-content-as-string)))) | |
| (while (org-goto-sibling) | |
| (setq child-list (cons (org-archive-subtree-hierarchical--line-content-as-string) child-list))) | |
| child-list))) | |
| (defun org-archive-subtree-hierarchical--org-struct-subtree () | |
| "This function returns the tree structure in which a subtree | |
| belongs as a list." | |
| (interactive) | |
| (let ((archive-tree nil)) | |
| (save-excursion | |
| (while (org-up-heading-safe) | |
| (let ((heading | |
| (buffer-substring-no-properties | |
| (line-beginning-position) (line-end-position)))) | |
| (if (eq archive-tree nil) | |
| (setq archive-tree (list heading)) | |
| (setq archive-tree (cons heading archive-tree)))))) | |
| archive-tree)) | |
| (defun org-archive-subtree-hierarchical () | |
| "This function archives a subtree hierarchical" | |
| (interactive) | |
| (let ((org-tree (org-archive-subtree-hierarchical--org-struct-subtree)) | |
| (this-buffer (current-buffer)) | |
| (file (abbreviate-file-name | |
| (or (buffer-file-name (buffer-base-buffer)) | |
| (error "No file associated to buffer"))))) | |
| (save-excursion | |
| (setq location (org-get-local-archive-location) | |
| afile (org-extract-archive-file location) | |
| heading (org-extract-archive-heading location) | |
| infile-p (equal file (abbreviate-file-name (or afile "")))) | |
| (unless afile | |
| (error "Invalid `org-archive-location'")) | |
| (if (> (length afile) 0) | |
| (setq newfile-p (not (file-exists-p afile)) | |
| visiting (find-buffer-visiting afile) | |
| buffer (or visiting (find-file-noselect afile))) | |
| (setq buffer (current-buffer))) | |
| (unless buffer | |
| (error "Cannot access file \"%s\"" afile)) | |
| (org-cut-subtree) | |
| (set-buffer buffer) | |
| (org-mode) | |
| (goto-char (point-min)) | |
| (while (not (equal org-tree nil)) | |
| (let ((child-list (org-archive-subtree-hierarchical--org-child-list))) | |
| (if (member (car org-tree) child-list) | |
| (progn | |
| (search-forward (car org-tree) nil t) | |
| (setq org-tree (cdr org-tree))) | |
| (progn | |
| (goto-char (point-max)) | |
| (newline) | |
| (org-insert-struct org-tree) | |
| (setq org-tree nil))))) | |
| (newline) | |
| (org-yank) | |
| (when (not (eq this-buffer buffer)) | |
| (save-buffer)) | |
| (message "Subtree archived %s" | |
| (concat "in file: " (abbreviate-file-name afile)))))) | |
| (defun org-insert-struct (struct) | |
| "TODO" | |
| (interactive) | |
| (when struct | |
| (insert (car struct)) | |
| (newline) | |
| (org-insert-struct (cdr struct)))) | |
| (defun org-archive-subtree () | |
| (org-archive-subtree-hierarchical) | |
| ) |
您好。添加到 init.el 后,用 org-archive-subtree 来归档,结果出现错误: Wrong type argument: commandp, org-archive-subtree。
GNU Emacs 25.1.1 (x86_64-apple-darwin16.1.0, NS appkit-1504.60 Version 10.12.1 (Build 16B2555)) of 2016-11-27
Org mode version 9.0.5 (9.0.5-elpa @ /Users/Nerrons/.emacs.d/elpa/org-20170210/)
谢谢解答!很期望能用上这个功能!
我也遇到同样的问题,系统环境和nerrons一样,我用spacemacs的配置,代码复制到user-config
我加上(interactive) 不报错了
和二楼有同样需求,设置location后不报错,但没反应,原条目还在
Firstly,
I could not use spacemacs default keybindings to use this.
I added:
(setq org-archive-default-command 'org-archive-subtree-hierarchical)
and used C-c C-x C-a.
When a subheading has been archived prior to a parent heading, it will create a duplicate parent heading.
I have a .org-file that looks like this:
* 1a-heading
** 2a-Heading
Foo bar text
*** 3a-heading
*** 3b-heading
When i archive *** 3b it correctly creates the following archive:
* 1a-heading
** 2a-Heading
*** 3b-heading
However, when i later archive the parent heading (** 2a)
The archive looks like the following:
* 1a-heading
** 2a-Heading
Foo bar text
*** 3a-heading
** 2a-Heading
*** 3b-heading
This code does not work correctly when
org-archive-locationis set to something like::* Archived(that is, archive to the same file beneath the Archived headline). Would you be able to update it to handle prefix headlines as target locations?