在 org-mode
中,一个条目(entry)能够设置多个属性(Properties)。有的属性是 org-mode
内置的,有它们的非凡用处。有的属性是自定义的,用在一些插件或仅仅用于记录信息。CUSTOM_ID
属于前者,而 ID
属性后者。
CUSTOM_ID
CUSTOM_ID
用于跳转。org-mode
反对丰盛的内部链接格局,其中之一便是链接到指定 .org
文件的指定 CUSTOM_ID
的条目。
比方在一个 .org
文件中有 file:/Users/liutos/Dropbox/gtd/roles/writer.org::#d1bdc978-a8ce-4266-9ffa-b6041f818431
这么一段文本,那么当光标置于这个文本中时,按下快捷键C-c C-o
,Emacs 便会关上文件/Users/liutos/Dropbox/gtd/roles/writer.org
,并将光标对应的条目上。
ID
ID
用于分割两个条目。一个名叫 org-edna
的第三方插件可能实现两个条目间的依赖,其中一个因素便是条目标 ID
属性。
比方我有一个 解说 Ada 语言
的工作(以一个条目标模式存在),同时也有一个 学习 Ada 语言
的工作(另一个条目)。显然,必须先学习一番能力讲给别人听,所以第一个条目依赖于第二个条目,于是我先给 学习 Ada 语言
的条目设置一个 ID
属性,值为 905fc2f4-4e28-4966-84fa-84c9e6bae96c
,而后再为 解说 Ada 语言
的条目中设置一个 BLOCKER
属性,值为 ids(905fc2f4-4e28-4966-84fa-84c9e6bae96c)
。如此一来,当 解说 Ada 语言
的条目呈现在 *Org Agenda*
中时,Emacs 会将其置灰显示,代表它处于阻塞的状态,必须先解决它的依赖才行。
主动填充 CUSTOM_ID 和 ID
建设依赖和跳转都是很罕用的性能,因而我会给每一个条目都设置 CUSTOM_ID
和ID
属性。为了罢黜每次都手动设置的麻烦,我用 org-mode
的 capture-template 个性来实现主动填充。
capture-template 是 org-mode
的又一项利器,用于生成条目间共性的内容,比方行首的星号、关键字,以及写入到哪一个文件的哪一个层级中。org-mode
的官网便有一个例子
(setq org-capture-templates
'(("t""Todo" entry (file+headline "~/org/gtd.org" "Tasks")
"* TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/org/journal.org")
"* %?\nEntered on %U\n %i\n %a")))
在 capture-template 中除了能够用预置的占位符(比方上文的 %U
、%i
,以及%a
),还能够调用任意的 Elisp 函数——这正适宜填充ID
和CUSTOM_ID
这类不反复,并且有肯定的格局要求的属性。ID
属性的值能够用来自于第三方插件 uuidgen
的uuidgen-4
函数来生成
(setq org-capture-templates
'(("t""Todo" entry (file+headline "~/org/gtd.org" "Tasks")
"* TODO %? :PROPERTIES:\n :CUSTOM_ID: %(uuidgen-4)\n :ID: %(uuidgen-4)\n :END:")))
美中不足的是,CUSTOM_ID
和 ID
的值是不同的,因为 uuidgen-4
每次都会返回不同的字符串。有没有什么方法可能让它们一样的呢?答案是必定的。
一式两份
既然两次调用 uuidgen-4
的后果不同,那么就将第一次调用后的后果保存起来,而后重复使用即可。思路很简略,实现代码也很直白
(let (lt-org-capture--uuid)
(defun lt-org-capture-uuidgen ()
"生成一个 UUID 并填充到词法作用域的变量中。"
(setf lt-org-capture--uuid (uuidgen-4))
lt-org-capture--uuid)
(defun lt-org-capture-uuidclr ()
"返回生成好的 UUID 并清空它。"
lt-org-capture--uuid))
capture-template 也是瓜熟蒂落的
(setq org-capture-templates
'(("t""Todo" entry (file+headline "~/org/gtd.org" "Tasks")
"* TODO %? :PROPERTIES:\n :CUSTOM_ID: %(lt-org-capture-uuidgen)\n :ID: %(lt-org-capture-uuidclr)\n :END:")))
后记
在下面的函数定义中,我试图利用词法作用域个性,使得 lt-org-capture--uuid
只能被 lt-org-capture-uuidgen
和lt-org-capture-uuidclr
读写。遗憾的是,Elisp 并不反对词法作用域,lt-org-capture--uuid
实际上是一个全局变量——齐全能够用 C-h v
来扫视它。
全文完。
浏览原文