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

时间:2014-08-12 04:43:52

标签: emacs org-mode emacs-helm

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

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

更新:

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

目前这可以通过以下方式实现: 1.选择文字 切 其他窗口 4.导航到所需的目标标题 5.粘贴文字 6.其他窗口

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

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

1 个答案:

答案 0 :(得分:2)

如果您使用的是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-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'

要限制重新发送到当前打开的组织缓冲区,请定义一个函数

(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