Org-mode

        http://www.gtdstudy.com/?p=2634

从Vim到Emacs

由于我现在不再用Vim,应xbeta的要求,给《Pkm工具:Vimwiki》一文增加回顾和总结部份,现单独放出来。本文同时更新于自已《个人知识管理:Vimwiki工具》。

缘起Vim

在08年的时候,我就听过这“神的编辑器”的大名了。当时,也曾下载过一次,但是尝试的结果很不如意,打开了之后竟然无法输入中文!心里面想“见鬼 了!这是什么玩意儿!”。但是,因为内心中希望有朝一日能够用上这个东西装逼,我还是没有把它从硬盘里面删去。之后过了很久,我都没有用过Vim,我用了 其它的软件来作为我日常编辑的工具。后来能够用上Vim,还是拜托自已那不折腾会死星人的臭脾气。

在09年的开始,我开始对如何用电脑来记笔记感兴趣。在看过大量文章之余,也尝试了大量的工具。从小巧的Treepad、CintaNote、 PinPKM到以同步而著名的Evernote,这些尝试都无疾而终,不是它们不好而是我想要的方式并不是这样。于是,开始把目光投向了Wiki这个形 式。

同样是尝试了很多Wiki工具,比如xbeta介绍过的WikidPad、ZIM、单机版的MoinMoin、DokuWiki等等,还是觉得太麻烦了。为什么要有该死的后台?为什么不能直接编辑呢?

怀着这样的想法,我的目光又一次投向了Vim,这次我从滇狐1那里知道了Vim上一个叫Viki的插件,可以当把Vim变成Wiki。我很兴奋,但是尝试了之后不得不放弃了Viki,因为把它装上了之后总是出现莫明其妙的错误,这些错误在Windows的环境下又无法解决。

难道Vim上就只有Viki这个插件才能让Vim成为Wiki吗?我又开始了新一轮的找寻。很幸运,我找到了Vimwiki。在艰难地啃了它的英文 说明书 之后。很容易就装上了。而有鉴于当时Vimwiki中文的资料的匮乏,我就写了一篇Vimwiki的中文文档,投稿给善用佳软。之后,我就很欣喜的看到在 善用佳软那强大的影响力之下,越来越多人2喜欢上Vimwiki,有的人还把Vimiwiki的帮助文档整个翻译成中文即3

而我在用Vimiwiki的时候,基本只用Vimwiki,偶尔会用到Calendar来记日记,Wiki的词条写了50个左右,最大的Wiki文档大概有30KB这样。但是并没有很好的坚持下去。于是,Vim用得越来越少了。

转到Emacs

在听说Vim的同时,我也听说过Emacs,但是Emacs在国内不如Vim流行,中文资料比Vim少,所以我一开始的选择是用Vim。但是在一次浏览网页的时候,看到了Emacs下Org-mode的演示视频4,非常的震憾,我没有想到文本编辑器还可以如此华丽!究竟有多华丽,大家看演示视频就知道。视

于是我在今年的6月份开始折腾Emacs。不过最初的目的是用Org-mode来管理自已的日程。折腾着折腾着,发现Org-mode的标记语言,可以很方便的组织文章的结构,于是开始用Emacs来记笔记5,写文章。

后来,我意外地发现原来Org-mode本身就具有Wiki功能,于是开始尝试用Emacs来构建我自已的Wiki。在这个过程中,我又受到 Zoom.Quite的启发,Wiki应该是每日记,在上面积累自已的想法和疑问,并一一解答,自然而然个人Wiki就可以坚持下来了。

如图所示:

http://farm5.static.flickr.com/4076/4865667606_db89b7a4a4.jpg

下面是我的一思考的总结:

  • 我为何对Vim、Emacs这类程序员用的工具感兴趣?
    • 程序员的工作其实就是编辑文本
    • 电脑已经成为编辑文本最主要的工具
    • 选择高效的文本工具,自然要考虑程序员用的工具
    • 最重要的是我本来就对Vim感兴趣
    • 专注于内容建设要比排版重要,而Word显然做不到
  • 为何用Vim、Emacs来塔建个人的Wiki?
    • 这是最经济、最绿色的选择。因为它们是免费的,同时安装的时候不需要依赖其他的东西,不会给系统增加进程
    • 不需要考虑版面的问题,可以专心于内容的编写
    • 直接编写内容,不用进入什么后台之类的,很方便
    • 输入即输出,所想即所得,这是最高境界
  • 个人的Wiki该如何编写?
    • 每天都记录,一直坚持
    • 在Wiki上记录自己想解决的问题,在解决问题时用Wiki记录过程
    • 不必预先分类,当你解决不同领域的问题时再分类

注:

1 滇狐的主页:http://edyfox.codecarver.org/html/index.html

2 来自Gracecode的推荐:http://www.gracecode.com/archives/3022/ 闲耘用Vimwiki塔建的Wiki:http://hotoo.github.com/vimwiki/index.html

3 闲耘翻译的Vimwiki文档:http://code.google.com/p/vim-script-cn/source/browse/trunk/doc/vimwiki.cnx

4 Org-mode演示视频:http://jaderholm.com/screencasts/org-mode/

5 这里有我用Org-mode做的笔记(不完全是):http://www.gtdstudy.com/?cat=297

This entry was posted in 知识管理 and tagged EmacsPKMvimvimwki. Bookmark thepermalink.    

    http://www.yifeiyang.net/emacs/org-mode-tutorial.html

Org-mode之旅

本来想翻译David O'Toole的David O'Toole Org tutorial,可是有已经翻译好的版本了,就把它转载过来。

TOP简介

Org-Mode是为Emacs编写的个人信息管理以及编写大纲的工具。本文档将使用逐步的用法 说明和丰富的截图,教给读者Org-Mode基本的应用,让读者对它有基本的认识。本文不是 官方手册的替代品,只涵盖了Org-Mode的特性的一个子集。

TOP下载Org-Mode

你能从Org-Mode的官方网页上下载到它。本教程推荐使用最新版本的Org-Mode

TOP安装

在你的.emacs文件中加入如下几行:

