Chapter 9: Capture - Refile - Archive 76


快速捕获新想法和任务,并且将相关材料与之相链接的能力是任何一个组织管理系统中非常重要的部分.Org使用'remember.el'包来创建任务并且存储相关文件到一个特定目录中.一旦要在组织系统中移动任务和项目,只需要把整个项目树结构打包即可,方便而快速



1 Remember



Remeber包是由John Wielgley编写的,它可以使你在不怎么打断工作流的情况下快速记录.这是一个很棒的途径来新增短笺和任务到Org文件中去.remember.el包被集成到Emacs23中了,而在Emacs22则没有集成.详细信息可以参见http://www.emacswiki.org/cgi-bin/wiki/RememberMode

Org极大地扩展了Remember的可用性:你可以根据不同的记录类型定义不同的模板,将不同模板的内容存放在配置好的文件和标题下.当然,你也可以交互地选择把记录放在哪个位置上.



1.1 为Org配置Remember



下面的客户化代码告诉Remember将Org文件作为目标文件,在创建注释时采用兼容Org链接的格式.



 


1. (org-remember-insinuate) 
2. (setq org-directory "~/path/to/my/orgfiles/") 
3. (setq org-default-notes-file (concat org-directory "/notes.org")) 
4. (define-key global-map "\C-cr"


最后一行将org-remember命令绑定到全局key序列Ctrl+c r上.org-remember命令本质上的工作就是调用Remember,不过它也会自动做一些事情,比如:如果我们标识了一块文本块,你可以让它自动拷贝这块块文本块到Remember的缓冲区中. 它也允许你在在缓冲区中打开remember记录将要被保存在的目标文件并跳转到指定标题的位置:你只需要在调用org-remember时加上一个前缀参数即刻.如果你使用了两个前缀参数,Org会跳转到最后哪个Remember记录被保存的地方.

Remember缓冲区实际上使用org-mode作为它的major mode,因此它支持所有org-mode的编辑特征.在此基础上,一个名为org-remember-mode的minor mode被激活,这个minor mode的目的只有一个,那就是使用org-remember-mode-map中定义的keymap来覆盖Org-mode中原有的一些键绑定设置.

你也可以从agenda视图中调用org-remember,方法是按下k r键组合.通过这种方式调用org-remember时,若再模板中定义了插入时间戳,那么默认会填入agenda中光标所在的日期,而不是现实的日期.



1.2 Remember 模板



为了与Org整合,你可用使用模板来产生不同类型的Remember记录.例如,如果你想使用一个模板来建立标准的TODO条款,而用另一个模板来建立日志条款,使用第三个模板来收集随机产生的想法.你可用这样配置:



 

1. (setq org-remember-templates 
2. ’(("Todo" ?t "* TODO %?\n %i\n %a" "~/org/TODO.org" "Tasks") 
3. ("Journal" ?j "* %U %?\n\n %i\n %a" "~/org/JOURNAL.org") 
4. ("Idea" ?i "* %^{Title}\n %i\n %a" "~/org/JOURNAL.org" "New Ideas")))
1. (setq org-remember-templates 
2. ’(("Todo" ?t "* TODO %?\n %i\n %a" "~/org/TODO.org" "Tasks") 
3. ("Journal" ?j "* %U %?\n\n %i\n %a" "~/org/JOURNAL.org") 
4. ("Idea" ?i "* %^{Title}\n %i\n %a" "~/org/JOURNAL.org" "New Ideas")))


这里面,第一个字符串只是一个名字,接下来用一个字符指定了如何选择模板.一般来说,通常这个字符会是名字的第一个字符.再下一个字符串定义了模板的内容.再接下来是两个可选字符串,给出了新增加的记录应该放在哪个文件的哪个标题下. 如果没有指定文件名或者文件名为nil的情况下,该文件默认为org-default-notes-file值中所定义的文件名, 如果没有指定标题名称,则标题默认为org-remember-default-headline中所定义的值. 如果文件名不是绝对路径,那么它的路径是相对于org-directory来定的.

标题这一项也可以为符号top或者bottom,这代表把记录作为第一层,放到文件的开头(top)或者文件的结尾(bottom).标题也可以为值date-tree,这样的话org文件中会自动建立一个年为第一层,月份为第二层,天位第三层的树,而新增的记录就会根据当前的日期,填入树中.

第六个元素是一个可选项,它界定了在哪些情景下我们才可以选择这个模板.这个元素可以是一个major mode的列表或function. org-remember首先会检查这个function是否返回t,或者我们是否处于major mode列表中所列的某个major mode中,然后将不满足条件的模板排除掉.若模板中这一项没有定义或者这一项的值为nil或t,那么该模板总是可以选择的.



下面是一个例子:


1. (setq org-remember-templates 
2. "Bug" ?b "* BUG %?\n %i\n %a" "~/org/BUGS.org" "Bugs"
3. "Journal" ?j "* %U %?\n\n %i\n %a" "~/org/JOURNAL.org" "X" my-check) 
4. "Idea" ?i "* %^{Title}\n %i\n %a" "~/org/JOURNAL.org" "New Ideas")))


