5

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

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

更新:

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

目前这是可行的: 1. 选择文本 2. 剪切 3. 其他窗口 4. 导航到所需的目标标题 5. 粘贴文本 6. 其他窗口

提议的新功能将使这更加高效:1. 选择文本 2. org-refile-region 3. 选择目标

最有用的形式是允许您从任何当前打开的文档中选择一个目标。我的用例涉及从一个缓冲区中选择文本并从另一个缓冲区中的 org-headings 中重新编译它,即从一个窗口中显示的源文档中移动文本并重新编译到另一个窗口中显示的目标文档的层次结构中的目标,就像这样:

4

1 回答 1

3

如果您使用的是 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-locationorg refiling 机制并提取文件和位置。然后我们去那个位置并插入复制的文本。为方便起见,添加了两个变量。

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

于 2014-08-12T10:57:01.553 回答