“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——若是真的有广大Emacs用户的话,哈哈哈。
GTD的第一条原则是“搜集”,为此我有一个inbox.org
文件,专门记录全部的新想法、新任务。我会在每晚的固定时间处理其中的内容——有些能够立刻开始作并作完,更多的则是移动到其它.org
文件中,等待排期。html
org-mode有一个内置的快捷键C-c C-w
,专门完成将条目(org-mode的术语,即.org
文件中带星号前缀的一行,参见An Explanation of Basic Org-Mode Concepts)移动到其它.org
文件的需求,但它有一个缺陷——不能把条目移动到其它.org
文件的顶层,而这是我常常须要作的。git
为了移动到顶层,须要:github
org-cut-subtree
命令剪切当前条目(其实还会包括条目的子节点,但inbox.org
中的条目基本上都没有子节点);.org
文件;org-paste-subtree
命令粘贴条目。为了轻松完成上述四个步骤,org-refile-to-eof
函数应运而生。函数
废话很少说,直接亮相吧code
;;; 定义一个Helm的source,以便选择要粘贴的.org文件 (defvar *org-refile-eof--helm-source* nil "用于提供目标.org文件下拉菜单的来源") ;;; 将当前条目剪切并粘贴到某个目标.org文件的末尾 (defun org-refile-to-eof () "将当前条目剪切到一个.org文件的末尾。" (interactive) ;; 先调用Helm获取目标.org文件。这里须要处理没有选中任何文件的状况 (let ((path (helm :sources '(*org-refile-eof--helm-source*)))) (when path (org-cut-subtree) (save-excursion ;; 打开选中的文件的buffer,并移动到最后 (find-file path) (end-of-buffer) ;; 调用org-paste-subtree粘贴进去 (org-paste-subtree)))))
变量*org-refile-eof--helm-source*
定义了helm
函数所要求的下拉列表名称、选项,以及选中后的处理逻辑(Helm的使用能够从How to write helm extension入门)。在个人环境中,它的值是htm
(setq *org-refile-eof--helm-source* '((name . "refile到下列的哪一个文件") (candidates . org-agenda-files) (action . (lambda (candidate) candidate))))
如今,只须要敲入M-: org-refile-to-eof RET
便能轻松完成以前繁琐的四个步骤。ip
若是有迫切需求的话,我会考虑将org-refile
(也就是C-c C-w
对应的命令)和org-refile-to-eof
合并在一块儿。例如,按下C-c C-w
时调用的是org-refile
,而按下C-u C-c C-w
时调用的则是org-refile-to-eof
,想一想也有点小激动呢。get
阅读原文emacs