Emacs org capture的启用设定
(setq org-capture-templates
'(
("t" "Todo" entry (file+headline "gtd.org" "待办事项")
"* TODO %?\n %i\n"
:empty-lines 1)
("x" "NEXT" entry (file+headline "gtd.org" "下一步行动")
"* NEXT [#B] %?\n %i\n"
:empty-lines 1)
("m" "MAYBE" entry (file+headline "gtd.org" "将来/也许") "* MAYBE [#C] %?\n %i\n" )
("w" "WAITING" entry (file+headline "gtd.org" "等待waiting")
"* WAITING [#A] %? %^G %i\n %U")
("l" "待确定讨论 CheckList" checkitem (file+headline "gtd.org" "待确定") " [ ] %?\n\n" :prepend t :kill-buffer t)
;; For capturing details of bills
("z" "账单表格 Bill" table-line (file+headline "gtd.org" "12月账单" ) "| %U | %^{people} | %^{物品} | %^{数量} | %^{价格}| " :prepend t :kill-buffer t)
("k" "考勤清单 List" item (file+headline "gtd.org" "考勤") " %? ")
("j" "一句话备忘录 Journal" entry (file+datetree "journal.org") "* %?")
("s" "Code Snippet" entry (file "snippets.org") "* %?\t%^g\n#+BEGIN_SRC %^{language}\n\n#+END_SRC")
("n" "笔记" entry (file+headline "notes.org" "Quick notes")
"* %?\n %i\n %x\n %u\n"
:clock-in t)
;; To capture ideas for my blog
("b" ; key
"Blog" ; name
entry ; type
(file+headline "notes.org" "Blog") ; target
"* %^{Title} :blog:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
("l" "links" entry (file+headline "~/org-notes/notes.org" "Quick notes")
"* TODO [#C] %?\n %i\n %a \n %U"
:empty-lines 1)))
(setq org-capture-templates
(quote
(
("l" "Later" checkitem (file+headline "scratch.org" "later") " [ ] %?\n\n" :prepend t :kill-buffer t)
)))
;; 账单
("a" "Account" table-line (file+headline "account.org" "Web accounts") "| %? | | %a | %U |")
Instead of using %(org-set-tags) in the template, use %^g
(setq org-capture-templates '(
;; For code snippets
("a" ; key
"Algo/Code" ; name
entry ; type
(file+headline "~/Dropbox/org/notes.org" "Code") ; target
"* %^{TITLE} %(org-set-tags) :code:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\#+BEGIN_SRC %^{language}\n%?\n\#END_SRC" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For taking notes on random things
("n" ; key
"Note" ; name
entry ; type
(file+headline "~/Dropbox/org/notes.org" "Notes") ; target
"* %? %(org-set-tags) :note:\n:PROPERTIES:\n:Created: %U\n:Linked: %A\n:END:\n%i" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; Ledger is a CLI accounting system
("l" ; key
"Ledger" ; name
entry ; type
(file+datetree "~/Dropbox/org/ledger.org" "Ledger") ; target
"* %^{expense} %(org-set-tags) :accounts:\n:PROPERTIES:\n:Created: %U\n:END:\n%i
#+NAME: %\\1-%t
\#+BEGIN_SRC ledger :noweb yes
%^{Date of expense (yyyy/mm/dd)} %^{'*' if cleared, else blank} %\\1
%^{Account name} $%^{Amount}
%?
\#+END_SRC
" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For notes or something regarding more work
("w" ; key
"Work" ; name
entry ; type
(file+headline "~/Dropbox/org/phd.org" "Work") ; target
"* TODO %^{Todo} %(org-set-tags) :work:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For capturing some things that are worth reading
("r" ; key
"Reading" ; name
entry ; type
(file+headline "~/Dropbox/org/fun.org" "Reading") ; target
"* %^{Title} %(org-set-tags)\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For capturing minutes of the meeting
("m" ; key
"Meeting" ; name
entry ; type
(file+datetree "~/Dropbox/org/phd.org" "Meeting") ; target
"* %^{Title} %(org-set-tags) :meeting:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n** Agenda:\n%?\n\n** Minutes of the meeting:\n" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; To practice for my driving test
("d" ; key
"Drill driving" ; name
entry ; type
(file+headline "~/Dropbox/org/drill.org" "Driving") ; target
"* Question :drill:driving:\n%^{Question}\n** Answer\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For taking notes of math/stats stuff that I keep forgetting
("s" ; key
"Drill math" ; name
entry ; type
(file+headline "~/Dropbox/org/drill.org" "Stats/Math") ; target
"* Question :drill:stats:math:\n%^{Question}\n** Answer\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For capturing some physics concepts that I need to remember
("p" ; key
"Drill physics" ; name
entry ; type
(file+headline "~/Dropbox/org/drill.org" "Physics") ; target
"* Question :drill:physics:\n%^{Question}\n** Answer\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; For capturing details of a job application/details
("j" ; key
"Jobs" ; name
table-line ; type
(file+headline "~/Dropbox/org/notes.org" "Jobs") ; target
"| %u | %^{Company} | [[%^{job link}][%^{position}]] | %^{referrals?} | %^{Experience?} | %^t | %^{Status} | %^{Follow up} | %^{Result} |" ; template
:prepend t ; properties
;; :table-line-pos "II-3" ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; To capture movies that I plan to see
("f" ; key
"films" ; name
entry ; type
(file+headline "~/Dropbox/org/fun.org" "Movies") ; target
"* %^{Movie} %(org-set-tags) :film:\n:PROPERTIES:\n:Created: %U\n:END:\n%i
Netflix?: %^{netflix? Yes/No}\nGenre: %^{genre}\nDescription:\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; To capture ideas for my blog
("b" ; key
"Blog" ; name
entry ; type
(file+headline "~/Dropbox/org/blog.org" "Blog") ; target
"* %^{Title} %(org-set-tags) :blog:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; To capture tons of errands
("e" ; key
"Errands" ; name
entry ; type
(file+headline "~/Dropbox/org/errands.org" "Errands") ; target
"* TODO %^{Todo} %(org-set-tags) :errands:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t) ; properties
;; To capture things regarding my course
("c" ; key
"Courses" ; name
entry ; type
(file+headline "~/Dropbox/org/phd.org" "Courses") ; target
"* %^{Course} %(org-set-tags) :courses:\n:PROPERTIES:\n:Created: %U\n:END:\n%i\n%?" ; template
:prepend t ; properties
:empty-lines 1 ; properties
:created t ; properties
:kill-buffer t))) ; properties
;; %[file] 插入文件
;; %(sexp) 插入 sexp 的返回值,sexp 必须返回字符串
;; %<...> 插入时间戳信息
;; %t 插入日期
;; %T 插入日期与时间
;; %u, %U 同上,但时间戳用 [] 括起来
;; %i 调用 capture 命令时有选中的内容则插入选中的内容
;; %a 注记,通常是 org-store-link 创建的链接
;; %A 类似 %a,但提示输入链接的描述
;; %l 类似 %a,但仅插入文本链接
;; %c 当前 kill-ring 中的内容
;; %x 粘贴板的内容
;; %k 当前计时任务标题
;; %K 当前计时任务链接
;; %n 用户名,变量 user-full-name
;; %f capture 命令调用时当前 buffer 对应文件名
;; %F 类似 %f,但显示全路径
;; %:keyword Specific information for certain link types, see below.
;; %^g 提示输入 tag,target file 中的列表作为可选项
;; %^G 类似 %^g,但是有 agenda 中所有注册的文件中的 tag 作为可选项
;; %^t 类似 %t,但提示手动输入日期,类似还有 %^T, %^u, %^U You may define a prompt like %^{Birthday}t.
;; %^C 提示插入哪个 kill-ring 的内容
;; %^L 类似 %^C,但插入为链接
;; %^{prop}p Prompt the user for a value for property prop.
;; %^{prompt} prompt the user for a string and replace this sequence with it.
;; You may specify a default value and a completion table with
;; %^{prompt|default|completion2|completion3...}.
;; The arrow keys access a prompt-specific history.
;; %\n Insert the text entered at the nth %^{prompt}, where n is
;; a number, starting from 1.
;; %? After completing the template, position cursor here.
;; properties
;; :prepend 通常情况下,新捕获的内容会附加在target location的后面,而该属性会添加在target location的前面
;; :immediate-finish 该属性表示不需要显示capture buffer给用户输入更多的信息.直接返回就好. 若所有的信息都能够通过模板变量自动获得的情况下可以使用
;; :empty-lines 插入新捕获的内容时,前后空出多少个空行.
;; :clock-in 为新捕获的item开始计时
;; :clock-keep 若设置了clock-in,则在capture动作完成后,依然保持计时器的继续运行
;; :clock-resume
;; 若capture操作中断了对之前任务的计时,则在完成capture操作之后继续对之前任务进行计时.
;; 需要注意的是,:clock-keep的优先级高于:clock-resume,若两者都设置为t,则当前计时器会启动,而前一个计时器不会继续运行.
;; :unnarrowed 不要narrow target buffer,显示target buffer的所有内容. 默认情况下会narrow target buffer,让它只显示捕获新事物的那节点内容
;; :table-line-pos 设置capture的内容插入到table的位置. 它的格式类似于”II-3”,表示它是表格中第二部分(以——-分隔)的第三行
;; :kill-buffer 若target file是未打开的状态,则在capture完成之后,自动kill掉新打开的buffer
Emacs的配置
org capture的启用设定
在emacs的启动配置文件中,使用如下代码完成org capture的启用。
(setq org-default-notes-file (concat org-directory "~/notes.org"))
(define-key global-map "\C-cc" 'org-capture)
代码解释如下:
(setq org-default-notes-file (concat org-directory "~/notes.org"))
设定默认的片段存放文件名为Home目录中的“notes.org”文件。在Windows中“~/notes.org”也可以写做“d:/home/notes.org”
(define-key global-map "\C-cc" 'org-capture)
使用组合键“Ctrl-c c”激活org capture功能。当然,如果使用“Alt-x”组合键后输入 org-capture <enter> 也可以达到同样的目的。
配置模板
利用我们上面介绍的内容,我们可以开始定义我们要用到的模板信息:
(setq org-capture-templates
'(("l" "灵感" entry (file+headline "~/写作创意.org" "创意")
"* %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/journal.org")
"* %?\n输入于: %U\n %i\n %a")))
Capture的模板
在Capture的基本使用流程之中,我们提到了一个名词“模板”。什么是模板?
我们来试着定义一下,所谓的模板是:
一个记录事件的加速系统,通过简单的几个按键就可以定位到一个具体的记录类别
一个快速记录事件的框架,类似网站的表单,通些必要的字段即可完成事件记录。
一个归档位置的快速定义,不同类别的记录可以按设定记录在不同的文件里,方便查询。
一个有效的模板由以下几个部分组成:
快捷键 - keys
用于在列表中快速选择模板。支持单个字符。嗯,多个字符的快捷键有待进一步研究。
描述 - description
简单的描述模板的用途。这部分设定会出现在选择模板的过程中
类型 - type
模板的种类。目前支持的取值为:
entry
Org Mode的标题节点。使用中须指定Org文件的名称
item
一个简单列表中的项目。同样,这个类型的模板最终需要存储在org文件中。
checkitem
一个带有checkbox的项目。与item类型的模板相比,多了一个checkbox。
table-line
在指定位置表格添加一行新的记录。
plain
一段文字。如何输入的,就如何记录下来。
注:org文件:扩展名为org的文本文件。遵循org mode定义的各类文本文件编写规则。目前Emacs对org mode的支持最好(org mode就是在emacs中用elisp编写开发的)。
目标 - target
用于定义收集得到的文字片段在文件的存储方式。一般来说,目标文件为一个org文件。收集得到的相关内容也会记录到相应的标题之下。最常用的target是:
指定文件名和文件中唯一的标题
(file+headline "path/to/file" "node headline")
指定文件名和完整的标题路径(如果需要存放片段的标题不唯一)
(file+olp "path/to/file" "Level 1 heading" "Level 2" ...)
指定日期方式的标题路径,在今天的日期下添加片段
(file+datetree "path/to/file")
4.3 预定义tag
上面提到,除了可以输入标签外,还可以从预定义的标签中进行选择。预定义的方式有两种:
在当前文件头部定义
这种方式预定义的标签只能在当前文件中使用。使用#+TAGS元数据进行标记,如:
#+TAGS: { 桌面(d) 服务器(s) } 编辑器(e) 浏览器(f) 多媒体(m) 压缩(z)
每项之间必须用空格分隔,可以在括号中定义一个快捷键;花括号里的为标签组,只能选择一个
对标签定义进行修改后,要在标签定义的位置按 C-c C-c 刷新才能生效。
在配置文件中定义 上面的标签定义只能在当前文件生效,如果要在所有的.org 文件中生效,需要在 Emacs 配置文件 .emacs 中进行定义:
(setq org-tag-alist '(
(:startgroup . nil)
("桌面" . ?d) ("服务器" . ?s)
(:endgroup . nil)
("编辑器" . ?e)
("浏览器" . ?f)
("多媒体" . ?m)
))
默认情况下,org会动态维护一个Tag列表,即当前输入的标签若不在列表中,则自动加入列表以供下次补齐使用。
为了使这几种情况(默认列表、文件预设tags,全局预设tags)同时生效,需要在文件中增加一个空的TAGS定义:
#+TAGS: