在Emacs组织模式中,如何重新组织组织标题下的突出显示文本?

在Emacs组织模式中,有没有办法在组织标题下自动重新标注突出显示的文本?即切割突出显示的文本并自动将其粘贴到我选择的组织标题下?

你可以称之为org-refile-region.与org-refile类似,但不是重新填充整个子树,而只重新填充当前文档中任何标题下的突出显示区域.

更新:

理想情况下,此功能将独立于org-refile使用的org-agenda文件,以避免将不相关的标题显示为可能的目标.

目前这是可行的:
1.选择文字

其他窗口
4.导航到所需的目标标题
5.粘贴文字
6.其他窗口

拟议的新功能将提高效率:
1.选择文字
2. org-refile-region
3.选择目标

最有用的形式允许您从任何当前打开的文档中选择目标.我的用例包括从一个缓冲区中选择文本并从另一个缓冲区中的org-headings中重新选择文本,即从一个窗口中显示的源文档移动文本并重新映射到另一个窗口中显示的目标文档层次结构中的目标,如此:

最佳答案 如果您使用的是emacs 24.1或更高版本,则可以尝试

(setq org-refile-active-region-within-subtree t)

这几乎可以做你想要的,但将你突出显示文本的行(emacs术语是“活动区域”)转换为标题.

如果要将突出显示的文本移动到另一个标题,则必须扩展org-mode.幸运的是,org提供了您需要的工具.这是一个例子:

(defvar org-refile-region-format "\n%s\n")

(defvar org-refile-region-position 'top
  "Where to refile a region. Use 'bottom to refile at the
end of the subtree. ")

(defun org-refile-region (beg end copy)
  "Refile the active region.
If no region is active, refile the current paragraph.
With prefix arg C-u, copy region instad of killing it."
  (interactive "r\nP")
  ;; mark paragraph if no region is set
  (unless (use-region-p)
    (setq beg (save-excursion
                (backward-paragraph)
                (skip-chars-forward "\n\t ")
                (point))
          end (save-excursion
                (forward-paragraph)
                (skip-chars-backward "\n\t ")
                (point))))
  (let* ((target (save-excursion (org-refile-get-location)))
         (file (nth 1 target))
         (pos (nth 3 target))
         (text (buffer-substring-no-properties beg end)))
    (unless copy (kill-region beg end))
    (deactivate-mark)
    (with-current-buffer (find-file-noselect file)
      (save-excursion
        (goto-char pos)
        (if (eql org-refile-region-position 'bottom)
            (org-end-of-subtree)
          (org-end-of-meta-data-and-drawers))
        (insert (format org-refile-region-format text))))))

我们使用org-refile-get-location来应用org重新启动机制并提取文件和位置.然后我们转到该位置并插入复制的文本.为方便起见添加了两个变量

org-refile-targets允许您控制要考虑的文件,例如:

nil  ;; only the current file
'((org-agenda-files :maxlevel . 2)) ;; all agenda files, 1st/2nd level
'((org-files-list :maxlevel . 4)) ;; all agenda and all open files
'((my-org-files-list :maxlevel . 4)) ;; all files returned by `my-org-files-list'

要将refiling限制为当前打开的org缓冲区,请定义一个函数

(defun my-org-files-list ()
  (mapcar (lambda (buffer)
            (buffer-file-name buffer))
          (org-buffer-list 'files t)))

然后要么

(setq org-refile-targets '((my-org-files-list :maxlevel . 4)))

或使用

M-x customize-option <ret> org-refile-targets

从“值菜单”中选择“功能”,然后键入my-org-files-list

点赞