第一个模板之后当org-remember是从emacs-lisp-mode的缓冲区中被调用时才是可用的.第二个模板只有当函数my-check返回值为t时才可用.第三个模板在任何情景下都是可用的.

当你执行M-x org-remember (or M-x remember) 来调用remember记录事情的时候, Org会提示输入一个键来选择模板(如果你定义了超过一个模板的话),然后,缓冲区就会显示为类似下面这样

* TODO  [[file:link to where you called remember]]
 
 
    

      当模板被扩展时,特定的%开头字符会自动插入相应的内容: 
    
 
    
* %^{提示语句}  把提示语句提示给用户,并插入用户的输入.  你可以定义默认值和可选列表,语法为:{提示语句|默认值|可选值1|可选值2...}.  可用用方向键来获取输入的历史* %a  注释,一般来说会根据org-store-link定义的值来创建这条链接* %A  类似于%a, 但是会提示输入链接的描述部分* %i  若remember被调用时用了C-u前缀,则会插入region的内容.  文本的缩进不变.* %t   插入时间戳,但是只插入日期* %T  插入时间戳,包括日期和时间* %u, %U  类似于%t和%T,但是不会让你有选择时间戳的机会* %^t  类似%t, 但是会提示输入时间.%^T, %^u, %^U也类似.你也可用自定义一个提示信息,语法为%^{提示信息}t* %n  插入用户名(从变量user-full-name中获得)* %c  插入当前kill ring最开头部分的内容.* %x  插入X系统粘贴板的内容* %^C   提供交互功能让用户选择插入那个kill 或 clip 的内容.* %^L   类似于%^C, 但是以链接的方式插入.* %k  插入当前计时任务的标题* %K   链接到当钱计时任务* %^g   提示输入tag,能够自动补完目标文件中定义的tag* %^G   提示输入tag,能够自动补完所有agenda文件中的所有tag* %^{prop}p  提示用户输入属性prop的值* %:指定类型的关键字  指定信息为特定的链接类型.可选的关键字在后面有列出.* %[file]  插入file的内容* %(elisp表达式)  计算elisp表达式,并插入计算结果* %!   补完template后,理解保存记录  (通常情况下需要按C-c C-c来触发保存动作,但是这里跳过这一步了)* %&   保存记录之后,立即跳转到保存的地址* %?   在完成模板替换之后,鼠标放置在这个位置
 
    

      可选值的链接类型关键字为: 
    
 
    
Link type          | Available keywords-------------------+----------------------------------------------bbdb               | %:name %:companybbdb               | %::server %:port %:nickvm, wl, mh, rmail  | %:type %:subject %:message-id                   | %:from %:fromname %:fromaddress                   | %:to %:toname %:toaddress                   | %:fromto (either "to NAME" or "from NAME")5gnus               | %:group, for messages also all email fieldsw3, w3m            | %:urlinfo               | %:file %:node calendar           | %:date"
 
    
如果你改变主意想换另一个模板,可以在remember缓冲区中调用org-remember.然后你可以选择新的模板,而以前的信息会自动填充入这个新的模板
 
  
1.3 储存Remember记录
 
   
当你用Remember完成了一笔记录的输入,你需要按C-c C-c来保存这条记录. 如果你再Remember缓冲区中已经打开了计时,那么你首先会被询问是否想要关掉计时.如果你选择 n,那么在记录保存后,依然在计时.
Remember会把新增的记录添加到指定的文件中指定的标题下.如果在定义模板时没有指定文件和标题,那么会使用默认的文件和标题. 随后Remember被关闭,窗口回到调用Remember之前的情景中. To re-use the location found during the last call to Remember, 使用C-0 C-c C-c退出Remember缓冲区. 使用C-2 C-c C-c退出则会将记录作为当前计时项目的子节点. C-3 C-c C-c退出则会将记录作为当前计时项目的兄弟节点.
如果你想把记录直接保存到另一个地方,使用C-1 C-c C-c而不要退出Remember. Remember首先会提示你输入目标文件-如果你直接按RET,那么默认为模板中定义的文件. 然后命令提供了目标文件中的标题树,这时光标放在模板中定义的标题上(如果在模板中定义了标题的话).你可以立刻按RET来把记录存放在此处,也可以通过下面的按键来选择另一个不同的位置来存放.
TAB            Cycle visibility.<down>/<up>    Next/previous visible headline.n / p          Next/previous visible headline.f / b          Next/previous headline same level.u              One level up.

      按下RET或者<left>,<right>会产生如下效果 
    
 
    
Cursor position               Key            Note gets insertedon headline                   RET            as sublevel of the heading at cursor, first or last depending on org-reverse-note-order.                          left / right       as same level, before/after current headingbuffer-start                  RET            as level 2 heading at end of file or level 1 at beginning depending on org-reverse-note-order.not on headline               RET            at cursor position, level taken from context.

在插入文本到树之前,程序保证插入的文本会有一个标题,也即是说,第一行会以* 开头. 如果第一行不是以* 开头的话,那么会根据当前日期自动生成一个标题. 如果你在Remember标题下把文本的缩进都调好了, 而文本在插入树时却发现不是放在第一层,Remember会自动帮你把记录降级以适应所需要的缩进.