如何在org-mode emacs中将子树移动到另一个子树

and*_*rei 16 emacs org-mode

我想执行一个简单的任务,但似乎没有明确的解决方案:

我有这样的子树结构:

* Tree A
** Subtree A1
** Subtree A2
* Tree B
** Subtree B1
** Subtree B2
Run Code Online (Sandbox Code Playgroud)

我想设置一个关键的快捷方式将子树从树A移动到树B.移动到存档似乎很容易,但你有任何线索如何在一个文件中做到这一点?

任何帮助赞赏!谢谢!

Rém*_*émi 11

您可以尝试重新填充子树C-c C-w(它也可以将子树移动到另一个文件).

另一种方法是折叠子树,然后将其杀死C-k C-k并将其粘贴到应该的位置.

我用了一段时间的第三个解决方案是改变与子树的级别M-left,然后将其与移动M-upM-down,然后M-right把它再次在正确的水平.第三种方法的缺点是有时它会使树的其他部分移动.


Jon*_*pin 6

您可以使用 重新归档子树C-c C-w,具体取决于您重新归档的设置方式。根据目的地的深度,您可能无法将其用作有效目的地。

您可以杀死或复制子树,而不必使用杀死/复制子树命令折叠结构:C-c C-x C-w并且C-c C-x M-w分别,拉动子树是C-c C-x C-y或者简单地C-y


acu*_*ich 6

我也想换一种方式org-refile来重新提交轻松的子树,所以我写了一些代码,并推广它,这样它会在任何地方设置的任意近期目标(不只是在同一个文件).

基本用法是移入某处Tree B并键入C-c C-x C-m以标记要重新映射的目标,然后移动到要重新编译的条目Tree A并键入C-c C-w哪个将立即重新导入您设置的目标位置Tree B而不提示您,除非您org-refile-immediate-target使用前缀调用arg C-u C-c C-x C-m.

请注意,如果您C-c C-w快速连续按下以重新输入多个条目,即使org-reverse-note-order设置为t,也会保留条目的顺序,但您可以将其关闭以遵守org-reverse-note-order双前缀arg 的设置C-u C-u C-c C-x C-m.

(defvar org-refile-immediate nil
  "Refile immediately using `org-refile-immediate-target' instead of prompting.")
(make-local-variable 'org-refile-immediate)

(defvar org-refile-immediate-preserve-order t
  "If last command was also `org-refile' then preserve ordering.")
(make-local-variable 'org-refile-immediate-preserve-order)

(defvar org-refile-immediate-target nil)
"Value uses the same format as an item in `org-refile-targets'."
(make-local-variable 'org-refile-immediate-target)

(defadvice org-refile (around org-immediate activate)
  (if (not org-refile-immediate)
      ad-do-it
    ;; if last command was `org-refile' then preserve ordering
    (let ((org-reverse-note-order
           (if (and org-refile-immediate-preserve-order
                    (eq last-command 'org-refile)) nil org-reverse-note-order)))
      (ad-set-arg 2 (assoc org-refile-immediate-target (org-refile-get-targets)))
      (prog1 ad-do-it
        (setq this-command 'org-refile)))))

(defadvice org-refile-cache-clear (after org-refile-history-clear activate)
  (setq org-refile-targets (default-value 'org-refile-targets))
  (setq org-refile-immediate nil)
  (setq org-refile-immediate-target nil)
  (setq org-refile-history nil))

;;;###autoload
(defun org-refile-immediate-target (&optional arg)
  "Set current entry as `org-refile' target.
Non-nil turns off `org-refile-immediate', otherwise `org-refile'
will immediately refile without prompting for target using most
recent entry in `org-refile-targets' that matches
`org-refile-immediate-target' as the default."
  (interactive "P")
  (if (equal arg '(16))
      (progn
        (setq org-refile-immediate-preserve-order
              (not org-refile-immediate-preserve-order))
        (message "Order preserving is turned: %s"
                 (if org-refile-immediate-preserve-order
                     "on" "off")))

    (setq org-refile-immediate (unless arg t))
    (make-local-variable 'org-refile-targets)
    (let* ((components (org-heading-components))
           (level (first components))
           (heading (nth 4 components))
           (string (substring-no-properties heading)))
      (add-to-list 'org-refile-targets
                   (append (list (buffer-file-name))
                           (cons :regexp
                                 (format "^%s %s$"
                                         (make-string level ?*)
                                         string))))
      (setq org-refile-immediate-target heading))))

(define-key org-mode-map "\C-c\C-x\C-m" 'org-refile-immediate-target)
Run Code Online (Sandbox Code Playgroud)

很难在C-c C-x前缀上找到一个免费的密钥,所以我使用m了助记符i*mm*ediate