1
2
3
4
5
6
 (add-to-list 'load-path "PATH_TO_WHERE_YOU_UNPACKED_ORGMODE")
 (require 'org)
 (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
 (define-key global-map "\C-cl" 'org-store-link)
 (define-key global-map "\C-ca" 'org-agenda)
 (setq org-log-done t)

这样,就能加载Org-Mode并且定义了它的快捷键。我们将在本文档讲述org-store-link 和org-agenda两种模式。

另外,最好用一个独立的目录来放你的org文件。我推荐用~/org目录。

TOP基本应用

本章将通过描述使用Org-Mode创建本文档的过程,讲解基本的Org-Mode应用。

TOP新建一个文件

如果你已经照前面的建议配置好了你的Emacs初始化文件(.emacs),那么当你打开或者 创建一个.org后缀的文件时,Emacs就进入了Org-Mode。

我创建了一个文件名为"OrgTutorial.org"的新文件,Emacs的模式栏上出现了"Org", 表示我们进入了Org-Mode。

TOP简单任务列表

首先,我输入一个名为"Task"的标题。虽然不一定要这么做,但常常会让事情方便一点, 尤其是当你想把任务列表和你正编辑的文档的正文分开的时候。

第一级的标题以一个""号开头,第二级的标题用两个""号开头,以此类推。

在Org-Mode里,所有的TODO项目都是以标题形式存在。我现在输入一个TODO项目: "Start new org file for tutorial."

这有点无聊,因为我们已经创建了一个新文件。这样,让我们把光标移到这一行TODO项目上 并按Ctrl-c和Ctrl-t,把它标记为"DONE"。

这里是结果:

Org-Mode用了一个时间戳来记录一个TODO项目在什么时候结束。

让我们输入更多的TODO项目。光标移到下一行,按Meta-Shift-Enter,调出 org-insert-todo-heading,按多若干次,就能加 入若干个TODO项目了。

TOP使用“标题”功能建构一篇文档

通常,使用大纲是最好的组织你的观点的方法。下一步,我把本教程的不同主题放进大纲。 这样,整个空白页面就能分成一个个小块,让我能更容易地填入内容。

一颗""表示第一级标题,两颗""表示第二级标题,如果你需要更多的层次,就用更多的 ""号。

我完成本文档的大纲后,效果如下图:

如上图,我完成大纲后,把"Outline document"标成了"DONE"。

在各章节间填充 你能在任何标题的下面加入正文。

TOP到其他地方的链接

在“下载Org-Mode”一节中我需要提供一个Org-Mode官方网页的链接。我使用了一个 特殊的含有方括号的语法来表示这个链接:

 [[link][ description ]]

看我是怎样输入这个链接和它的描述,不输入最后的半边方括号:

然后我输入这半边方括号,该链接消失,只显示它的描述。

移动光标到该链接上,按Ctrl-c和Ctrl-o,调用org-open-at-point。

你也能链接到本地文件。试试看浏览另外一个文件,比如说你的emacs初始化文件 (.emacs),然后连续按Ctrl-c和l键调用org-store-link。你会看到一条信息, 说已经把你正在浏览的文件中的位置存为一个链接。

然后回到你的Org-Mode的buffer,用Ctrl-c和Ctrl-l来调出org-insert-link 来插入该链接。(你可以用方向键来翻查到你刚才记录的链接。)

TOP文档的提纲

这时,我的文档更长了,一个屏幕容纳不下它的全部内容。使用shift-tab这个组合键, Org-Mode能让你更容易了解你的文档的概要。

需要注意的是只会显示最高层的标题。再次按下shift-tab的组合键,所有的标题和 TODO项目就会显示出来:

然后,再按这个组合键,显示正常情况的,包含各个章节的整个文档:

TOP给任务加注说明

你能把你所需要的尽可能多的文字放在一个TODO项目的标题之后。甚至,你能把副标题 放在一个TODO项目的下面,把TODO项目嵌套起来。

对任务进行注释,让收集和处理和某个任务相关的链接和想法更容易。任务的层次化嵌套 对工作流程的模式化很有帮助——通常,一个大的任务会细分为更小的,可以逐项完成的 子任务供你察看。

TOP高级功能简述

在本篇简明教程结束前,我们将介绍Org-Mode的全局TODO列表、计划任务和日程表 (agenda)功能。这些功能用于从不同的org文件中把相关的TODO项目合并成以重要性 和发生的时间为顺序陈列的项目列表。你也能用这些功能来知道哪些任务是已经完成的, 以及它们是什么时候完成的。

TOP设置

首先,你必须设置变量org-agenda-files,以便让Org-Mode知道在哪些文件 里搜寻TODO和计划项目。

假设,你已经有了几个org文件,比如说,一个工作用的org文件,一个家务用的 org文件,一个学校用的org文件。

这样的话,你可以在你的emacs初始化文件(.emacs)里加入如下几行:

1
2
3
 (setq org-agenda-files (list "~/org/work.org"
                            "~/org/school.org"
                             "~/org/home.org"))

TOP全局TODO列表

按Ctrl-c、a、t进入全局TODO列表。Org-Mode将在org-agenda-files里的文件中 搜索开放的TODO项目,并列出项目的列表:

你能在不同的TODO项目中移动光标,并用t键把项目标注成“DONE”(已完成);或者 在TODO项目上按回车跳到该项目所在的 源文件。

TOP任务计划和使用日程表(agenda)

我计划今天来做“Finish documnet”(“完成文档”)。我把光标移到TODO项目“Finish documnet”(“完成文档”)上,按Ctrl-c和Ctrl-s来运行org-schedule命令。日历跳 了出来,我能输入或者点击我选择的日期:

当我选择好日期,Org-Mode在这个TODO项目后插入了一个时间戳:

现在把你的文档存盘,并依次键入Ctrl-c、a、a来进入org-agenda模式。本星期的计划中项目显示了出来:

现在按l键(L的小写字母)显示日志(log)。这样会显示所有已经完成的任务和它们完成的时间。

TOP再会

本文只是Org-Mode的简明教程。在Org-Mode的在线文档里有更多的让人兴奋的特征等着你 发掘。

=========================================================================================

http://emacser.com/org-mode-yupeng.htm

Emacs的Org Mode

2010年4月1日ahei发表评论阅读评论
 

作者: yupeng

1 介绍
2 基本用法
3 列表
4 注脚
5 表格
5.1 基本表格
5.2 spreadsheet
6 链接
7 todo list
8 导出成其他格式
9 请参考 org mode 的文档。
10 我自己的使用经验

1 介绍
~~~~~~~
Org mode 是 emacs 中的一个主模式。 Org 是 organization 的缩写。这个模式的主要作用是用来记笔记,写 todo list,org mode 有一个目标,就是希望每件事情都只记录一次。 Org mode 已经是 emacs 自带的组件,如果你想用最新的 org mode,可以在这里下载:[http://orgmode.org/]

2 基本用法
~~~~~~~~~~~
很简单,一级标题用一个星号(*)表示,二级标题用两个星号表示,三级标题用三个星号表示,以此类推,注意,星号必须顶格写。比如,新建一个文件,在 emacs 中打开,然后敲:M-x org-mode,进入 org mode。然后,在文件中写入下面的内容:
* top level
** the second level
*** the third level
somethings to write
注意,星号前不能有空格。
然后你就可以看到这些各个等级的标题和内容被合适的高亮了。你可以自由的控制这些标题和内容是被折叠还是显示出来,方法就是使用TAB。比如,把光标移动到最开始的地方,连续按TAB, org mode 会把 buffer 中的内容按照 全部折叠->展开所有标题->展开全部内容 这样的顺序循环显示。另外,还有一些快捷键可以帮助你方便的在 org mode 中间移动:
C-c C-n 移动到下一个标题
C-c C-p 移动到上一个标题
C-c C-f 移动到和当前标题同等级的下一个标题
C-c C-b 移动到和当前标题同等级的上一个标题
C-c C-u 向上移动到更高一层的标题

3 列表
~~~~~~~
在同一个子标题下,你还可以将内容划分的更细致。方法是使用这些符号: ‘-’, ‘+’, ‘*’, ‘1.’, ‘1)’。注意,这里的’*'不能顶格写。 比如,在你的 org mode 的 buffer 中写入下面这些文字(从 org mode 手册上抄来的例子):
My favorite scenes are (in this order)
1. The attack of the Rohirrim
2. Eowyn’s fight with the witch king
* this was already my favorite scene in the book
* I really like Miranda Otto.
3. Peter Jackson being shot by Legolas
– on DVD only
He makes a really funny face when it happens.
But in the end, no individual scenes matter but the film as a whole.
Important actors in this film are:
– Elijah Wood :: He plays Frodo
– Sean Austin :: He plays Sam, Frodo’s friend. I still remember
him very well from his role as Mikey Walsh in the Goonies.

把光标移动到 ‘1.’ ‘2.’ 或 ‘3.’ 所在的行上,然后按 shift 加左右方向键,看看有什么效果。

4 注脚
~~~~~~~
在 org mode 中,你可以为你的文章添加注脚(footnote)。注脚的格式有两种,一是方括号+数字,二是方括号+fn+名字。比如下面有两个例子:
在 org mode 的正文中写下这两句话:

The Org homepage[1] now looks a lot better than it used to.
The Org homepage[fn:orghome] now looks a lot better than it used to.

接下俩你可以写一些其他东西,然后在文章的末尾写上下面两句话(注意:必须要顶格写):

[1] The link is: http://orgmode.org
[fn:orghome] The link is: http://orgmode.org

把光标移动到正文的[1]处,按 C-c C-c,可以跳转到注脚[1]处,在注脚[1]处按 C-c C-c,可以跳转到正文的[1]处。对于[2]也一样。

5 表格
~~~~~~~

5.1 基本表格
=============
在 org mode 中,你可以画表格。方法很简单,在某一行顶格的位置输入’|',然后输入表格第一行第一列的内容,再输入’|',然后输入表格的的一行第二列的内容,以此类推。当第一行输入完成后,按 TAB, org mode 会把当前行对齐,然后为你创造出表格的下一行,让你继续输入。用 TAB 和 S+TAB可以在表格中正向或反向的移动。
比如下面的例子:

| 1 | one |
| 2 | two |
| 3 | This is a long chunk of text |
| 4 | four |

有时候,表格的某一项特别的长,你可以在任意一个表格的空白项内输入数字来限制其所在列的长度。比如:

| | <6> |
| 1 | one |
| 2 | two |
| 3 | This=> |
| 4 | four |

在上面的例子中,第二列的长度不会超过6,超过的部分会被隐藏起来。你可以把鼠标移动到’This=>’上面,会有浮动标签显示出该项的内容,或者输入’C-c `’可以编辑被隐藏的内容。如果你发现表格的某一项没有如你预期的那样被隐藏起来,你可以在表格中的任意位置按 ‘C-c C-c’。

我们还可以把表格弄的更好看一些。在表格的某两行之间加入’|-’,然后按TAB,可以作出下面的效果:

| | <6> |
|—+——–|
| 1 | one |
| 2 | two |
| 3 | This=> |
| 4 | four |

5.2 spreadsheet
================
你可以在表格中增加计算的功能。比如你有这样一个表格:第一列和第二列是三角形两个直角边的长度,第三列是通过勾股定理计算出的斜边长度,或者是这样一张表格:前几列是你各个科目的考试成绩,最后一列是你的平均分,那么,org mode 可以自动为你完成计算。我们以计算勾股定理为例,创建一张表格:

| a | b | |
|—+—+—|
| 3 | 4 | |
| 6 | 8 | |
| 1 | 2 | |

在第二行第三列中输入’=($1^2+$2^2)^0.5′。$1和$2表示第一列和第二列,在你自己的表格中,你会使用你希望的列数进行计算。

| a | b | |
|—+—+———–|
| 3 | 4 | 5. |
| 6 | 8 | 10. |
| 1 | 2 | 2.2360680 |
#+TBLFM: $3=($1^2+$2^2)^0.5

有时候,你输入完成后,org mode不会自动帮你对所有项都计算一边,这时,你可以输入’C-u C-c C-c’强制org mode为整个表格进行计算。如果你不想让某一列都按照公式计算,只希望在某一特定项上进行计算,你可以这样输入:’:=($1^2+$2^2)^0.5′, 即在等号前再加一个冒号。

6 链接
~~~~~~~
你可以在 org mode 中设置连接。比如链接到当前文档的某个位置,或者链接到一个外部文件。链接到当前文档的某个位置只需这样输入:
[[link][description]]
description 是你希望链接到的内容,org mode 会通过字符串搜索的方式找到第一个与 description 匹配的地方作为链接的目标。要链接到一个外部文件,只需这样输入:
[[file:/directory/filename]]
想要跳到链接处,可以使用快捷键’C-c C-o’,或者鼠标左键单击。对于到外部文件的链接,emacs 会试图将该文件打开。

7 todo list
~~~~~~~~~~~~
Org mode 的一个很重要的功能就是写 todo list。 创建一个todo list 和创建一个 org mode 的其他标题并没有什么区别。比如你可以顶格写下这样一
行:
* write org mode document
然后把光标移动到这行上,按shift+左右方向键,你会发现该条目会在 TODO和 DONE 之间切换:
* TODO write org mode document
* DONE write org mode document

这就是最简单的 todo list 了,想做什么,就在 org mode 下创建一个条目,并将其状态设置为 TODO,做完后将其状态设置为 DONE。

todo list 默认只有两种状态: TODO 和 DONE。我们可以再增加一些其他状态。比如在.emacs中加入下面的语句:

?View Code LISP
 
1
2
(setq org-todo-keywords
      '((sequence "TODO" "DOING" "HANGUP" "|" "DONE" "CANCEL")))

可以将 todo list 的状态增加为五种:TODO,DOING,HANGUP,DONE,CANCEL。
注意,在 HANGUP 和 DONE 之间有一条竖线 “|”,在竖线之前的状态和之后的状态使用的是不同的face。

进一步的,我们还可以记录切换到某一种状态时的时间:

?View Code LISP
 
1
2
(setq org-todo-keywords
      '((sequence "TODO(t)" "DOING(i!)" "HANGUP(h!)" "|" "DONE(d!)" "CANCEL(c!)")))

在 DOING HANGUP DONE 和 CANCEL 后的括号中都有一个’!',这种写法表示进入到这些状态后会记录下当前时间。而每个状态后面的括号中都有一个字母,这个字母就是进入该状态的快捷键。当你想切换到某一状态时,可以输入’C-c C-t’(此时 emacs 会弹出一个提示窗口),然后输入对应的快捷键就可以把当前的条目设置为该状态。

主意,改变 org-todo-keywrods 之后,最好把你的 org mode 的文件关闭,然后在重新打开,否则可能会发现设置无效。

8 导出成其他格式
~~~~~~~~~~~~~~~~~
已经编辑好的 org mode 文档可以导出为其他格式。
C-c C-e a 导出为文本文件。
C-c C-e h 导出为 HTML 文件。

9 请参考 org mode 的文档。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
实际上 org mode 提供的功能极其繁多。我在上面列出的只是我日常会用到的功能。 Org mode 还有很多我这篇文章中完全没有涉及的功能,而我涉及到的功能,也有许多细微的技巧没有提及。幸运的是, org mode 有一份极其详尽的文档。你可以在 emacs 中输入 ‘C-h i’,然后搜索 ‘org mode’,找到该文档。想充分发挥出 org mode 的威力,需要仔细阅读这份文档。

10 我自己的使用经验
~~~~~~~~~~~~~~~~~~~~
1. 记 todo list。
把我工作中要做的事情和自己想学的东西都列出来,并且使用前面提到的功能记录下每件事情的起始时间和结束时间,即 DOING 和DONE 的时间,以此推算出这件事情究竟花费多少时间。我是搞 IT 行业的,经常会遇到任务完不成,需要加班的情况。我希望通过记录下我完成每件事情的时间,来得到一份第一手资料,用来推断以后遇到的工作所花费的时间。这样,无论是boss 给我安排任务,还是我给别人安排任务,都可以做到心中有数。
2. 记笔记。
工作中,领导有要求记工作笔记,把工作中遇到的问题和解决办法记录下来。平常在网上查到的资料,也可以随手建立一个条目,粘贴上去。
3. 写文档。
我个人认为 org mode 不适合写很长,很复杂,逻辑性很强的文档,那是tex 的范畴。不过相对简单的文档,比如工作报告,用 org mode 写,再生成文本文档,效果还是不错的。

实际上,本文基本涵盖了我所用到的 org mode 的功能。我曾经通读过 org mode 的文档。开始我读的很兴奋,因为看到了很多让我眼花缭乱的功能。但后来我就感到困惑了,因为那么多功能,如果我都用上的话,反而会把事情变得很繁琐。最后,我选择了一些最基本最简单的功能,用来辅助我的日常工作(也就是我本文中介绍到的功能)。但我总是想,那些我没用到的功能,也许只是我没有好的思路来使用而已。所以,如果有谁有好的 org mode 的使用思路,请一定要不吝赐教。

最后,我习惯让扩展名为.org的文件打开后默认进入 org mode,只需在.emacs 中加入:(emacs 23已默认可以,不需要加)

?View Code LISP
 
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))


      

 

 

 

                http://emacser.com/org-mode.htm

Emacs org mode学习笔记

2010年10月18日lertsau发表评论阅读评论
 

1 参考文献

本文参考并引用了以下的文章的部分内容。

2 用Org Mode做笔记

 

2.1 想法与配置

以前一直都用Emacs Wiki Mode记笔记,但wiki mode总有些奇奇怪怪的bug,并且已经不更新了,最近org mode 非常火爆,禁不住想试一下。

对于记笔记,我的打算很简单,一个目录用来装所有的笔记,一个目录用来存放publish成HTML格式的笔记。并且能够自动生成索引文件。这样就可以在索引文件里直接查找并跳转到所有的笔记里。

Emacs ORG mode的基本配置如下:

?View Code LISP
 
1
2
3
4
5
6
7
8
9
10
11
12
13
(setq load-path (cons "~/lib/emacs-lisp/org-7.01h/lisp" load-path))
(setq load-path (cons "~/lib/emacs-lisp/org-7.01h/contrib/lisp" load-path))
 
(require 'org-install)
(require 'org-publish)
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(add-hook 'org-mode-hook 'turn-on-font-lock)
(add-hook 'org-mode-hook 
(lambda () (setq truncate-lines nil)))
 
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)

上面基本上是从ORG-mode的文档里抄来的,其中包含setq truncate-lines nil的两行代码是为了解决org-mode在编辑中文的时候不会自动折行的问题。

接下来的配置基本照抄了meteor1113@newsmth的用org代替muse记日记 , 修改的部分就是我不想让它自动生成index文件,我比较喜欢自己组织。

?View Code LISP
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(setq org-publish-project-alist
      '(("note-org"
         :base-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org"
         :publishing-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish"
         :base-extension "org"
         :recursive t
         :publishing-function org-publish-org-to-html
         :auto-index nil
         :index-filename "index.org"
         :index-title "index"
         :link-home "index.html"
         :section-numbers nil
         :style "<link rel=\"stylesheet\"
    href=\"./style/emacs.css\"
    type=\"text/css\"/>")
        ("note-static"
         :base-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org"
         :publishing-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish"
         :recursive t
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|swf\\|zip\\|gz\\|txt\\|el"
         :publishing-function org-publish-attachment)
        ("note" 
         :components ("note-org" "note-static")
         :author "caole82@gmail.com"
         )))

值得注意的一个地方是,我把org和publish的目录都扔在了我的Dropbox中,这样可以方便的在不同的系统中同步笔记。有些人喜欢用SVN/GIT/CVS等版本管理工具,也是个不错的办法。但我没有地方搭这些东西的服务器:-(
这样写完了笔记就可以用M-x org-publish 发布了,我把它绑定到了F8-p上。

?View Code LISP
 
(global-set-key (kbd "<f8> p") 'org-publish)

为了在org mode中使用auto-complete,我在auto-complete中增加了这样的配置:

?View Code LISP
 
1
2
3
4
5
(setq ac-modes
      (append ac-modes '(org-mode objc-mode jde-mode sql-mode
                                  change-log-mode text-mode
                                  makefile-gmake-mode makefile-bsdmake-mo
                                  autoconf-mode makefile-automake-mode)))

 

2.2 常用的编辑

  • 结构化编辑 
    • 标题 

      一级标题是一个*,两级标题是两个*,三级标题…… 最多可以建10级标题。注意,这里的*必须在行首。Publish之后会自动生成目录链接。在Emacs中S-Tab可以收起所有的目录树,在标题上按Tab可以展开/收起该标题下的所有内容。在标题上按Alt+左右方向键可以减少/增加该标题的级别。
    • 枚举和列表 

      在org mode中还支持枚举(unordered list),有序的列表(ordered list)和带描述的列表。

       

      枚举可以用’-',’+',或者非行首的’*’ 作为bullets.同时,可以用开头的空格来区分枚举的层次结构。

      • 枚举1
      • 枚举2
      • 枚举3
      • 枚举4

         

      有序的列表可以由’1.’或’1)’来组织。这里可以方便的使用Alt+左右方向键调整列表项的级别。M-Ret可以在当前位置插入一个列表项;C-Ret可以在文档尾部插入一个列表项或者标题。

      1. 第一级
      2. 第二级

         

        1. 第二级第一点
      3. 第三级

         

        带描述的列表效果是这样的:

        Elijah Wood
        He plays Frodo
        Sean Austin
        He plays Sam, Frodo’s friend. I still remember
        在文档中是这样的:

         

      - Elijah Wood :: He plays Frodo
      - Sean Austin :: He plays Sam, Frodo’s friend. I still remember
      

      5个或以上的“-”是一个水平分割符。


    • 脚注 

      org mode可以为文章添加脚注,脚注有如下两种方式:

       

      blabla[1]
      blablabla[fn:bla]
      

      效果是这样的:
      blabla1
      blablabla2

      接下来必须顶格写这些脚注的内容了,这样在文档的末尾会自动生成脚注。C-c C-c可以在脚注的标记与内容之间切换。C-c C-x f可以在当前位置添加一个脚注。

      [1] 12345
      [fn:bla] 67890
      
    • 结构化编辑的常用快捷方式 

      这里是Structure Editing的默认快捷方式:

       

       
      next/previous headingC-c C-n/p
      next/previous heading, same levelC-c C-f/b
      backward to higher level headingC-c C-u
      jump to another place in documentC-c C-j
      previous/next plain list itemS-UP/DOWN
      insert new heading/item at current level M-RET
      insert new heading after subtree C-RET
      insert new TODO entry/checkbox item M-S-RET
      insert TODO entry/ckbx after subtree C-S-RET
      turn (head)line into item, cycle item type C-c -
      turn item/line into headline C-c *
      promote/demote heading M-LEFT/RIGHT
      promote/demote current subtree M-S-LEFT/RIGHT
      move subtree/list item up/down M-S-UP/DOWN
      sort subtree/region/plain-list C-c ^
      clone a subtree C-c C-x c
      refile subtree C-c C-w
      kill/copy subtree C-c C-x C-w/M-w
      yank subtree C-c C-x C-y or C-y
      narrow buffer to subtree / widen C-x n s/w
  • 富文本编辑 
    • 表格 

      最基本的表格是这样的:

      | A | B |
      | C | D |
      

      效果是这样的:

       
      A B
      C D

      还可以:

      #+CAPTION: 表格的标题
      #+LABEL: tbl:table_label1
      | A | B |
      |---+---|
      | C | D |
      

      在这里,CAPTION指定的是表格的标题,LABEL后的tbl用来指定在文档内部引用该表格的标签。
      效果是:

      ABCD
      AB
      C D

      C-c RET可以在光标所在表格内插入一行

      这里是表格相关的常用快捷键:

       
      convert region to table C-c  
      re-align the table without moving the cursor C-c C-c
      re-align the table, move to next field TAB
      move to previous field S-TAB
      re-align the table, move to next row RET
      move to beginning/end of field M-a/e
      move the current column left M-LEFT/RIGHT
      kill the current column M-S-LEFT
      insert new column to left of cursor position M-S-RIGHT
      move the current row up/down M-UP/DOWN
      kill the current row or horizontal line M-S-UP
      insert new row above the current row M-S-DOWN
      insert hline below (C-u : above) current row C-c -
      insert hline and move to line below it C-c RET
      sort lines in region C-c ^
    • 引用文字或代码 
      我常用到的引用文字的标签是#+BEGIN_EXAMPLE / #+END_EXAMPLE ,在这之间的文字会保留原有的格式。
      
      对于代码而言,可以用#+BEGIN_SRC SRC_TYPE / #+END_SRC,其中SRC_TYPE用来指定代码的类型,
      如lisp, java, c, c++等。结合HTMLIZE可以让导出的HTML页面里的代码被按照语法着色。
      
      为了保留引文的格式,还可以使用#+BEGIN_VERSE / #+END_VERSE 和#+BEGIN_QUOTE/ #+END_QUOTE. 
      
      将引文居中排版可以使用#+BEGIN_CENTER / #+END_CENTER.
      
    • 引用图片 

      用如下方法可以直接在文档内显示图片:

       

      #+CAPTION: title for the image
      #+LABEL: fig:tag_for_img
            [[path/to/image.jpg]]
      

      CAPTION用来指定图片的标题,LABEL用来在文档内部引用这张图片。和表格一样,这两部分都不是必须的。

    • 插入链接或附件 

      给文档添加附件非常简单,C-c C-a 然后就着菜单选好了,其中C-c C-a a是添加文件系统中的文件作为附件。

      Org mode提供多种链接方式,包括链接到一个文件内部,链接到外部文件,电子邮件等等。

      • 链接的格式: 

        链接主要是两种格式:

        [[link][description]] 或者 [[link]]
        

        例如 SINA

      • 如何访问链接: 

        在一个链接上按C-c C-o即可访问,至于调用什么程序访问,取决于链接的内容,emacs和org mode的配置了。

         

      • 链接的类型 

        如下都是可以支持的常用link类型:

        http://www.sina.com         Web
        file:paper/lastdoc.pdf      本地文档,用相对路径表示
        file:/path/to/filename      本地文档,用绝对路径表示
        news:comp.emacs             新闻组
        caole82@gmail.com    邮件地址
        
      • 内部链接 Internal Link 

        内部链接就类似于HTML的锚点(实际上export成HTML文件后就变成了锚点),可以实现在一个文档内部的跳转。

        如下命令定义了一个名为target的跳转目标:

        #<<target>>
        

        如下方式可以设置到target的链接:

        [[target]] 或 [[target][description]]
        
      • 其他常用链接命令 

        C-c l 可以在光标所在处创建一个跳转目标点,在需要跳转至该目标的位置输入命令C-c C-l可以建立到目标的链接

        当输入C-c C-l命令,光标若处在已经存在的一个链接上的时候,可以编辑改链接。

        命令C-c %可以记录当前光标所在位置,当光标移到其他地方后,可以用C-c &跳转回来。这里的位置记录类似一个kill-ring,重复输入C-c %可以记录多个位置,重复输入C-c &可以连续跳转到之前记录的对应位置上。

3 用Org Mode管理个人事务

 

3.1 关于TODO ITEM的基本知识和操作

  • 设置TODO项目 

    所有标题只要以TODO开头,就会变成TODO 项目。例如:

     

    *** TODO 付手机费
    *** TODO 开会
    
  • 更改TODO项目的状态 
    C-c C-t Rotate the TODO state of the current item among
    ,-> (unmarked) -> TODO -> DONE --.
    '--------------------------------'
    

    C-c C-t是在定义的状态中循环,而C-u C-c C-t可以指定一个状态。

    S-Right 和 S-Left也可以在定义的状态中循环。

    C-c a t可以显示所有的TODO项目,能从所有agenda file里非DONE状态的TODO项目都显示出来

    S-M RET可以在当前项目下插入一个新的TODO 项目(与当前项目同一级别)

  • 更改TODO项目的优先级 

    以下方式可以设置TODO ITEM的优先级:

     

    *** TODO [#A] 付手机费
    

    C-c , 可以设置一个TODO项目的优先级
    S-Up/Down 可以增减一个TODO项目的优先级

  • 增加TODO Item的状态 

    默认情况下,TODO Item只有两种状态,TODO和DONE。我们可以在.emacs中配置Org,以设置更多的中间状态,例如:
    用下面的方法,我们可以增加一个TODO Item的中间状态,这些状态是顺序的,通常是工作流中的不同状态。

    ?View Code LISP
     
    1
    2
    
    (setq org-todo-keywords
          '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED")))

    另一种可能性是,每个TODO Item可能有不同的类型,例如,公司的TODO Item,家里的TODO Item。或者,我们可能把TODO Item分配给不同的人,因此我们可以自定义TODO keywords以表示一个TODO Item的不同类型。

    ?View Code LISP
     
    (setq org-todo-keywords '((type "Fred" "Sara" "Lucy" "|" "DONE")))

    有的时候我们可能对不同的TODO Item有不同的状态,例如,交手机费这类简单的事情只有TODO和DONE两种状态,但是对于解决一个程序的bug可能有REPORT, BUG, KNOWNCAUSE, FIXED等状态。这样我们需要定义不同的状态子集(subset):

    ?View Code LISP
     
    1
    2
    3
    4
    
    (setq org-todo-keywords
          '((sequence "TODO" "|" "DONE")
            (sequence "REPORT" "BUG" "KNOWNCAUSE" "|" "FIXED")
            (sequence "|" "CANCELED")))

    C-S-Right/Left可以从一个子集跳转到另一个子集,而S-RIGHT/LEFT会在所有状态之间遍历。

    我们还可以用快捷键来迅速切换一个TODO Item的状态。

    ?View Code LISP
     
    1
    2
    3
    4
    
    (setq org-todo-keywords
          '((sequence "TODO(t)" "|" "DONE(d)")
            (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
            (sequence "|" "CANCELED(c)")))

    上面说的都是全局的设置,我们也可以针对一个文件进行设置,如:

    #+TODO: TODO FEEDBACK VERIFY | DONE CANCELED
         (这里也可以用 #+SEQ_TODO,和#+TODO效果是一样的)
         对于类型的设置:
    #+TYP_TODO: Fred Sara Lucy Mike | DONE
         对于多个子集的设置:
    #+TODO: TODO | DONE
    #+TODO: REPORT BUG KNOWNCAUSE | FIXED
    #+TODO: | CANCELED
    
  • 进度记录 

    最基本的就是记录当一个Item被标记为DONE时的时间戳了,另外,在一个Item完成后,可能会想要写点心得或者备注什么的,可以用如下配置实现:

    ?View Code LISP
     
    1
    2
    
    (setq org-log-done 'time)
    (setq org-log-done 'note)

    Org Mode还能记录每个状态改变的时间,但恐怕不是所有人都需要这么精细的控制了。

  • 把项目拆分成子项目 

    很简单,高一级的TODO下所有的低级TODO就是它的子项目,在各级TODO的标题的任意位置插入[/] 或者[%]即会根据其子项目的完成情况自动更新进度。

    如果想要当所有子项目都标记为Done的时候,父项目也被标记为Done,可以在配置中添加如下设置:

    ?View Code LISP
     
    1
    2
    3
    4
    
    (defun org-summary-todo (n-done n-not-done)
      "Swith entry to DONE when all subentries are done, to TODO otherwise."
      (let (org-log-done org-log-states)   ; turn off logging.
        (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

    另一种办法是,如果有大量的字项目,则可以使用check box来标记。

    每一个item前只要加上一个[ ] 就变成了check box item, 这在TODO List Item里也是一样的。在TODO List里,C-c C-c可以切换check box item的选中与未选中的状态。

    ** TODO Test [1/3]
    - [X] Only a test
    - [ ] It's another test
    - [ ] Third test
    

    和Check Box Item相关的快捷键:
    C-c C-c 切换Check Box的状态
    M-S-Ret 插入新的check box item.

3.2 标签

  • 标签的基本知识 

    其实标签并不仅限于TODO Item,而是可以用在任何标题上。标签可以由所有字母,数字,@构成,标签必须有一个前导的:并且还必须有一个后继的:,比如,看起来是这样的,‘:work:’,多个标签可以用:分开,例如:‘:work:urgent:’。

     

    需要用到的标签可以预先在配置文件里定义,和增加TODO Item的状态的方法一样,唯一的区别是这里用到的变量是org-tag-faces.

    Tag是有继承性的,也就是说,假如一级标题的tag有work,则该级标题以下的所有子标题无论是否显式注明,都自动具有work的标签。例如:

    * Meeting with sb.               :work:
    ** Summary with sb1.              :boss:notes:
    *** TODO Prepare slides for him  :action:
    

    这里,Summary with sb1的标签就是work, boss, notes,最后一项的标签就是work, boss, notes, action.

  • 设置标签 

    首先当然可以手动在标题后设置标签,键入:后,M-Tab自动提供标签的补齐。

    也可以用命令插入标签:

    C-c C-q 为当前标题插入标签
    C-c C-c 当光标在某标题栏时,为该标题插入标签(此时和C-c C-q功能一样)

    默认情况下,org会动态维护一个Tag列表,即当前输入的标签若不在列表中,则自动加入列表以供下次补齐使用。

    另一种方式是在配置文件中配置变量org-tag-alist全局性地预设一些tag,然后在org文件中设置:

    #+TAGS: @work @home @tennisclub
    #+TAGS: laptop car pc sailboat
    

    这样,在该文件中只能使用个以上定义的7个标签。

    如果想既使用预设的标签,又动态增加,则必须在文件中增加一个空的TAGS option.

    #+TAGS:
    

    在org中我们还可以给tag定义快捷键。对于全局的定义可以写在配置文件中:

    ?View Code LISP
     
    1
    
    (setq org-tag-alist '(("@work" . ?w) ("@home" . ?h) ("laptop" . ?l)))

    这样要标记@work,@home,laptop就只需要按w, h, l键即可。如果不是全局的定义,即指针对一个文件有效,我们可以在文件中定义,其中,\n表示换行,等效于分开写在两个TAGS里。

    #+TAGS: @work(w) @home(h) @tennisclub(t) \n laptop(l) pc(p)
    

    假如我们要让@work, @home, @tennisclub变成互斥的,则可以定义:

    #+TAGS: { @work(w) @home(h) @tennisclub(t) } laptop(l) pc(p)
    

    这也可以在配置文件中定义,但需要用dummy tag :startgroup和:endgroup包围起来。

    ?View Code LISP
     
    1
    2
    3
    4
    5
    
    (setq org-tag-alist '((:startgroup . nil)
                          ("@work" . ?w) ("@home" . ?h)
                          ("@tennisclub" . ?t)
                          (:endgroup . nil)
                          ("laptop" . ?l) ("pc" . ?p)))

    C-c \ 可以用来查找某个tag下的所有项目
    C-c / m 建立符合某tag的sparse tree
    C-c a m 从所有agenda file里建立符合某tag的全局性列表
    C-c a M 同上,但只检查TODO item或org-tags-match-list-sublevels里指定要检查的项目。

3.3 时间和日期

在TODO Item上我们通常还需要标记时间和日期,这里就包含了:

  • 普通的时间和日期,比如该TODO ITEM的开始时间,例如下午三点开会等。

     

    <2010-09-18 Sat 15:00>
    
  • 每天,每周,每月,每年都重复的时间和日期,比如每周去一次健身房之类的。

     

    * pick up Sam at school <2007-05-16 Wed 12:30 +1w>
    
  • 表示一段时间

     

    * 在上海开会 <2004-08-23 Mon>--<2004-08-26 Thu>
    
  • 仅仅表示一段时间而已,不需要在其他模式中引用。(Inactive Timestamp)

     

    * 今天吃饭吃到苍蝇了 [2010-09-28 Tue]
    

C-c > 打开Emacs Calendar
C-c < 把Emacs Calendar光标所在的日期插入到org mode光标所在处。
C-c C-y 当光标放在time range上时,计算两个timestamp之间的天数。
C-c ! 用来添加一个inactive 的timestamp.

在我的配置文件中,我把C-c t 定义给了“插入一个timestamp”。

对于TODO item,我们常常需要指定什么时候开始这项工作,什么时候是截止日期,在org中分别是SCHEDULED 和DEADLINE.

*** TODO write article about the Earth for the Guide
The editor in charge is [[bbdb:Ford Prefect]]
DEADLINE: <2004-02-29 Sun>

*** TODO Call Trillian for a date on New Years Eve.
SCHEDULED: <2004-12-25 Sat>

C-c C-d 插入一个Deadline
C-c C-s 插入一个Schedule
C-c / d 建立一个包含所有deadline的TODO项目的sparse tree
C-c / b 建立一个包含deadline在指定日期前的TODO项目的sparse tree
C-c / a 建立一个包含deadline在指定日期后的TODO项目的sparse tree

3.4 我的TODO LIST解决方案

我的TODO List方案基本上是在常规的待办事项上加上一些的GTD思想。

作为一个IT民工,我的生活比较简单,我不在家就在公司,两者都不在就基本在路上。因此我的TODO 项目的地点基本就是这三项。另外,有些项目需要用到电脑,有些不需要,有些都可以(比如看某本既有电子版又有纸版的书)。

下面列出了我用到的标签,TODO Item的中间状态很简单,就是TODO:未开始;INPROGRESS:进行中;和DONE:已完成。根据GTD的思想,有些TODO Item是2分钟内即可完成的,我把它们标记为immediately,立刻完成。wait是需要等待其他人或其他资源的;action是随时可以开始做的项目。

#+TODO: TODO INPROGRESS | DONE
#+TAGS: @office(o) @home(h) @traffic(t)
#+TAGS: computer(c) nocomputer(n) either(e)
#+TAGS: immediately(i) wait(w) action(a)

根据简化的GTD思想,TODO的项目分为Idea List; Task List; Project List; Someday/Maybe List; Reminder这五项。Reminder这一项和前四个关系不大,我用来记录一些备忘录,诸如下周末前要还房贷,某月某日是结婚纪念日之类的。这类提醒很多人喜欢记在Agenda里头,或者日历里。我更愿意直接写成条目放在Reminder里,每天看一下,这主要是因为我需要记住的事情不算太多,不需要用到Agenda。

每天抽两个时间做一下所谓的Mind Sweep,把所有想到可能要做的事情都扔进Idea List里头。每天抽一个时间整理一下Idea List,把不可能实现的直接删掉,把将来可能会做的,但现在肯定不做的扔到Someday/Maybe List中。Task List用于放一步即可完成的项目,Project List用于放比较复杂的项目,可能需要细分为许多个TODO Item,或者可能需要合作才能完成。

* Idea List:
* Task List:
* Project List:
* Someday/Maybe List:
* Reminder:

这样,举个例子,每天到公司或者到家开始工作的时候,首先要做的是三步:

  • 按照GTD的说法是清空大脑,把脑子里的所有想法都列出来,然后放到Idea List。
  • 用C-c \ 查询标签为@office或者@home 的未完成项目
  • 浏览一下Reminder 里有没有和今天相关的事情。

     

然后,在每天结束工作的时候清理一下 Idea List。

ORG Mode我主要的用处就是拿来记笔记和做Todo List,似乎它还有很多其他功能,等我需要的时候再去研究吧。

 

 

      http://helloxxxxxx.blog.163.com/blog/static/216015095201352772820142/

        

Emacs月月积累(终结篇):熟练使用org-mode管理日常事务  

2013-06-27 19:29:22|  分类: Emacs tips |  标签:org-mode  日程管理  待办任务  |字号 订阅

 
 
本以为把这个“月月积累”系列坚持下去会花相当长的时间,也会相当困难,没想到这么快就终结了。主要是因为学会了用org-mode管理日常事务:既然Emacs成为了日常工具,当然也就没必要再每月做一点。还有就是:如果精通了org-mode,有空再了解些Emacs-lisp编程方法,基本上就踏上了Emacer不归之路,掌握Emacs其他方面的应用只是顺手拈来,遇到问题也只是兵来将挡水来土掩。

下面是我学习Org的记录,为便于理解,添了不少废话。Emacs用的是Windows版,所以都按Windows说键盘习惯和Emacs配置文件(init.el,在HOME目录的.emacs.d子目录下;据说其他系统是.emacs)。

1 引子

看了不少Emacs和org-mode的学习笔记或教程,这些文章一般是先大赞org-mode一通,然后列出一堆lisp设置和快捷键。Emacs本来就被捧到天上去了,这下倒好,org-mode坐上了玉皇大帝的宝座,凡人靠近不得。所以我一直没学会使用org-mode,太神了,不敢碰。不过最近稍闲,不小心看了一些org-mode的文档,再稍仔细一看:什么神啊仙啊,浮云,都浮云。

Org只不过是一个工具,它的主要应用是:

  • 做笔记
  • 管理日程
  • 作为文本标记语言

和其他所有工具一样,到底要不要使用,用哪个功能,这完全取决于个人的需求。别人吹得神乎其神的东西,对你来说它可能是多余的或者干脆就是垃圾。比如说,如果建议MS Office专家去用Org做笔记,他会觉得你很无聊;习惯用手机管理日程的人会觉得Org的日程管理纯属多余;HTML/XML高级用户可能会觉得Org作为一种标记语言使用实在太小儿科。

我很少做笔记,用文本标记语言的机会也很少,所以主要关心org的日程管理功能。学后有两个感想,一是Org功能虽强并不是神,二是学用Org其实也简单。学习方法是: 先看懂别人写的文本,然后模仿着写出类似的东西,有空再学一些快捷键改几个Emacs参数。

Emacs键盘命令的约定表示方法:

  • C 代表 Ctrl 键
  • M 代表 Alt 键
  • S 代表 Shift 键
  • 以上三个按键单独按下没有意义,用 - 号表示它们搭配使用的按键
  • 用空格连接的一系列符号表示顺序按下符号所代表的按键
  • 其他符号: LEFT/RIGHT/UP/DOWN 分别代表的左右上下方向键, TAB 即 Tab 键, RET 代表 Enter 键
  • 例如:
    C-x 表示同时按下Ctrl和x字符键
    C-S-TAB 表示同时按下Ctrl, Shift和Tab键
    M-x org-mode 表示先同时按下Alt和x字符键,再键盘输入org-mode字符串
    C-x C-s 表示先同时按Ctrl和x字符键,然后同时按下Ctrl和s字符键
    C-c C-e hh 表示先同时按Ctrl和c字符键,然后同时按下Ctrl和e字符键,最后键盘输入hh
    

2 看懂Org文档

返回目录

婴儿学说话都是从模仿开始的,这个方法对所有学习应该都有效。学习org-mode不妨先看看别人写的东西。org-mode撰写的文档可以用任意文本编辑软件打开,最简单的org文档看起来是这样的:

* Introduction
** Summary
Org is a mode for keeping notes, maintaining TODO lists, and doing project planning with
a fast and effective plain-text system. 
....
** Installation
Org is part of recent distributions of GNU Emacs, so you normally don’t need to install it.
If, for one reason or another
** ...
* Document structure
Org is based on Outline mode and provides flexible commands to edit the structure of the
document.
** Outlines
...

这些文本只有两种元素:标题和普通段落。 以 * 符号开始的行表示该行为标题。

复杂一些的org文档可能看起来是下面这样的:

# -*- org -*-
#+TITLE: org-mode 备忘录
#+AUTHOR: ZGUANG@LZU
#+STARTUP: content
#+STARTUP: indent
#+TODO: TODO STARTED | DONE

<<目录位置>>
* 列表
  + 选项1
  + 选项2

* 表格
#+TBLNAME: 简单表格
| Name  | Value  | SD   |
|-------+--------+------|
| T1    | 1.2    | 0.14 |
|-------+--------+------|
| T2    | 2.3    | 0.11 |

* STARTED [80%] 超链接
** 网址链接
[[http://www.gnu.org/software/emacs/][Download and install Emacs]] 
** 文件链接
[[file:c:/windows/desktop.ini][桌面配置文件]]
** 内部链接
[[目录位置][返回目录]]
** TODO 其他链接

* 代码块              :@待续:
#+BEGIN_SRC Emacs-lisp
 (setq-default tab-width 4)  ;设置TAB宽度为4字符
#+END_SRC

* TODO COMMENT 其他内容
被注释的标题所包含的所有内容在文件导出时不会被显示

这些是普通文本,内容比飞机场还平坦,英文称为plain-text,比中文名称直观。但是这么平坦的内容如果粘贴和保存为文本文件,用Emacs打开,情况就不一样了:不仅有颜色,还有超链接。再用 C-c C-e hh 命令转成HTML文档然后打开,那就更不一样了( 自己试试 )。

上面的文本包含了些什么?虽然没有囊括org-mode的全部物件,但至少展示了几个方面的东西:

  • 以 # 号后加一空格开始的行表示注释,文件导出时这些内容不被导出,上面第一行就是。
  • 以 #+ 符号开始的行用于设置文档参数或内容属性,比如文档的标题、作者,org-mode打开时文档的呈现状态等。
  • 用 [[]] 括起来的内容表示外部链接
  • 用 <<>> 括起来的内容表示文档的内部链接
  • 以 * 符号开始的行,表示该行为标题。
  • 标题内容前的 TODO 标记是待办任务的标记符号。
  • 标题行后面两个 : 符号间的内容表示标签( TAG )。
  • 标题行如果标题文本前有 COMMENT 标记表示该标题下的所有内容为注释。
  • 位于 #+BEGIN_XXX 和 #+END_XXX 之间的内容为特殊文档块,如代码块、例子、引用等。

虽然东西不少,但对某人来说不是所有的都要用到,所以建议用到了再去了解。

3 进入Org模式

返回目录

安装Emacs的步骤就不说了,到这地步相信都有了一定的基础。直入正题吧:

  • 打开后缀名为org的文件自动进入org-mode模式
  • 在init.el配置文件中设置某类文件的编辑模式为org,如txt类文件:
(add-to-list 'auto-mode-alist '("\\.txt\\'" . org-mode))
  • 用Emacs打开文件后使用主模式选择命令( M-x org-mode )
  • 任意文件名,如果文件的第一个非空行包含: -*-org-*- ,用Emacs打开该文件后会自动使用org-mode模式。

后面这种方式对于使用Emacs编辑程序文件尤其方便,无需改变文件的后缀名。

4 标题和基于标题的编辑

标题是Org组织文档的基础,它在Org中的作用怎么强调都不过分。要用好Org-mode首先要学会标题的定制和使用,必须的,其他杂七杂八的东西都可以暂缓,有些内容甚至可以当它们不存在。

4.1 设定标题

返回目录

对于传统意义的标题,Org的设定非常简单:在行首加星号,星号与标题文字之间至少有一个空格,星号的数量表示标题的级别,方法简单明了。你不用为字体、行间距、缩进等设置而烦恼,专心做自己的事情。事实上标题是Org文档句法中唯一不需要通过上下文关系就能确定的内容:一行文本是不是标题只需要看行首字符。例如:

* 一级标题
** 二级标题
*** 三级标题
正文内容
* 其他一级标题

然而,为使标题适应更广泛的应用(不仅仅是表明文档的结构层次),Org对其进行了较复杂的定义。它的完整语法为:

STARS KEYWORD PRIORITY TITLE TAGS

其中:

  • STARS 即星号,这是一个标题唯一必要的内容,其他(包括标题名称)都可以省略。
  • KEYRORD 为TODO关键词,大小写敏感。
  • PRIORITY 为优先级选项,为#号加一个字符并用方括号括起来,如 [#A]
  • TITLE 即为实际的标题文本
  • TAGS 为标签。

下面是一个完整标题的例子:

** TODO [#2] 优先级为2的待办事项       :@家庭作业:

虽然TODO关键词、优先级标签属于标题的成分,但由于设定较复杂而且功能重要,有关内容将在后面介绍。

4.2 基于标题的文档编辑

返回目录

Org基于标题的文档编辑方式允许用户在非常简洁的显示模式下对某个或多个标题下的所有内容进行复制、粘贴、移动等操作,相当方便,真正实现了标题在文档管理中的组织者作用。

4.2.1 术语约定

  • 标题:仅指标题定义行
  • 子标题:大标题下属的小标题
  • 标题树:包括标题、子标题及其下属的所有文本
  • 大纲:或文档轮廓,即全部标题,是一种显示模式
  • 大纲折叠:隐藏子标题树
  • 大纲展开:分级显示子标题树

4.2.2 在标题间移动光标

快捷键动作
C-c C-p/n 移动到上/下一个标题
C-c C-b/f 移动到同级别的上/下一个标题

4.2.3 大纲的折叠与展开

  • 手动操作:
快捷键动作
TAB 局部命令,循环使用可以折叠/展开光标所在位置的标题树
S+TAB 全局命令,循环使用可以折叠/展开整个文档的标题树
  • 设定文档属性:
    • #+STARTUP: overview
    • #+STARTUP: content
    • #+STARTUP: showall
    • #+STARTUP: showeverything

4.2.4 标题编辑

 

快捷键动作
M-LEFT/RIGHT 升级/降级当前标题,不允许有子标题的存在
M-S-LEFT/RIGHT 升级/降级标题树,即标题树内的各级标题相应升/降级
M-UP/DOWN 在同级标题间上/下移标题树,不能跨级别移动
M-RET 在当前标题后插入同级标题符号(即换行符和星号)
C-RET 在当前标题树后插入同级标题符号
M-S-RET 在当前标题后插入同级TODO标题
C-S-RET 在当前标题树后插入同级TODO标题

4.2.5 使用Tips

Org-mode很多编辑命令的使用与光标所处的位置有关,同一个键盘命令如果光标位于不同文本环境可能会有不同的作用,这些命令称为局部命令。例如 M-RET 命令,如果光标位于某个标题行内,它的作用就是“在当前标题后插入同级标题符号”,但如果光标位于普通文本行内,它的作用就是把当前文本行设为标题(标题级别和前一个标题一致)。

5 用Org管理待办任务

Org扩展了标题的定义,增加了关键词、优先级和标签等元素。这些元素不仅使标题在文档组织发挥更重要的作用,标题的功能也得到了扩展。Org对日程的管理就是基于标题进行的:只要会设定标题就可以用Org管理日程。虽然道理是这样,但要熟练使用Org的日程管理功能还掌握比较多的东西。

5.1 定制任务和状态

5.1.1 设置TODO关键词

返回目录

TODO关键词是用来表示任务状态或类型的词。Org默认的TODO关键词只有两个:TODO和DONE,但很容易自定义其他的关键词。TODO关键词分为两种。一种是状态关键词,比如“等待”、“开始”和“完成”等,事件处理的过程中其处理状态按关键词顺序从前往后转换。另一种是类型关键词,按事件的轻重缓急分为“紧急”、“优先”、“普通”和“完成”等类型,但事件只有未完成和完成两种状态,所以处理结束后将直接转到“完成”类型,而“紧急”、“优先”和“普通”这些类型之间不能相互转换。

5.1.1.1 在Org文件中定义TODO关键词

在Org文件中定义的TODO关键词仅适用于当前文件。状态关键词使用 #+SEQ_TODO: 定义,类型关键词使用#+TYP_TODO: 定义。可以定义多系列的TODO关键词,可以使用中文关键词。

#+TYP_TODO: 工作(w!) 学习(s!) 休闲(l!) |
#+SEQ_TODO: PENDING(p!) TODO(t!) | DONE(d!) ABORT(a@/!)
  • “|”用来分隔“未完成”和“完成”两种状态的关键词,前面为未完成项,后面为完成项。如果没有“|”符号,最后一个关键词将被设为完成项,其余为未完成项。
  • 关键词后括号内的字母为快捷选择键,当使用 C-c C-t 设置或改变当前标题的TODO状态或类型时将出现选项菜单,此时可以用快捷键进行选择。
  • 括号内的“!”表示时间戳,设置或改变到该状态时(直接输入关键词不算)将同时插入当前时间
  • 括号内的“@”表示切换到该状态时需要输入文字说明,比如任务取消、流产或失败的原因。
  • 输入后将光标置于该行内使用 C-c C-c 命令可使该定义立刻生效。
5.1.1.2 在Emacs配置文件中定义TODO关键词

如果经常使用Org进行日程管理,应该在Emacs配置文件中定义常用的TODO关键词,这些定义对所有文件都适用。方法是设置 org-todo-keywords ,如:

(setq org-todo-keywords
  '((type "工作(w!)" "学习(s!)" "休闲(l!)" "|")
    (sequence "PENDING(p!)" "TODO(t!)"  "|" "DONE(d!)" "ABORT(a@/!)")
))
5.1.1.3 改变TODO关键词的外观

仅通过文字对于事件进行分类总嫌苍白无力,能用不同颜色的标签对日程表的事件进行强化分类就会好得多。这一功能可以通过设置TODO关键词的外观变量 org-todo-keyword-faces 实现。如:

(setq org-todo-keyword-faces
  '(("工作" .      (:background "red" :foreground "white" :weight bold))
    ("学习" .      (:background "white" :foreground "red" :weight bold))
    ("休闲" .      (:foreground "MediumBlue" :weight bold)) 
    ("PENDING" .   (:background "LightGreen" :foreground "gray" :weight bold))
    ("TODO" .      (:background "DarkOrange" :foreground "black" :weight bold))
    ("DONE" .      (:background "azure" :foreground "Darkgreen" :weight bold)) 
    ("ABORT" .     (:background "gray" :foreground "black"))
))

5.1.2 标题型任务和子任务

返回目录

Org主要通过标题的 TODO 关键词对待办任务(下面称为任务)进行管理,由于标题是分级的,所以这种管理方式很自然地支持子任务:子标题即子任务。Org的任务定义跟标题定义一样简单,有三种方式:

  • 直接在标题中的 KEYWORD 位置输入 TODO 关键词
  • 使用 C-c C-t 快捷键呼出关键词选择菜单
  • 使用 S-LEFT/RIGHT 快捷键快速设置 TODO 关键词

当然也可以在标题编辑时直接使用 M-S-RET 或 C-S-RET 插入 TODO 标题。

5.1.3 非标题型子任务

Org的任务主要由标题定制,但也提供了非标题型子任务的设置。对于以“[ ]”开头的列表, Org把它们当作复选框,复选框各选项的选择状态表示完成状态。例如:

  • 研究内容 [2/4]
    • [X] 研究内容1
    • [-] 研究内容2 [1/2]
      • [ ] 小内容1
      • [X] 小内容2

复选框有三种状态:未完成、完成和中间状态(如上),可以使用快捷键 C-c C-c 或 C-c C-x C-b 修改。

Org自动将复选框列表的完成状态纳入上一级任务的监控,具体使用说明参看任务进度监控

5.2 任务优先级

返回目录

你可以设置足够的TODO关键词和外观用来区分待办任务的类型、状态和优先级,但是这不仅使任务设置复杂化,还会导致任务间的关系十分混乱。Org为任务优先级留有专门的位置,即标题的 PRIORITY 位置。 Org预定义了任务的三个优先级即 [#A], [#B] 和[#C] ,用于区分类型任务的优先级别。如果不设置任务优先级,默认为B级。

不同优先级的任务在产生日程表时按优先级别先后排列,而其他时候则没有任何差别。为了充分发挥任务优先级的作用,最好在Emacs配置文件中对优先级的范围和外观进行自定义,例如:

;; 优先级范围和默认任务的优先级
(setq org-highest-priority ?A)
(setq org-lowest-priority  ?E)
(setq org-default-priority ?E)
;; 优先级醒目外观
(setq org-priority-faces
  '((?A . (:background "red" :foreground "white" :weight bold))
    (?B . (:background "DarkOrange" :foreground "white" :weight bold))
    (?C . (:background "yellow" :foreground "DarkGreen" :weight bold))
    (?D . (:background "DodgerBlue" :foreground "black" :weight bold))
    (?E . (:background "SkyBlue" :foreground "black" :weight bold))
))

设置TODO关键词和优先级后标题的外观如下: 

Emacs月月积累(终结篇):熟练使用org-mode管理日常事务 - xxx - xxx的博客 

在标题上使用 S-UP/DOWN 可以选择和改变任务的优先级。

5.3 任务标签

对于Org老手来说,用TODO关键词和优先级区分任务就足够了。如果不能满足需要,还可以使用标签。在Org中,标签定义于标题行末端,位于两个或两个以上冒号之间,它为待办任务提供了进一步的分类方法。

5.3.1 标签命名规则

返回目录

  • 位置:标签只能在各级标题的行末端定义,即只有标题文字可以拥有标签
  • 命名:标签的名字可以是包含字母、数字、下划线 _ 或@符号的字
  • 包含在一对“:”号之间,如:
* HEADLINE 1                 :label1:
  • 一个标题可以有多个标签名称,定义方法如:
** HEADLINE 2                :label2:label3:

5.3.2 标签编辑命令

标签可以直接在标题后手工输入,Org也提供了快捷的编辑命令:

  • 在文内使用 C-c C-q 命令,输入标签名称并回车,标签自动产生并放置到该文所属标题的标签列
  • 如果光标在一个标题内,使用 C-c C-c 命令的作用和 C-c C-q 一样,但如果不在光标不在标题内则不起作用。
  • 在合适的位置再次使用 C-c C-q 或 C-c C-c 即可对现有标签名称进行修改。

5.3.3 预定义标签

和TODO关键词一样,标签可以预定义并设置快捷选择键,在使用标签编辑命令时将弹出选择菜单:

  • 在Emacs配置文件中定义的标签应用于所有文件。例如:
(setq org-tag-alist '(("@work" . ?w) ("@home" . ?h) ("laptop" . ?l)))
  • 在org文件中定义该文件使用的标签。例如:
#+TAGS: @work(w) @home(h) @tennisclub(t) laptop(l) pc(p)

5.3.4 标签的继承特性

设置了标签的任务能自动将所设标签属性传递给子任务,称为标签的继承性。这一特性使标签尤其适用于任务的分类。

* TODO 任务1           :紧急任务:
** TODO 子任务1        :特急:
** TODO 子任务2

子任务1和子任务2无需显式贴上 :紧急任务: 就自然拥有该标签,子任务1实际有两个标签 :紧急任务:特急: 。

标签外观也可以修改,方法同 TODO 关键词的外观修改差不多,设置  org-tag-faces 变量。

5.4 任务间的依赖关系

5.4.1 任务属性

标题不可能包罗万象,一些任务属性如任务ID不能通过任务标题设定。这些属性可以通过Org文档的内容属性设定.属性定义以PROPERTIES名称开头,以END结束,每项内容均使用两个冒号括起来,如:

* TODO 今日事物
   :PROPERTIES:
   :ID: today-todos
   :ORDERED: t
   :COOKIE_DATA: todo recursive
   :END:

5.4.2 简单任务关系

现版Org-mode实现了两种简单任务关系的设置:

  • 如果子任务没有全部完成,主任务将不能设置为 DONE 状态
  • 如果前面有其他任务没有完成,后面的任务将不能设置为 DONE 状态

要使用第一种依赖关系需要打开 org-enforce-todo-dependencies ,即在Emacs配置文件中设置:

(setq org-enforce-todo-dependencies t)

要使用第二种依赖关系则需要在主任务下打开任务的 ORDERED 属性,例如:

* TODO 请客吃饭
   :PROPERTIES:
   :ORDERED: t
   :END:
** TODO 确定客人时间
** TODO 订饭店
** TODO 点菜
** TODO 买单

请客吃饭下的各项工作得按顺序去做。

5.4.3 复杂依赖关系

对于大型项目,各项任务间的关系错综复杂,利用上面的简单任务关系根本无法进行有效项目进程规划。使用org-depend.el 程序(自己查找下载)对这类项目的日程安排很有帮助。该程序附带了应用例子,这里只介绍它的功能(由程序内的说明翻译而来)。

5.4.3.1 触发事件
  • 一个任务如果具有 TRIGGER 属性,而且属性值为 chain-siblings(KEYWORD) 字串,当该任务的状态转到DONE 时将触发事件:该任务的下一个同级任务转为 KEYWORD 状态并获得相同的 TRIGGER 属性
  • 一个任务如果具有 TRIGGER 属性,而且属性值为 chain-siblings-schedualed 字串,当该任务的状态转到 DONE 时将触发事件:该任务的下一个同级任务获得相同的计划时间并获得相同的 TRIGGER 属性
  • 一个任务如果具有 TRIGGER 属性,而且属性值为 chain-find-next(KEYWORD[,OPTIONS]) 字串,当该任务的状态转到 DONE 时将触发以下事件:
    • 收集所有同级任务到一个临时列表,然后按照 OPTIONS 进行过滤和排序
    • 列表中第一个任务的状态转为 KEYWORD 状态并获得相同的 TRIGGER 属性
    • OPTIONS 选项由逗号分隔,不能有空格,取值可以为: from-top, from-bottom, from-current, no-wrap, today-only, today-and-done-only, priority-up, priority-down, effort-up, effort-down
  • 如果 TRIGGER 属性包含任何其他的字符串,这些字符串都被当成id处理,例如: XYZ(KEYWORD) ,org-mode将查找ID属性为 XYZ 的任务并将其状态该为 KEYWORD 状态。
5.4.3.2 阻止事件
  • 如果一个任务具有 BLOCKER 属性,且属性值为 previous-sibling ,那么试图将该任务转到 DONE 状态时将检查上一个任务的状态。如果上一个任务的状态为 TODO ,当前任务的状态不能改变
  • 如果一个任务具有 BLOCKER 属性,且属性值包含其他的字符串,这些字符串将被当成任务的ID。试图改变当前任务状态为 DONE 时org-mode将查找相应ID的任务,如果这些任务中有任何一个还不是 DONE 状态,当前任务的状态将不能改变
  • 如果状态改变被阻止,该任务将被打上 :blocked: 标签,这样你可以使用 C-c & 找到阻止该事件的任务。

5.5 预约任务时间

 

5.5.1 Emacs日历

返回目录

Emacs提供了桌面日历,不仅附带有公共事件日志(节假日等),还可以帮助你管理预约事件和跟踪项目时间。Emacs日历使用独立的缓冲区和主模式(Calendar模式),执行 M-x calendar 命令即可打开并显示3个月的日历,当前月份居中。如果要打开特定时间的日历,用 C-u M-x calendar ,在提示符下输入年(数字)和月(名称)即可。鼠标键在日历模式下具有特殊意义:左键(Mouse-1)选定某天,中键(如果有,Mouse-2)弹出适用于整个日历的命令菜单,右键(Mouse-3)弹出适用于鼠标所指日期的菜单。键盘输入 q 直接退出日历(关闭日历窗口)。

下面只介绍和日程安排相关的日历操作,如果你觉得其他的一些用法如日出日落、月圆月缺、玛雅日历等也和你的日程安排有关,请查看 Emacs Manual 。

5.5.1.1 在日历中移动光标

移动标准时长:

命令动作变量
C-f 前移一天 calendar-forward-day
C-b 后移一天 calendar-backward-day
C-n 前移一周 calendar-forward-week
C-p 后移一周 calendar-backward-week
M-} 前移一月 calendar-forward-month
M-{ 后移一月 calendar-backward-month
C-x ] 前移一年 calendar-forward-year
C-x [ 后移一年 calendar-backward-year

 

转到周、月、年的开始或结束日期:

命令动作变量
C-a 到周的开始 calendar-beginning-of-week
C-e 到周的结束 calendar-end-of-week
M-a 到月的开始 calendar-beginning-of-month
M-e 到月的结束 calendar-end-of-month
M-< 到年的开始 calendar-beginning-of-year
M-> 到年的结束 calendar-end-of-year

 

转到指定日期:

命令动作变量
g d 到指定年月日 calendar-goto-date
g D 到某年的第几天 calendar-goto-day-of-year
g w 到某年的第几周 calendar-iso-goto-week
o 把某年某月居中 calendar-other-month
. 到今日(不居中) calendar-goto-today
5.5.1.2 卷动日历

和移动鼠标有些差别。

命令动作变量
> 前卷一个月 calendar-scroll-left
< 后卷一个月 calendar-scroll-right
C-v 前卷三个月(下一屏) calendar-scroll-left-three-months
M-v 后卷三个月(上一屏) calendar-scroll-right-three-months
5.5.1.3 使用农历

Emacs日历可以转换农历,不过现在你不需要自己去做了,下载使用cal-china-x 即可。下载后放到某个位置,如 .emacs.d/addons ,在Emacs配置文件中添加两行:

(add-to-list 'load-path "~/.emacs.d/addons")
(require 'cal-china-x)
5.5.1.4 节日和日志

为简单起见,凡在日历上标示的事件(节日、生日、纪念日或其他)下面都称为节日:

命令动作
x 在日历窗口中标出节日
u 取消节日标记
h 显示当前日期的节日
a 列出当前日历(三个月)的所有节日
M-x holidays 在另一个窗口列出近3个月(以今天为中心)的所有节日
M-x list-holidays 在另一窗口列出设定的若干年内的所有节日

 

Emacs日历默认不标记节日,如果希望打开日历就能看到节日标记,设置一下:

(setq mark-holidays-in-calendar t)

公共“节日”很多,一些可能是你根本不care的,如果这些都出现在日历和日程表中,肯定很烦人。所以还得定制一下,只显示自己设定的日历事件,比如:

(setq my-holidays
    '(;;公历节日
      (holiday-fixed 2 14 "情人节")
      (holiday-fixed 9 10 "教师节")
      (holiday-float 6 0 3 "父亲节")
      ;; 农历节日
      (holiday-lunar 1 1 "春节" 0)
      (holiday-lunar 1 15 "元宵节" 0)
      (holiday-solar-term "清明" "清明节")
      (holiday-lunar 5 5 "端午节" 0)
      (holiday-lunar 7 7 "七夕情人节" 0)
      (holiday-lunar 8 15 "中秋节" 0)
      ;;纪念日
      (holiday-fixed 1 1 "儿子生日")
      (holiday-lunar 2 2 "老婆生日"  0)
      (holiday-lunar 3 3 "我的生日" 0)
))
(setq calendar-holidays my-holidays)  ;只显示我定制的节假日

其中:

  • holiday-fixed 用于设定公历事件
  • holiday-float 用于设定浮动公历事件
  • holiday-lunar 用于设定农历事件,各项的意义参考后面的 diary-float 说明。
  • holiday-solar-term 是一些预定义但还需要特殊计算的节日,如农历的24节气。

Emacs可以使用日志(Diary)方式管理日程,方法是设置 diary-file 。但用Org-mode就可以不用那种方式了,所以把它忽略。

5.5.2 Org-mode时间戳的组成

返回目录

时间戳由尖括号 <> 或方括号 [] 表示,前者为激活时间,后者为非激活时间(不加入日程表的时间)。括号内可以包括以下内容组成(按先后顺序):

  • 日期,如 2013-6-1
  • 时间或时间范围,如 2:30pm 或 10:00-12:00
  • 表示周期重复的字符串,如 +1w 表示每周重复
  • 其他附加信息和特殊符号:
符号意义
+0 今天
. 今天
+4d 今天算起,第4天
+4 同上
+2w 今天算起,第2周
++5 默认日期开始,5天后
+2tue 今天算起,第2个Tuesday

 

注意“今天”和“默认日期”所表示的意义是不同的,例如:

  • <2013-06-20 周四 .+1w> 表示这是一个周期性重复任务,每周四执行;但是如果某次任务的实际完成日期( DONE 状态产生日期)是星期一,那么下一次任务就是一周后的星期一
  • <2013-06-20 周四 ++1w> 同样表示一个周期性重复任务,每周四执行;但不管任务实际完成日期是星期几,下一次任务的时间都固定为下个星期四

由两个断线“–”连接起来的两个时间戳表示时间段,如: <2013-06-25 周二>--<2013-06-26 周三>

除以上标准用法外,一些不规则时间戳可以使用Emacs日志风格的字符串表示,同样放在方括号或尖括号中。常用的有:

  • 周年纪念,如诞辰: %%(diary-anniversary 12 26 1893)
  • 周期重复,如从6月1日开始每隔10天重复: %%(diary-cyclic 10 6 1 2013)
  • 某些日期,用于组合不同的月、日、年,例如每年的3-5月的10号可以这么表示(t表示所有数值,这里表示所有年度): %%(diary-date '(3 4 5) 10 t)
  • 某月的第几个星期几,用浮动日期格式字符串 %%(diary-float month dayname index) 表示。其中month 为表示月份的整数(同样可以使用t表示所有月份), dayname 表示星期几(0为Sunday), index为正数表示从前往后数,复数则相反。如5月的最后一个星期三表示为: %%(diary-float 5 3 -1)

5.5.3 产生时间戳

时间戳可以直接输入,但最好使用快捷命令(期间要调用Emacs日历)产生:

快捷命令 动作
C-c . 通过日历选择计划日期,如果在一个时间戳后面使用将产生一个日期段
C-c ! 同上,但产生非激活日期
C-u C c . 产生计划时间或时间段
C-u C c ! 同上,但产生非激活日期
C-c C-c 在时间戳上使用该命令将对该时间戳进行格式补全和校对
C-c < 插入Emacs日历中光标所在处的日期(或当前日期)作为时间戳
C-c > 访问Emacs日历上当前日期;如果光标处有时间戳就访问该日期
C-c C-o 在日程表上访问光标时间戳表示的日期/时间
S-UP/DOWN/LEFT/RIGHT 前/后移日期或时间(小时/分),具体情况由光标所在位置而定

5.5.4 预约任务时间

 
5.5.4.1 安排开始时间(SCHEDUALED)

表示任务将在指定的时间开始。计划时间通过 C-c C-s 命令输入,例如

SCHEDULED: <2013-06-25 周二>

一个任务在计划时间到达时将在每天的日程表上出现,直到任务标记为 DONE 。也可以延迟计划任务在日程表上显示的时间,如延迟2天:

SCHEDULED: <2013-06-25 周二 -2d>

注意这里“计划时间”和通常所说的安排一个任务的时间不一样。如果要指定一个任务在确切的时间开始,直接输入时间戳就可以了。

5.5.4.2 设定截止时间(DEADLINE)

任务应该设置完成的截止时间。截止时间通过 C-c C-d 命令输入,例如:

DEADLINE: <2013-06-26 周三 -5d>

日期后面的 -5d 表示截止时间前5天开始在 today 日程表上提醒。如果不设置提醒开始时间则按照 org-deadline-warning-days 的设置进行提醒。日程提醒将一直持续(即使任务过期),直到任务标记为 DONE 状态。如果一个任务既安排了开始时间又设定了截止时间,日程表上的提醒将有重复,可以选择显示哪个。忽略截止时间提醒的设置为:

(setq org-agenda-skip-deadline-prewarning-if-scheduled t)

忽略开始时间提醒的设置为:

(setq org-agenda-skip-scheduled-delay-if-deadline t)
5.5.4.3 安排周期重复任务的时间

和前面的重复任务时间戳没什么不同,只不过要注意表示重复和表示提醒安排的字符串的顺序,表示重复的在前,如:

DEADLINE: <2013-11-01 周五 +1m -3d>

5.6 任务进程监控与记录

5.6.1 任务进度监控

 
5.6.1.1 显示进度

在标题或复选框列表(不一定是任务)的任何位置输入 [%] 或 [/] ,当使用 C-c C-t 或 S-LEFT/RIGHT 改变子任务的状态时Org就会计算完成百分比或分数,如 [1/5] 。通过输入改变TODO关键词状态的方式不触发计算,但可以在进度状态的位置上执行 C-c C-c 命令更新状态。

5.6.1.2 设置统计方式

默认情况下任务的进度监控仅计算下一级子任务,要统计所有级别的子任务应在合适的位置设置:COOKIE_DATA: todo recursive 属性,即:

:PROPERTIES:
:COOKIE_DATA: todo recursive
:END:

如果监控的是复选框任务,把 todo 改为 checkbox 。

5.6.2 状态更改记录

如果TODO关键词定义时设置了时间标签选项(!),任务状态发生改变时将在该任务的下方记录下状态改变的时间。这项功能很容易使用。如果不想记录某个任务及其子任务的状态更改,可以在任务下设置属性 LOGGING为 nil 。

* 本项任务无需记录状态改变
  :PROPERTIES:
  :LOGGING: nil
  :END:

5.6.3 关闭任务

如果觉得通过设置TODO关键词方式记录的状态更改时间很烦人(每次修改都记录,即使误操作了也要手工删除),那你应该用 org-log-done 变量:

(setq org-log-done 'time)

如上设置后每次将任务改变为 DONE 状态时在任务下添加一行内容 CLOSED: [timestamp] ,而再将 DONE 状态改为 TODO 时该行内容被自动删除。

如果项目结束时你还想对它写点评价子类的话,可以设置

(setq org-log-done 'note)

这样每次任务结束时Org就会提示你输入备注,并把它放到“Closing Note”标题下。

5.6.4 工作计时和癖好记录

我仅粗略看了一下工作计时这个功能的一些介绍。按我的理解,它主要用于写作上,允许你记录和计算你趴在某个标题下的时间。一般人可能不干这么无聊的事情。我对癖好记录(habits tracking)也没什么兴趣。自己看 The Org Manual 吧。

5.7 使用日程表管理任务

5.7.1 日程表视图(Agenda views)

Org-mode不要求所有的待办任务都整齐排列到一个文件中,更没有设立专门的诸如.todo类型的文件,因为它的作者们认为我们平时要处理的事情多数都是在记笔记中产生的。任务可以随时随地定制,它们会散落到各个角落(即文件),因此必需使用某些方式把它们收集起来并进行排序和显示。Org能够使用一些标准选择任务并显示在独立的缓冲区中。它提供了7种不同的显示模式:

  • 日程表:用类似于日历的方法显示特定日期的任务
  • 待办任务列表:列出所有未完成的任务
  • 匹配视图:通过标签、属性或TODO关键词选择并显示匹配的标题
  • 时间线视图:把所有任务放到一个Org文件中并按时间顺序排列
  • 文本搜索视图:从多个文件中搜索匹配特定关键词的任务
  • 静止项目视图:列出没有任何动静的项目(标题),即没有任何TODO关键词标记的标题
  • 用户定制视图:可以定制特殊搜索条件或组合不同的视图

5.7.2 日程表文件

Org虽然没有定义专门的日程表类型的文件,但要产生特定的日程表总不能天南海北的胡乱查找任务,所以要先指定一些(org)文件为搜索范围。这可以通过设置 org-agenda-files 变量完成,如:

(setq org-agenda-files (list "D:/agenda"))

会把 D:/agenda 目录下(不包括子目录)的所有org文件都加入到日程表的搜索范围。也可以使用下面的快捷键逐个添加或删除:

  • C-c [ :把当前文件加到 agenda-files 列表的最前面;如果文件已经在 agenda-files 中,就把移到最列表最前面或最后面。
  • C-c ] :把当前文件从 agenda-files 列表移除

5.7.3 在日程表上查看任务

Org-mode产生日程表的快捷键默认不安装,得自己设置:

(global-set-key "\C-ca" 'org-agenda)

使用 C-c a 就会弹出日程表视图选择窗口,每个选项都有说明,其中包括前面所说的几种日程表视图,不再啰嗦。 日程表默认列出7天内的任务,如果要改变就设置 org-agenda-ndays 变量,如:

(setq org-agenda-ndays 21)
(setq org-agenda-include-diary t)

5.7.4 用Org文件定制特殊日程表事件

这是个很fancy的功能,类似于Emacs日历的日志文件管理方式,值得使用。比如:

* 纪念日
#+CATEGORY: Ann
%%(org-anniversary 1999 1 1) 结婚 %d 周年纪念
%%(org-anniversary 2000 2 2) 儿子 %d 岁生日

保存为一个独立的org文件,然后加入你的日程表文件列表,产生日程表时会这些事件。


Author: ZGUANG@LZU

Created: 2013-06-27 周四 22:20

Emacs 24.3.1 (Org mode 8.0.3)

Validate XHTML 1.0

 

 

 

############################################################################################      

  http://zh.wikipedia.org/wiki/Org-%E6%A8%A1%E5%BC%8F

Org-模式Org-mode)是文本编辑软件Emacs的一种支持内容分级显示的编辑模式。这种模式支持写 to-do 列表,日志管理,做笔记,做工程计划或者写网页。比如,todo 列表可以给每一件事分别赋上不同的优先级和最后完成期限,每一个 todo 项目又可以细分成次级 todo 列表或者核对表,而且每一个项目还都可以分别加标签或者属性。除此之外,org-模式还可以自动生成某一段时间以内的日程表[2]

Org-模式的大部分功能都是可以使用Emacs的经典方法定制的(通过菜单栏进行人性化配置或者修改.emacs配置文件)。

从 Emacs 22 版本开始,org-模式就成为 Emacs 默认安装的一部分了[3]。由于 emacs 和 org-模式是分开发布的,所以经常可以从 org-模式的官网下载到比已经整合到 Emacs 中版本要新的 org-模式。

 

org-mode,org模式
org-mode logo
原作者 Carsten Dominik 
开发者 Bastien Guerry 
稳定版本 8.0.3/
2013年5月14日;4个月前[1]
编程语言 Emacs Lisp语言
类型 个人信息管理做笔记日程管理时间管理 ...
许可协议 GPL
网站 www.orgmode.org

  

        http://www.cnblogs.com/holbrook/archive/2012/04/12/2444992.html

 

org-mode: 最好的文档编辑利器,没有之一

尽管按照org-mode 官方 的说法,Org 是一个基于快速高效的文本方式来实现做笔记、管理待办事项(TODO list)以及做项目计划的模式(Org is a mode for keeping notes, maintaining TODO lists, and doing project planning with a fast and effective plain-text system ),但 Org-mode 首先是最好的文档编辑利器,没有之一。

我之前用过很多年M$ Word, 也尝试过OpenOffice/LibreOffice Writer,以及iWorks Pager,但都不理想,写文档是没有痛快淋漓的感觉。直到后来发现了Omni Outliner, 才终于找到了写作的乐趣。 但是了解了org-mode之后,发现原来一切都是浮云。只有Org-mode才是终极的解决之道。 使用org-mode写文档的时候,你只需要关注内容本身,而不需要写上几个字,选中它们按Ctl-B,或者停下来用鼠标去点击“标题1”,更甚觉得那个标题格式不顺眼,开始去调整样式,而停下写作的思路。

BTW,Omni Outliner似乎也是从Org-mode找到的灵感,有图为证:

其功能与Org-mode 几乎一样,而且这货居然支持emacs快捷键!

尽管Omni Outliner以GUI的方式实现了org-mode的功能,但是并不是很理想:它的内容是“所见即所得”的,很多时候你难以更改其样式,而且只能在Mac OS下使用。 而Org-mode使用文本方式,具有如下优势:

  • 格式通用,系统无关,软件无关
  • 体积小,速度快
  • “所想即所得”,比“所见即所得”更人性化

可以说,正是由于有了 Org-Mode, Emacs 处理文本的能力才得到了大幅度的提高,使得Emacs能够被非程序员接受。 如果说LaTex是排版的终极,那么Org-mode就是编辑的终极。Emacs 22 以后的版本已经集成了 org-mode,打开 .org 扩展的文件会自动进入 org 模式。此外,Vim下面也有了对应的Org-mode。

本文介绍最基本的编辑、格式化文本以及导出功能,后续再讨论高级玩法。

1 用大纲组织内容

尽管Org-mode的功能不断丰富,现在已经可以记笔记,管理个人事务,制定项目计划以及很多其他的用途,但是最初和最基本的功能还是通过大纲(outline)的方式来编辑文档。 而且,无论是笔记管理,任务管理还是项目计划的编写,都是以对内容进行高效的组织(organization)为基础的。

在编辑文档,尤其是大型文档的时候,对内容的组织就显得尤为重要。经常需要在文档中快速定位,只关注某一部分的内容, Word之类的编辑器,通过文档结构图来定位文档位置,速度很慢,而且很多时候不能满足编辑的需要。尽管Word也提供了“大纲视图”,但是,唉……不说也罢, 如果那个功能真的好用,也就不需要Omni Outliner了。

Org-mode天然支持大纲视图,通过在文档中定义标题,可以方便的浏览每个小节,从而把握文档的总体内容。 Org是基于Outline模式的,它提供了更灵活的编辑结构文件的命令。比如折叠文档,针对大纲的编辑功能等,极其强大。

1.1 定义标题

要实现大纲,首先要定义标题。用emacs新建一个orgmode.org,输入如下内容:

* org-mode
** 大纲
正在编写大纲
** 轻量级标记语言
* 可以导出其他格式
支持html,pdf等格式

注意:

  1. * 要位于每行的行首
  2. * 之后要有一个空格,然后再输入标题
  3. 连续几个*就表示是第几级大纲,最多支持10级。

此时看起来应该是这个样子:

org-mode

觉得没什么出奇的地方,只是改变了一些颜色?其真正的用处在于可以通过大纲操作文档,包括折叠,定位和编辑。而这些操作都通过快捷键实现,非常有效率。尤其是对大文档。

1.2 大纲相关的快捷键

 
1.2.1 折叠大纲
 
快捷键命令说明
S-TAB org-shifttab 循环切换整个文档的大纲状态(三种状态:折叠,打开下一级,打开全部)
TAB org-cycle 循环切换光标所在大纲的状态
1.2.2 在大纲之间移动
 
快捷键命令说明
C-c C-n/p   下/上一标题
C-c C-f/b   下/上一标题(仅限同级标题)
C-c C-u   跳到上一级标题
C-c C-j   切换到大纲浏览状态
1.2.3 基于大纲的编辑
 
快捷键命令说明
M-RET   插入一个同级标题
M-S-RET   插入一个同级TODO 标题
M-LEFT/RIGHT   将当前标题升/降级
M-S-LEFT/RIGHT   将子树升/降级
M-S-UP/DOWN   将子树上/下移
C-c *   将本行设为标题/正文
C-c C-w   将子树或区域移动到另一标题处(跨缓冲区)
C-x n s/w   只显示当前子树/返回
C-c C-x b   在新缓冲区显示当前分支(类似C-x n s)
C-c /   只列出包含搜索结果的大纲,并高亮,支持多种搜索方式
C-c C-c   取消高亮

更多的快捷键可以通过C-c C-x C-h查看。

1.3 大纲的显示方式

默认的大纲显示没有缩进,显得有些乱。可以用 M-x org-indent-mode切换到另一种显示方式:

如果想让某个文件默认用这种方式打开,可以在文件头部增加:

#+STARTUP: indent

如果希望打开所有org文件都默认用这种方式,可以在.emacs中配置:

(setq org-startup-indented t)

2 超链接和图文混排

超链接也是组织内容的一种非常有效的方式。Org 支持多种超链接。对于符合要求的图片链接,可以形成图文混排。

2.1 创建链接

对于符合链接规则的内容,org-mode会自动将其视为链接,包括括文件、网页、邮箱、新闻组、BBDB 数据库项、IRC 会话和记录等。下面是一些例子:

http://www.astro.uva.nl/~dominik            on the web
file:/home/dominik/images/jupiter.jpg       file, absolute path
/home/dominik/images/jupiter.jpg            same as above
file:papers/last.pdf                        file, relative path
file:projects.org                           another Org file
docview:papers/last.pdf::NNN                open file in doc-view mode at page NNN
id:B7423F4D-2E8A-471B-8810-C40F074717E9     Link to heading by ID
news:comp.emacs                             Usenet link
mailto:adent@galaxy.net                     Mail link
vm:folder                                   VM folder link
vm:folder#id                                VM message link
wl:folder#id                                WANDERLUST message link
mhe:folder#id                               MH-E message link
rmail:folder#id                             RMAIL message link
gnus:group#id                               Gnus article link
bbdb:R.*Stallman                            BBDB link (with regexp)
irc:/irc.com/#emacs/bob                     IRC link
info:org:External%20links                   Info node link (with encoded space)

对于文件链接,可以用::后面增加定位符的方式链接到文件的特定位置。定位符可以是行号或搜索选项。如:

file:~/code/main.c::255                     进入到 255 行
file:~/xx.org::My Target                    找到目标‘<<My Target>>’
file:~/xx.org/::#my-custom-id               查找自定义 id 的项

除了上述的自动链接外,还可以显示指定链接,采用如下格式:

[[link][description]]
[[link]]

显示指定的链接可以不显示原始的URL而是显示对该链接的描述。 这种方式可以用相对路径链接本地文件。

对于显示指定的链接,即可以手工输入,也可以用org-mode提供的快捷键进行编辑:

 
快捷键命令说明
C-c l   保存链接
C-c C-l org-insert-link 创建或修改链接,可以引用已保存的链接
C-c C-o org-open-at-point 打开链接
 
C-c %   记录内部链接地址
C-c &   跳转到已记录的内部链接

2.2 内部链接

前面的例子都是外部链接,Org-mode还支持内部链接:

定义锚点 #<<my-anchor>>
[[my-anchor][内部链接]]

脚注可以看作是一种特殊的内部链接,但是要求具有"fn:"前缀:

添加脚注链接 [[fn:footprint1][脚注1]]
定义脚注 [fn:footprint1]

2.3 显示图片

尽管不看重"所见即所得",但有时候能够看到图文混排的内容还是很有必要的。通过iimage这个minor mode,可以在Org-mode中显示图片。

下载 iimage.el 文件扔到 Emacs 的目录里,然后在 .emacs 里添加下面的代码:

;; iimage mode
(autoload 'iimage-mode "iimage" "Support Inline image minor mode." t)
(autoload 'turn-on-iimage-mode "iimage" "Turn on Inline image minor mode." t)

然后就可以用命令

M-x iimage-mode RET

在当前模式里启动 iimage 这个 minor mode。

iimage-mode目前只能显示以文件方式链接的图片。

混排 超链接也是组织内容的一种非常有效的方式。Org 支持多种超链接。对于符合要求的图片链接,可以形成图文混排。

2.4 创建链接

对于符合链接规则的内容,org-mode会自动将其视为链接,包括括文件、网页、邮箱、新闻组、BBDB 数据库项、IRC 会话和记录等。下面是一些例子:

http://www.astro.uva.nl/~dominik            on the web
file:/home/dominik/images/jupiter.jpg       file, absolute path
/home/dominik/images/jupiter.jpg            same as above
file:papers/last.pdf                        file, relative path
file:projects.org                           another Org file
docview:papers/last.pdf::NNN                open file in doc-view mode at page NNN
id:B7423F4D-2E8A-471B-8810-C40F074717E9     Link to heading by ID
news:comp.emacs                             Usenet link
mailto:adent@galaxy.net                     Mail link
vm:folder                                   VM folder link
vm:folder#id                                VM message link
wl:folder#id                                WANDERLUST message link
mhe:folder#id                               MH-E message link
rmail:folder#id                             RMAIL message link
gnus:group#id                               Gnus article link
bbdb:R.*Stallman                            BBDB link (with regexp)
irc:/irc.com/#emacs/bob                     IRC link
info:org:External%20links                   Info node link (with encoded space)

对于文件链接,可以用::后面增加定位符的方式链接到文件的特定位置。定位符可以是行号或搜索选项。如:

file:~/code/main.c::255                     进入到 255 行
file:~/xx.org::My Target                    找到目标‘<<My Target>>’
file:~/xx.org/::#my-custom-id               查找自定义 id 的项

除了上述的自动链接外,还可以显示指定链接,采用如下格式:

[[link][description]]
[[link]]

显示指定的链接可以不显示原始的URL而是显示对该链接的描述。 这种方式可以用相对路径链接本地文件。

对于显示指定的链接,即可以手工输入,也可以用org-mode提供的快捷键进行编辑:

 
快捷键命令说明
C-c l   保存链接
C-c C-l org-insert-link 创建或修改链接,可以引用已保存的链接
C-c C-o org-open-at-point 打开链接
 
C-c %   记录内部链接地址
C-c &   跳转到已记录的内部链接

2.5 内部链接

前面的例子都是外部链接,Org-mode还支持内部链接:

定义锚点 #<<my-anchor>>
[[my-anchor][内部链接]]

脚注可以看作是一种特殊的内部链接,但是要求具有"fn:"前缀:

添加脚注链接 [[fn:footprint1][脚注1]]
定义脚注 [fn:footprint1]

2.6 显示图片

尽管不看重"所见即所得",但有时候能够看到图文混排的内容还是很有必要的。通过iimage这个minor mode,可以在Org-mode中显示图片。

下载 iimage.el 文件扔到 Emacs 的目录里,然后在 .emacs 里添加下面的代码:

;; iimage mode
(autoload 'iimage-mode "iimage" "Support Inline image minor mode." t)
(autoload 'turn-on-iimage-mode "iimage" "Turn on Inline image minor mode." t)

然后就可以用命令

M-x iimage-mode RET

在当前模式里启动 iimage 这个 minor mode。

iimage-mode目前只能显示以文件方式链接的图片。

3 轻量级标记语言

前面的大纲和超链接都是使用标记来定义的。实际上,Org现在已经成为一种专门的轻量级标记语言,与Markdown、reStructedText、Textile、RDoc、MediaWiki等并列。

相对于重量级标记语言(如html, xml),轻量级标记语言的语法简单,书写容易。即使不经过渲染,也可以很容易阅读。用途越来越广泛。 比如,gitHub的README文档除了支持纯文本外,还支持丰富的轻量级标记语言,其中就包括Org。

关于这些语言的对比,可以参考这里 。下面来看一下Org还支持哪些标记。

3.1 字体

*粗体*
/斜体/
+删除线+
_下划线_
下标: H_2 O
上标: E=mc^2
等宽字:  =git=  或者 ~git~

3.2 表格

Org 能够很容易地处理 ASCII 文本表格。任何以‘|’为首个非空字符的行都会被认为是表格的一部分。’|‘也是列分隔符。一个表格是下面的样子:

| Name  | Pone | Age |
|-------+------+-----|
| Peter | 1234 | 17  |
| Anna  | 4321 | 25  |

你可能认为要录入这样的表格很繁琐,实际上你只需要输入表头“|Name|Pone|Age”之后,按C-c RET,就可以生成整个表格的结构。类似的快捷键还有很多:

3.2.1 创建和转换表格
 
快捷键命令说明
C-c 竖线   创建或转换成表格
3.2.2 调整和区域移动
 
快捷键命令说明
C-c C-c   调整表格,不移动光标
TAB   移动到下一区域,必要时新建一行
S-TAB   移动到上一区域
RET   移动到下一行,必要时新建一行
3.2.3 编辑行和列
 
快捷键命令说明
M-LEFT/RIGHT   移动列
M-UP/DOWN   移动行
M-S-LEFT/RIGHT   删除/插入列
M-S-UP/DOWN   删除/插入行
C-c -   添加水平分割线
C-c RET   添加水平分割线并跳到下一行
C-c ^   根据当前列排序,可以选择排序方式

3.3 段落

对于单个回车换行的文本,认为其属于同一个段落。在导出的时候将会转化为不换行的同一段。如果要新起一个段落,需要留出一个空行。 这点与MediaWiki类似。

3.4 列表

Org 能够识别有序列表、无序列表和描述列表。

  • 无序列表项以‘-’、‘+’或者‘*‘开头。
  • 有序列表项以‘1.’或者‘1)’开头。
  • 描述列表用‘::’将项和描述分开。
  • 有序列表和无序列表都以缩进表示层级。只要对齐缩进,不管是换行还是分块都认为是处于当前列表项。

同一列表中的项的第一行必须缩进相同程度。当下一行的缩进与列表项的的开头的符号或者数字相同或者更小时,这一项就结束了。当所有的项都关上时,或者后面有两个空行 时,列表就结束了。例如:

  My favorite scenes are (in this order)
  1. The attack of the Rohirrim
  2. Eowyn's fight with the witch king
      + this was already my favorite scene in the book
      + I really like Miranda Otto.
  Important actors in this film are:
  - Elijah Wood :: He plays Frodo
  - Sean Austin :: He plays Sam, Frodo's friend.

将显示为:

My favorite scenes are (in this order)

  1. The attack of the Rohirrim
  2. Eowyn's fight with the witch king
    • this was already my favorite scene in the book
    • I really like Miranda Otto.

Important actors in this film are:

Elijah Wood
He plays Frodo
Sean Austin
He plays Sam, Frodo's friend.
3.4.1 列表操作快捷键

为了便利,org-mode也支持很多列表操作的快捷键,大部分都与大纲的快捷键类似:

 
快捷键命令说明
TAB   折叠列表项
M-RET   插入项
M-S-RET   插入带复选框的项
M-S-UP/DOWN   移动列表项
M-LEFT/RIGHT   升/降级列表项,不包括子项
M-S-LEFT/RIGTH   升/降级列表项,包括子项
C-c C-c   改变复选框状态
C-c -   更换列表标记(循环切换)

3.5 分隔线

五条短线或以上显示为分隔线。

-----

4 标签

 

4.1 tag的作用

对于信息的管理,有分类(category)和标签(tag)两种方式。这两种方式各有特点:

通常分类是固定的,很少变化,而tag随时可以增加。 分类通常表现为树状结构,比较清晰,但是树状结构过于简单,不能表达复杂的信息。比如,如果有多个分类树,处理起来就会比较麻烦。

所以,这两种方式通常结合起来使用。比如blog系统中,通常既支持文章的分类(树),又支持为每篇文章作tag标记。

org-mode作为最好的文档编辑利器 ,在支持文内大纲(也是树状结构)的同时,还方便的支持tag功能。tag可以在多篇文档中共用。

4.2 标记tag

在Org-mode中,可以对标题增加tag标记。标记的格式如下:

跟特留尼西特握手                    :苦差:薪水:逃不掉:

而且Org-mode的标签自动按照大纲树的结构继承。即子标题自动继承父标题的标签。比如:

* Meeting with the French group     :work:
** Summary by Frank                 :boss:notes:
*** TODO Prepare slides for him     :action:

则最后一行标题具有 work, boss, notes, action 四个标签。

如果希望文档中的所有标题都具有某些标签,只需要定义文档元数据:

#+FILETAGS: :Peter:Boss:Secret:

如果手工输入标签,在标题后设置标签,键入:后,M-Tab自动提供标签的补齐。

更方便的做法是在正文部分用C-c C-q 或直接在标题上用C-c C-c创建标签,这种方式可以列出所有预定义的标签以便选取。

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:

4.4 按tag搜索

使用标签可以更好的管理内容。org-mode提供了以下功能:

 
KEYSCOMMENT
C-c \ 按tag搜索标题
C-c / m 搜索并按树状结构显示
C-c a m 按标签搜索多个文件(需要将文件加入全局agenda)

可以使用逻辑表达式限制条件,更准确灵活的搜索

+     和      a+b     同时有这两个标签
-     排除    a-b     有 a 但没有 b
|     或      a|b     有 a 或者有 b
&     和      a&b     同时有 a 和 b,可以用“+”替代

在查询视图中 C-c C-c 退出

5 导出和发布

更多: http://orgmode.org/manual/Exporting.html

Org-mode可以完美的编辑,但是最终文档可能需要发布成其他的格式。 Org-Mode 支持多种文档的输出,包括:

  • 文本
  • 网页
  • PDF(需要 Latex 支持)
  • XOXO
  • FreeMind/Xmind
  • Docbook
  • iCalendar(苹果 iCal 文件)
  • ……

5.1 准备工作

为了更好的发布文档,还需要做一些准备工作。主要是为文档添加一些”元数据“,使得发布的时候能更好地识别文档的内容。

5.1.1 文档元数据

具体包括:

#+TITLE:       the title to be shown (default is the buffer name)
#+AUTHOR:      the author (default taken from user-full-name)
#+DATE:        a date, an Org timestamp1, or a format string for format-time-string
#+EMAIL:       his/her email address (default from user-mail-address)
#+DESCRIPTION: the page description, e.g. for the XHTML meta tag
#+KEYWORDS:    the page keywords, e.g. for the XHTML meta tag
#+LANGUAGE:    language for HTML, e.g. ‘en’ (org-export-default-language)
#+TEXT:        Some descriptive text to be inserted at the beginning.
#+TEXT:        Several lines may be given.
#+OPTIONS:     H:2 num:t toc:t \n:nil @:t ::t |:t ^:t f:t TeX:t ...
#+BIND:        lisp-var lisp-val, e.g.: org-export-latex-low-levels itemize
               You need to confirm using these, or configure org-export-allow-BIND
#+LINK_UP:     the ``up'' link of an exported page
#+LINK_HOME:   the ``home'' link of an exported page
#+LATEX_HEADER: extra line(s) for the LaTeX header, like \usepackage{xyz}
#+EXPORT_SELECT_TAGS:   Tags that select a tree for export
#+EXPORT_EXCLUDE_TAGS:  Tags that exclude a tree from export
#+XSLT:        the XSLT stylesheet used by DocBook exporter to generate FO file

其中#+OPTIONS是复合的选项,包括:

H:         set the number of headline levels for export
num:       turn on/off section-numbers
toc:       turn on/off table of contents, or set level limit (integer)
\n:        turn on/off line-break-preservation (DOES NOT WORK)
@:         turn on/off quoted HTML tags
::         turn on/off fixed-width sections
|:         turn on/off tables
^:         turn on/off TeX-like syntax for sub- and superscripts.  If
           you write "^:{}", a_{b} will be interpreted, but
           the simple a_b will be left as it is.
-:         turn on/off conversion of special strings.
f:         turn on/off footnotes like this[1].
todo:      turn on/off inclusion of TODO keywords into exported text
tasks:     turn on/off inclusion of tasks (TODO items), can be nil to remove
           all tasks, todo to remove DONE tasks, or list of kwds to keep
pri:       turn on/off priority cookies
tags:      turn on/off inclusion of tags, may also be not-in-toc
<:         turn on/off inclusion of any time/date stamps like DEADLINES
*:         turn on/off emphasized text (bold, italic, underlined)
TeX:       turn on/off simple TeX macros in plain text
LaTeX:     configure export of LaTeX fragments.  Default auto
skip:      turn on/off skipping the text before the first heading
author:    turn on/off inclusion of author name/email into exported file
email:     turn on/off inclusion of author email into exported file
creator:   turn on/off inclusion of creator info into exported file
timestamp: turn on/off inclusion creation time into exported file
d:         turn on/off inclusion of drawers

这些元数据可以根据需要设置。建议放在文档的开头部分。如,本文采用的元数据如下:

#+TITLE: org-mode: 最好的文档编辑利器,没有之一
#+AUTHOR:Holbrook Wong
#+EMAIL: wanghaikuo@gmail.com
#+KEYWORDS: emacs, org-mode
#+OPTIONS: H:4 toc:t 
5.1.2 内容元数据

通常在行首以“#+”开头,可以有多种用途。

  • 分行区块
    默认内容不换行,需要留出空行才能换行。定义了分行的区块可以实现普通换行:
    #+BEGIN_VERSE
     Great clouds overhead
     Tiny black birds rise and fall
     Snow covers Emacs
         -- AlexSchroeder
    #+END_VERSE
    
  • 缩进区块
    通常用于引用,与默认格式相比左右都会留出缩进:
    #+BEGIN_QUOTE
      缩进区块
    #+END_QUOTE
    
  • 居中区块
    #+BEGIN_CENTER
    Everything should be made as simple as possible, \\
    but not any simpler
    #+END_CENTER
    
  • 代码区块
    #+BEGIN_SRC ruby
      require 'redcarpet'
      md = Redcarpet.new("Hello, world.")
      puts md.to_html
    #+END_SRC
    
  • 例子
    : 单行的例子以冒号开头
    
    #+BEGIN_EXAMPLE
     多行的例子
     使用区块
    #+END_EXAMPLE
    
  • 注释
    以‘#‘开头的行被看作注释,不会被导出

    区块注释采用如下写法:

    #+BEGIN_COMMENT
      块注释
      ...
     #+END_COMMENT
    
  • 表格与图片
    对于表格和图片,可以在前面增加标题和标签的说明,以方便交叉引用。

    比如在表格的前面添加:

    #+CAPTION: This is the caption for the next table (or link)
    #+LABEL: tbl:table1
    

    则在需要的地方可以通过

    \ref{table1}
    

    来引用该表格。

5.1.3 嵌入Html

对于导出html以及发布,嵌入html代码就很有用。比如下面的例子适用于格式化为cnblogs的代码块:

#+BEGIN_HTML
  <div class="cnblogs_Highlighter">
  <pre class="brush:cpp">
  int main()
  {
    return 0;
  }
  </pre>
  </div>
#+END_HTML

相当于在cnblogs的网页编辑器中插入"c++"代码。

5.1.4 包含文件

当导出文档时,你可以包含其他文件中的内容。比如,想包含你的“.emacs”文件,你可以用:

     #+INCLUDE: "~/.emacs" src emacs-lisp

可选的第二个第三个参数是组织方式(例如,“quote”,“example”,或者“src”),如果是 “src”,语言用来格式化内容。组织方式是可选的,如果不给出,文本会被当作 Org 模式的正常处理。用 C-c ,可以访问包含的文件。

5.1.5 嵌入 LaTex

对于需要包含数学符号和特殊方程的科学笔记,Org 模式支持嵌入 LaTeX 代码到文件中。你可以直接使用类 TeX 的宏来输入特殊符号,输入方程,或者整个 LaTeX 环境。

Angles are written as Greek letters \alpha, \beta and \gamma. The mass if
the sun is M_sun = 1.989 x 10^30 kg. The radius of the sun is R_{sun} =
6.96 x 10^8 m. If $a^2=b$ and $b=2$, then the solution must be either
$a=+\sqrt{2}$ or $a=-\sqrt{2}$.
\begin{equation}
x=\sqrt{b}
\end{equation}

特殊设置之后,导出 HTML 时 LaTeX 代码片断会生成图片并包含进来。

5.2 导出

做好准备工作后,就可以导出了。使用命令:

C-c C-e

然后选择相应的格式,就可以导出对应的文件了。

5.3 发布

Org 包含一个发布管理系统,可以配置一个由相互链接的 Org 文件组成的工程项目的自动向 HTML 转换。你也可以设置 Org,将导出的 HTML 页面和相应的附件如图片,源代 码文件等自动上传到服务器。

下面是一个例子:

(setq org-publish-project-alist
     '(("org"
        :base-directory "~/org/"
        :publishing-directory "~/public_html"
        :section-numbers nil
        :table-of-contents nil
        :style "<link rel=\"stylesheet\"
               href=\"../other/mystyle.css\"
               type=\"text/css\"/>")))

发布相关的命令:

 
命令说明
C-c C-e C 提示指明一个项目,将所有的文件发布
C-c C-e P 发布包含当前文件的项目
C-c C-e F 只发布当前文件
C-c C-e E 发布所有项目

Org 用时间戳来查看文件是否改变。上面的命令只发布修改过的文件。你可以给它们加上前缀来强制重新发布所有的文件。


Date: 2012-04-15 17:59:22 CST

Author: Holbrook Wong

Org version 7.8.08 with Emacs version 23

本人已在github上用Jekyll建立了新的博客:http://thinkinside.tk/,本站文章会陆续迁移过去


 
 

         http://dayigu.github.io/WhyUseOrgModeToWriteBlog.html

为什么用 org-mode 写 blog?

Table of Contents

why

最早的时候在自己的机器上搭了个 wordpress 写些乱七八糟的,后来在自己的机器上毕竟不方便,就放弃了。今年初的时候,从阳志平 那里了解到 github、Jekyll、markdown等等,对于用 markdown 写作,用 Jekyll 发布到 github 上面的 blog 产生了兴趣。因此决定一试,其打动我的是:

  • markdown 写作,直接文本写作,不需要管格式,专注内容。和 TeX、wiki 的思想接近
  • github 托管。有版本管理,速度快、时髦

但试了一段时间后又放下了,原因如下:

  • 没有找到好的模版,自己写 css 太费劲,找的几个现成的又不满意
  • 不支持数学公式。本来 Jekyll 是支持的,但 github 上的 Jekyll 不支持
  • 对 markdown 也还是不太满意

为什么转到 org-mode 上了呢?用 emacs 发布 html 的功能早就用过 emacswiki、muse,后来也都放弃掉。org-mode 也早就听说过,但一直没有兴趣用。直到暑假期间,心血来潮,觉得用 emacs 写文档很爽,尤其是文字显式很漂亮。因此就尝试了 org-mode。orgmode 的 GTD 很出色,但我的主要目标是用来写文档。与 markdown 相比,orgmode 的优点有:

  • 与 emacs 集成度高,支持好,开发活跃。能够在 emacs 内输出 html、pdf 等格式
  • 制作 table 方便
  • 能够在 emacs 内显式图片
  • 对 latex 公式支持的好
  • 支持 “文学编程” (orgmode 中叫 Bable),可以直接在文档内部运行程序片段,将结果(文字、图像、表格)嵌入到文档中

既然有这些优点,自然就想把它用到 blog 上。github 上有个 o-blog 是基于 orgmode 的,做得也很漂亮。但试用时总有错误,加上它还是复杂了点,就放弃了,转而直接利用 orgmode 的 publish html 的功能发布 blog。图的就是上面给出的相比markdown的几个优点。

how

参考 worg 的 publishing org-mode files to html 写出我的发布配置:

(require 'org-publish)
(setq org-publish-project-alist
      '(
        ("blog-notes"
         :base-directory "~/org/blog/"
         :base-extension "org"
         :publishing-directory "~/org/dayigu.github.com/"
         :recursive t
         :publishing-function org-publish-org-to-html
         :headline-levels 4
         :section-numbers nil
         :auto-preamble t
         :auto-sitemap t                ; Generate sitemap.org automagically...
         :sitemap-filename "sitemap.org"  ; ... call it sitemap.org (it's the default)...
         :sitemap-title "Sitemap"         ; ... with title 'Sitemap'.
         :author "dayigu"
         :email "dayigu at gmail dot com"
         :style    "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/worg.css\"/>"
         )
        ("blog-static"
         :base-directory "~/org/blog/"
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "~/org/dayigu.github.com/"
         :recursive t
         :publishing-function org-publish-attachment
         )
        ("blog" :components ("blog-notes" "blog-static"))
        ;;
        ))

评论直接采用 disqus, 将 disqus 给出的评论代码设置给 html-postamble 。

写的blog post 都放在 ~/org/blog 下,以 ".org" 为文件后缀,图片放在 img 目录下。运行 M-x org-publish-projectsblog, 生成的 html 文件都输出到 ~/org/dayigu.github.com/ 下。

首先要 建立一个 index, 它会生成 blog 的首页,所有的 post list 也放在这里面。post 的链接形式为:

[[file:WhyUseOrgModeToWriteBlog][为什么用 org-mode 写blog?]]

另外直接偷懒用了 worg 的 css .

发布到 github 上,也就是 add、commit 再 push

git add .
git commit -m 'org blog commit'
git push -u origin master

     

        http://www.yifeiyang.net/emacs/org-mode-tutorial.html

        http://www.caole.net/diary/org_mode.html

Emacs org mode 学习笔记

参考文献与版权声明:

本文参考并引用了以下的文章的部分内容。

转载请注明来自曹乐的个人主页

用Org Mode做笔记

 

想法与配置

以前一直都用Emacs Wiki Mode记笔记,但wiki mode总有些奇奇怪怪的bug,并且已经不更新了,最近org mode 非常火爆,禁不住想试一下。

对于记笔记,我的打算很简单,一个目录用来装所有的笔记,一个目录用来存放publish成HTML格式的笔记。并且能够自动生成索引文件。这样就可以在索引文件里直接查找并跳转到所有的笔记里。

Emacs ORG mode的基本配置如下:

(setq load-path (cons "~/lib/emacs-lisp/org-7.01h/lisp" load-path))
(setq load-path (cons "~/lib/emacs-lisp/org-7.01h/contrib/lisp" load-path))

(require 'org-install)
(require 'org-publish)
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(add-hook 'org-mode-hook 'turn-on-font-lock)
(add-hook 'org-mode-hook 
  (lambda () (setq truncate-lines nil)))

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)

上面基本上是从ORG-mode的文档里抄来的,其中包含setq truncate-lines nil的两行代码是为了解决org-mode在编辑中文的时候不会自动折行的问题。

接下来的配置基本照抄了meteor1113@newsmth的用org代替muse记日记 , 修改的部分就是我不想让它自动生成index文件,我比较喜欢自己组织。

(setq org-publish-project-alist
      '(("note-org"
         :base-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org"
         :publishing-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish"
      :base-extension "org"
         :recursive t
         :publishing-function org-publish-org-to-html
         :auto-index nil
         :index-filename "index.org"
         :index-title "index"
         :link-home "index.html"
         :section-numbers nil
         :style "<link rel=\"stylesheet\"
                href=\"./style/emacs.css\"
                type=\"text/css\"/>")
        ("note-static"
         :base-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org"
         :publishing-directory "C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish"
         :recursive t
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|swf\\|zip\\|gz\\|txt\\|el"
         :publishing-function org-publish-attachment)
        ("note" 
         :components ("note-org" "note-static")
         :author "caole82@gmail.com"
         )))

值得注意的一个地方是,我把org和publish的目录都扔在了我的Dropbox中,这样可以方便的在不同的系统中同步笔记。有些人喜欢用SVN/GIT/CVS等版本管理工具,也是个不错的办法。但我没有地方搭这些东西的服务器:-( 这样写完了笔记就可以用M-x org-publish 发布了,我把它绑定到了F8-p上。

(global-set-key (kbd "<f8> p") 'org-publish)

为了在org mode中使用auto-complete,我在auto-complete中增加了这样的配置:

(setq ac-modes
        (append ac-modes '(org-mode objc-mode jde-mode sql-mode
                                    change-log-mode text-mode
                                    makefile-gmake-mode makefile-bsdmake-mo
                                    autoconf-mode makefile-automake-mode)))

常用的编辑

 

结构化编辑

  • 标题 
    一级标题是一个*,两级标题是两个*,三级标题…… 最多可以建10级标题。注意,这里的*必须在行首。Publish之后会自动生成目录链接。在Emacs中S-Tab可以收起所有的目录树,在标题上按Tab可以展开/收起该标题下的所有内容。在标题上按Alt+左右方向键可以减少/增加该标题的级别。
  • 枚举和列表 
    在org mode中还支持枚举(unordered list),有序的列表(ordered list)和带描述的列表。

    枚举可以用'-','+',或者非行首的'*' 作为bullets.同时,可以用开头的空格来区分枚举的层次结构。

    • 枚举1
    • 枚举2
      • 枚举3,
        • 枚举4

    有序的列表可以由'1.'或'1)'来组织。这里可以方便的使用Alt+左右方向键调整列表项的级别。M-Ret可以在当前位置插入一个列表项;C-Ret可以在文档尾部插入一个列表项或者标题。

    1. 第一级
    2. 第二级
      1. 第二级第一点
    3. 第三级

    带描述的列表效果是这样的:

    Elijah Wood
    He plays Frodo
    Sean Austin
    He plays Sam, Frodo’s friend. I still remember

    在文档中是这样的:

    - Elijah Wood :: He plays Frodo
    - Sean Austin :: He plays Sam, Frodo’s friend. I still remember
    

    5个或以上的“-”是一个水平分割符。


  • 脚注 
    org mode可以为文章添加脚注,脚注有如下两种方式:
    blabla[1]
    blablabla[fn:bla]
    

    效果是这样的: blabla1 blablabla2

    接下来必须顶格写这些脚注的内容了,这样在文档的末尾会自动生成脚注。C-c C-c可以在脚注的标记与内容之间切换。C-c C-x f可以在当前位置添加一个脚注。

    [1 ] 12345
    [fn:bla ] 67890
    
  • 结构化编辑的常用快捷方式 
    这里是Structure Editing的默认快捷方式:
     
    next/previous headingC-c C-n/p
    next/previous heading, same levelC-c C-f/b
    backward to higher level headingC-c C-u
    jump to another place in documentC-c C-j
    previous/next plain list itemS-UP/DOWN
    insert new heading/item at current level M-RET
    insert new heading after subtree C-RET
    insert new TODO entry/checkbox item M-S-RET
    insert TODO entry/ckbx after subtree C-S-RET
    turn (head)line into item, cycle item type C-c -
    turn item/line into headline C-c *
    promote/demote heading M-LEFT/RIGHT
    promote/demote current subtree M-S-LEFT/RIGHT
    move subtree/list item up/down M-S-UP/DOWN
    sort subtree/region/plain-list C-c ^
    clone a subtree C-c C-x c
    refile subtree C-c C-w
    kill/copy subtree C-c C-x C-w/M-w
    yank subtree C-c C-x C-y or C-y
    narrow buffer to subtree / widen C-x n s/w

富文本编辑

  • 表格 

    最基本的表格是这样的:

    | A | B |
    | C | D |
    

    效果是这样的:

     
    A B
    C D
    还可以:
     #+CAPTION: 表格的标题
    | A | B |
    |---+---|
    | C | D |
    

    在这里,CAPTION指定的是表格的标题,LABEL后的tbl用来指定在文档内部引用该表格的标签。 效果是:

    ABCD
    AB
    C D
    C-c RET可以在光标所在表格内插入一行

    这里是表格相关的常用快捷键:

     
    convert region to table C-c  
    re-align the table without moving the cursor C-c C-c
    re-align the table, move to next field TAB
    move to previous field S-TAB
    re-align the table, move to next row RET
    move to beginning/end of field M-a/e
    move the current column left M-LEFT/RIGHT
    kill the current column M-S-LEFT
    insert new column to left of cursor position M-S-RIGHT
    move the current row up/down M-UP/DOWN
    kill the current row or horizontal line M-S-UP
    insert new row above the current row M-S-DOWN
    insert hline below (C-u : above) current row C-c -
    insert hline and move to line below it C-c RET
    sort lines in region C-c ^
  • 引用文字或代码 
    我常用到的引用文字的标签是#+BEGIN_EXAMPLE / #+END_EXAMPLE ,在这之间的文字会保留原有的格式。
    
    对于代码而言,可以用#+BEGIN_SRC SRC_TYPE / #+END_SRC,其中SRC_TYPE用来指定代码的类型,
    如lisp, java, c, c++等。结合HTMLIZE可以让导出的HTML页面里的代码被按照语法着色。
    
    为了保留引文的格式,还可以使用#+BEGIN_VERSE / #+END_VERSE 和#+BEGIN_QUOTE/ #+END_QUOTE. 
    
    将引文居中排版可以使用#+BEGIN_CENTER / #+END_CENTER. 
    
  • 引用图片 
    用如下方法可以直接在文档内显示图片:
    #+CAPTION: title for the image
    [[path/to/image.jpg]]
    

    CAPTION用来指定图片的标题,LABEL用来在文档内部引用这张图片。和表格一样,这两部分都不是必须的。

  • 插入链接或附件 

    给文档添加附件非常简单,C-c C-a 然后就着菜单选好了,其中C-c C-a a是添加文件系统中的文件作为附件。

    Org mode提供多种链接方式,包括链接到一个文件内部,链接到外部文件,电子邮件等等。

    • 链接的格式: 

      链接主要是两种格式:

      [[link][description]] 或者 [[link]]
      

      例如 SINA

    • 如何访问链接: 
      在一个链接上按C-c C-o即可访问,至于调用什么程序访问,取决于链接的内容,emacs和org mode的配置了。
    • 链接的类型 

      如下都是可以支持的常用link类型:

      http://www.sina.com         Web
      file:paper/lastdoc.pdf      本地文档,用相对路径表示
      file:/path/to/filename      本地文档,用绝对路径表示
      news:comp.emacs             新闻组
      mailto:caole82@gmail.com    邮件地址
      
    • 内部链接 Internal Link 

      内部链接就类似于HTML的锚点(实际上export成HTML文件后就变成了锚点),可以实现在一个文档内部的跳转。

      如下命令定义了一个名为target的跳转目标:

      #<<target>>
      

      如下方式可以设置到target的链接:

      [[target]] 或 [[target][description]]
      
    • 其他常用链接命令 

      C-c l 可以在光标所在处创建一个跳转目标点,在需要跳转至该目标的位置输入命令C-c C-l可以建立到目标的链接

      当输入C-c C-l命令,光标若处在已经存在的一个链接上的时候,可以编辑改链接。

      命令C-c %可以记录当前光标所在位置,当光标移到其他地方后,可以用C-c &跳转回来。这里的位置记录类似一个kill-ring,重复输入C-c %可以记录多个位置,重复输入C-c &可以连续跳转到之前记录的对应位置上。

用Org Mode管理个人事务

 

关于TODO ITEM的基本知识和操作

 

设置TODO项目

所有标题只要以TODO开头,就会变成TODO 项目。例如:

*** TODO 付手机费
*** TODO 开会

更改TODO项目的状态

C-c C-t Rotate the TODO state of the current item among
         ,-> (unmarked) -> TODO -> DONE --.
         '--------------------------------'

C-c C-t是在定义的状态中循环,而C-u C-c C-t可以指定一个状态。

S-Right 和 S-Left也可以在定义的状态中循环。

C-c a t可以显示所有的TODO项目,能从所有agenda file里非DONE状态的TODO项目都显示出来

S-M RET可以在当前项目下插入一个新的TODO 项目(与当前项目同一级别)

更改TODO项目的优先级

以下方式可以设置TODO ITEM的优先级:

*** TODO [#A] 付手机费

C-c , 可以设置一个TODO项目的优先级 S-Up/Down 可以增减一个TODO项目的优先级

增加TODO Item的状态

默认情况下,TODO Item只有两种状态,TODO和DONE。我们可以在.emacs中配置Org,以设置更多的中间状态,例如: 用下面的方法,我们可以增加一个TODO Item的中间状态,这些状态是顺序的,通常是工作流中的不同状态。

(setq org-todo-keywords
  '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED")))

另一种可能性是,每个TODO Item可能有不同的类型,例如,公司的TODO Item,家里的TODO Item。或者,我们可能把TODO Item分配给不同的人,因此我们可以自定义TODO keywords以表示一个TODO Item的不同类型。

(setq org-todo-keywords '((type "Fred" "Sara" "Lucy" "|" "DONE")))

有的时候我们可能对不同的TODO Item有不同的状态,例如,交手机费这类简单的事情只有TODO和DONE两种状态,但是对于解决一个程序的bug可能有REPORT, BUG, KNOWNCAUSE, FIXED等状态。这样我们需要定义不同的状态子集(subset):

(setq org-todo-keywords
      '((sequence "TODO" "|" "DONE")
        (sequence "REPORT" "BUG" "KNOWNCAUSE" "|" "FIXED")
        (sequence "|" "CANCELED"))) 

C-S-Right/Left可以从一个子集跳转到另一个子集,而S-RIGHT/LEFT会在所有状态之间遍历。

我们还可以用快捷键来迅速切换一个TODO Item的状态。

(setq org-todo-keywords
      '((sequence "TODO(t)" "|" "DONE(d)")
        (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
        (sequence "|" "CANCELED(c)")))  

上面说的都是全局的设置,我们也可以针对一个文件进行设置,如:

#+TODO: TODO FEEDBACK VERIFY | DONE CANCELED
(这里也可以用 #+SEQ_TODO,和#+TODO效果是一样的)
对于类型的设置:
#+TYP_TODO: Fred Sara Lucy Mike | DONE
对于多个子集的设置:
#+TODO: TODO | DONE
#+TODO: REPORT BUG KNOWNCAUSE | FIXED
#+TODO: | CANCELED

进度记录

最基本的就是记录当一个Item被标记为DONE时的时间戳了,另外,在一个Item完成后,可能会想要写点心得或者备注什么的,可以用如下配置实现:

(setq org-log-done 'time)
(setq org-log-done 'note)

Org Mode还能记录每个状态改变的时间,但恐怕不是所有人都需要这么精细的控制了。

把项目拆分成子项目

很简单,高一级的TODO下所有的低级TODO就是它的子项目,在各级TODO的标题的任意位置插入[/] 或者[%]即会根据其子项目的完成情况自动更新进度。

如果想要当所有子项目都标记为Done的时候,父项目也被标记为Done,可以在配置中添加如下设置:

(defun org-summary-todo (n-done n-not-done)
  "Swith entry to DONE when all subentries are done, to TODO otherwise."
  (let (org-log-done org-log-states)   ; turn off logging.
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

另一种办法是,如果有大量的字项目,则可以使用check box来标记。

每一个item前只要加上一个[ ] 就变成了check box item, 这在TODO List Item里也是一样的。在TODO List里,C-c C-c可以切换check box item的选中与未选中的状态。

** TODO Test [1/3]
- [X] Only a test
- [ ] It's another test    
- [ ] Third test

和Check Box Item相关的快捷键: C-c C-c 切换Check Box的状态 M-S-Ret 插入新的check box item.

标签

 

标签的基本知识

其实标签并不仅限于TODO Item,而是可以用在任何标题上。标签可以由所有字母,数字,@构成,标签必须有一个前导的:并且还必须有一个后继的:,比如,看起来是这样的,‘:work:’,多个标签可以用:分开,例如:‘:work:urgent:’。

需要用到的标签可以预先在配置文件里定义,和增加TODO Item的状态的方法一样,唯一的区别是这里用到的变量是org-tag-faces.

Tag是有继承性的,也就是说,假如一级标题的tag有work,则该级标题以下的所有子标题无论是否显式注明,都自动具有work的标签。例如:

* Meeting with sb.               :work:
** Summary with sb1.            :boss:notes:
*** TODO Prepare slides for him  :action:

这里,Summary with sb1的标签就是work, boss, notes,最后一项的标签就是work, boss, notes, action.

设置标签

首先当然可以手动在标题后设置标签,键入:后,M-Tab自动提供标签的补齐。

也可以用命令插入标签:

C-c C-q 为当前标题插入标签 C-c C-c 当光标在某标题栏时,为该标题插入标签(此时和C-c C-q功能一样)

默认情况下,org会动态维护一个Tag列表,即当前输入的标签若不在列表中,则自动加入列表以供下次补齐使用。

另一种方式是在配置文件中配置变量org-tag-alist全局性地预设一些tag,然后在org文件中设置:

#+TAGS: @work @home @tennisclub
#+TAGS: laptop car pc sailboat

这样,在该文件中只能使用个以上定义的7个标签。

如果想既使用预设的标签,又动态增加,则必须在文件中增加一个空的TAGS option.

#+TAGS:

在org中我们还可以给tag定义快捷键。对于全局的定义可以写在配置文件中:

(setq org-tag-alist '(("@work" . ?w) ("@home" . ?h) ("laptop" . ?l)))

这样要标记@work,@home,laptop就只需要按w, h, l键即可。如果不是全局的定义,即指针对一个文件有效,我们可以在文件中定义,其中,\n表示换行,等效于分开写在两个TAGS里。

#+TAGS: @work(w) @home(h) @tennisclub(t) \n laptop(l) pc(p)

假如我们要让@work, @home, @tennisclub变成互斥的,则可以定义:

#+TAGS: { @work(w) @home(h) @tennisclub(t) } laptop(l) pc(p)

这也可以在配置文件中定义,但需要用dummy tag :startgroup和:endgroup包围起来。

(setq org-tag-alist '((:startgroup . nil)
                      ("@work . ?w) ("@home" . ?h)
                      ("@tennisclub" . ?t)
                      (:endgroup . nil)
                      ("laptop" . ?l) ("pc" . ?p)))

C-c \ 可以用来查找某个tag下的所有项目 C-c / m 建立符合某tag的sparse tree C-c a m 从所有agenda file里建立符合某tag的全局性列表 C-c a M 同上,但只检查TODO item或org-tags-match-list-sublevels里指定要检查的项目。

时间和日期

在TODO Item上我们通常还需要标记时间和日期,这里就包含了:

  • 普通的时间和日期,比如该TODO ITEM的开始时间,例如下午三点开会等。
<2010-09-18 Sat 15:00>
  • 每天,每周,每月,每年都重复的时间和日期,比如每周去一次健身房之类的。
* pick up Sam at school <2007-05-16 Wed 12:30 +1w>
  • 表示一段时间
* 在上海开会 <2004-08-23 Mon>--<2004-08-26 Thu>
  • 仅仅表示一段时间而已,不需要在其他模式中引用。(Inactive Timestamp)
* 今天吃饭吃到苍蝇了 [2010-09-28 Tue]

C-c > 打开Emacs Calendar C-c < 把Emacs Calendar光标所在的日期插入到org mode光标所在处。 C-c C-y 当光标放在time range上时,计算两个timestamp之间的天数。 C-c ! 用来添加一个inactive 的timestamp.

在我的配置文件中,我把C-c t 定义给了“插入一个timestamp”。

对于TODO item,我们常常需要指定什么时候开始这项工作,什么时候是截止日期,在org中分别是SCHEDULED 和DEADLINE.

*** TODO write article about the Earth for the Guide
The editor in charge is [[bbdb:Ford Prefect]]
DEADLINE: <2004-02-29 Sun>

*** TODO Call Trillian for a date on New Years Eve.
SCHEDULED: <2004-12-25 Sat>

C-c C-d 插入一个Deadline C-c C-s 插入一个Schedule C-c / d 建立一个包含所有deadline的TODO项目的sparse tree C-c / b 建立一个包含deadline在指定日期前的TODO项目的sparse tree C-c / a 建立一个包含deadline在指定日期后的TODO项目的sparse tree

我的TODO LIST解决方案

我的TODO List方案基本上是在常规的待办事项上加上一些的GTD思想。

作为一个IT民工,我的生活比较简单,我不在家就在公司,两者都不在就基本在路上。因此我的TODO 项目的地点基本就是这三项。另外,有些项目需要用到电脑,有些不需要,有些都可以(比如看某本既有电子版又有纸版的书)。

下面列出了我用到的标签,TODO Item的中间状态很简单,就是TODO:未开始;INPROGRESS:进行中;和DONE:已完成。根据GTD的思想,有些TODO Item是2分钟内即可完成的,我把它们标记为immediately,立刻完成。wait是需要等待其他人或其他资源的;action是随时可以开始做的项目。

#+TODO: TODO INPROGRESS | DONE
#+TAGS: @office(o) @home(h) @traffic(t)
#+TAGS: computer(c) nocomputer(n) either(e)
#+TAGS: immediately(i) wait(w) action(a)

根据简化的GTD思想,TODO的项目分为Idea List; Task List; Project List; Someday/Maybe List; Reminder这五项。Reminder这一项和前四个关系不大,我用来记录一些备忘录,诸如下周末前要还房贷,某月某日是结婚纪念日之类的。这类提醒很多人喜欢记在Agenda里头,或者日历里。我更愿意直接写成条目放在Reminder里,每天看一下,这主要是因为我需要记住的事情不算太多,不需要用到Agenda。

每天抽两个时间做一下所谓的Mind Sweep,把所有想到可能要做的事情都扔进Idea List里头。每天抽一个时间整理一下Idea List,把不可能实现的直接删掉,把将来可能会做的,但现在肯定不做的扔到Someday/Maybe List中。Task List用于放一步即可完成的项目,Project List用于放比较复杂的项目,可能需要细分为许多个TODO Item,或者可能需要合作才能完成。

* Idea List:
* Task List:
* Project List:
* Someday/Maybe List:
* Reminder:  

这样,举个例子,每天到公司或者到家开始工作的时候,首先要做的是三步:

  • 按照GTD的说法是清空大脑,把脑子里的所有想法都列出来,然后放到Idea List。
  • 用C-c \ 查询标签为@office或者@home 的未完成项目
  • 浏览一下Reminder 里有没有和今天相关的事情。

然后,在每天结束工作的时候清理一下 Idea List。

ORG Mode我主要的用处就是拿来记笔记和做Todo List,似乎它还有很多其他功能,等我需要的时候再去研究吧。

Footnotes:

1 12345

2 67890

Author: Le Cao

Date: 2010-10-14 00:08:47 CST

HTML generated by org-mode TAG=7.01g in emacs 23

 

        https://wiki.freebsdchina.org/doc/r/reference

利用 Emacs 的 org-mode 管理文献

俗话说,“好记性不如烂笔头”。文献管理,不仅对科研工作者,对普通的用户也是必需的。看过的文献,写写心得做做笔记,以后写文章旁征博引的时候就不至于心乱如麻。

已有一些开源的文献管理的工具广受欢迎,如 JabRef、docear 等。一些常见的工具软件,读者可参阅 文献管理软件比较

这里,我介绍另外一种简便的方法:利用 Emacs 的 org-mode 管理文献。原因有二:(1)Emacs 是可以使用一生的编辑器;(2)org-mode是做笔记的强大工具。

本着简单为美,高效为目的的原则,充分利用已有资源,本 wiki 的方法(源自 http://tincman.wordpress.com/2011/01/04/research-paper-management-with-emacs-org-mode-and-reftex/)能够出色地完成文献管理的任务。

利用 Google Scholar 导出 bibtex 文件

写科技文章,TeX 排版工具是必须掌握的。现在的国际会议和期刊,哪个不要求 TeX 排版?我们假定读者熟悉 TeX 排版,了解最简单的 Emacs 使用方法。

在 TeX 中,文献的索引来自独立文件 *.bib,它的格式必须通过 bibtex 的编译。文献管理软件 RefDB介绍了如何从 RIS 格式转化为 bib 格式。RefDB 是图书馆时代的产物,随着 Google Scholar 的普及,我们有更便捷的文献管理方法。

Google Scholar 提供了搜索文献和导出其 bibtex 描述的强大功能,它在某种程度上替代了图书馆检索和某些专业数据库检索(如 PubMed 等),让更多的人能够方便地检索到文献。在知识共享的年代,我认为,Google Scholar 是 Google 公司最伟大的产品之一。

文献管理有哪些功能?

一个文献管理软件,必须具备以下几项功能。

  1. bibtex 格式
  2. 文章标题、作者、期刊名等关键词搜索
  3. 链接到本地保存的文章(一般为 PDF 格式)
  4. 做笔记(写文章的时候,笔记很重要)
  5. 在 TeX 文档中利用 \cite{} 索引

准备工作

我当前使用的 Emacs 版本是 GNU Emacs 24.3.1(在更低的版本上我没有试验过),自带了 RefTeX。

需要额外安装的是 /usr/ports/deskutils/org-mode.el。

建立目录 ~/reference,里面建立目录 ~/reference/papers。另外,

IOU@~/reference$ touch notes.org
IOU@~/reference$ touch reference.bib

要求 notes.org 文件的开头是

# \bibliography{~/reference/reference.bib}

为了演示方便起见,reference.bib 里只有一篇文献

@Article{     blei2012probabilistic,
  title     = {Probabilistic topic models},
  author    = {Blei, David M},
  journal   = {Communications of the ACM},
  volume    = {55},
  number    = {4},
  pages     = {77--84},
  year      = {2012},
  publisher = {ACM}
}

该文章取名为 blei2012probabilistic.pdf,存放于 ~/reference/papers/ 下。

.emacs 里的一些设置

在 $HOME/.emacs 文件里,添加以下设置。

;; 定义 org-mode-reftex-search
(defun org-mode-reftex-search ()
 ;; jump to the notes for the paper pointed to at from reftex search
 (interactive)
 (org-open-link-from-string (format "[[notes:%s]]" (reftex-citation t))))

(setq org-link-abbrev-alist
 '(("bib" . "~/reference/reference.bib::%s")
   ("notes" . "~/reference/org/notes.org::#%s")
   ("papers" . "~/reference/papers/%s.pdf")))
   
;; 当使用 org-mode 时,自动调 RefTeX
(defun org-mode-reftex-setup ()
  (load-library "reftex")
  (and (buffer-file-name) (file-exists-p (buffer-file-name))
       (progn
    ;; enable auto-revert-mode to update reftex when bibtex file changes on disk
    (global-auto-revert-mode t)
    (reftex-parse-all)
    ;; add a custom reftex cite format to insert links
    (reftex-set-cite-format
      '((?b . "[[bib:%l][%l-bib]]")
        (?c . "\\cite{%l}")
        (?n . "[[notes:%l][%l-notes]]")
        (?p . "[[papers:%l][%l-paper]]")
        (?t . "%t")
        (?h . "** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l-paper]]")))))
  (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
  ;; binding of  ”C-c (” to org-mode-reftex-search
  (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search))

(add-hook 'org-mode-hook 'org-mode-reftex-setup)

如何使用 notes.org 来管理文献

org-mode 是利用 Emacs 做笔记的强大工具,可以直接生成 html、TeX、PDF 等文档。

  • 用 emacs 打开 notes.org 文件,将光标放置于某空行,利用命令 “C-c )” 来建立文献索引入口,可以是 bibtex 的入口,也可以是 PDF 文件的入口,也可以是 \cite{}。
  • 命令 ”C-c (“ 可进行正则表达式搜索
  • 要打开入口,只需光标停留在入口上,键入 “C-c C-o” 命令即可。
  • 利用命令 “C-c \” 来搜索关键词。

效果图

 

 

        ............

 

 

      ........

 

 

        ...

 

 

          .....

posted @ 2013-10-18 15:25  陳聽溪  阅读(3741)  评论(0编辑  收藏  举报