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就可以堅持下來了。
如圖所示:

下面是我的一思考的總結:
- 我為何對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 Emacs, PKM, vim, vimwki. 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
作者: 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中加入下面的語句:
1 2 |
(setq org-todo-keywords '((sequence "TODO" "DOING" "HANGUP" "|" "DONE" "CANCEL"))) |
可以將 todo list 的狀態增加為五種:TODO,DOING,HANGUP,DONE,CANCEL。
注意,在 HANGUP 和 DONE 之間有一條豎線 “|”,在豎線之前的狀態和之后的狀態使用的是不同的face。
進一步的,我們還可以記錄切換到某一種狀態時的時間:
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已默認可以,不需要加)
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) |
http://emacser.com/org-mode.htm
Emacs org mode學習筆記

1 參考文獻
本文參考並引用了以下的文章的部分內容。
- Yu Peng的Emacs的Org Mode
- Emacs org Mode的官方參考文檔
2 用Org Mode做筆記
2.1 想法與配置
以前一直都用Emacs Wiki Mode記筆記,但wiki mode總有些奇奇怪怪的bug,並且已經不更新了,最近org mode 非常火爆,禁不住想試一下。
對於記筆記,我的打算很簡單,一個目錄用來裝所有的筆記,一個目錄用來存放publish成HTML格式的筆記。並且能夠自動生成索引文件。這樣就可以在索引文件里直接查找並跳轉到所有的筆記里。
Emacs ORG mode的基本配置如下:
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文件,我比較喜歡自己組織。
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上。
(global-set-key (kbd "<f8> p") 'org-publish) |
為了在org mode中使用auto-complete,我在auto-complete中增加了這樣的配置:
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可以在文檔尾部插入一個列表項或者標題。
- 第一級
- 第二級
- 第二級第一點
- 第三級
帶描述的列表效果是這樣的:
- 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]
接下來必須頂格寫這些腳注的內容了,這樣在文檔的末尾會自動生成腳注。C-c C-c可以在腳注的標記與內容之間切換。C-c C-x f可以在當前位置添加一個腳注。
[1] 12345 [fn:bla] 67890
- 結構化編輯的常用快捷方式
這里是Structure Editing的默認快捷方式:next/previous heading C-c C-n/p next/previous heading, same level C-c C-f/b backward to higher level heading C-c C-u jump to another place in document C-c C-j previous/next plain list item S-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 A B 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的中間狀態,這些狀態是順序的,通常是工作流中的不同狀態。1 2
(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):
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的狀態。
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完成后,可能會想要寫點心得或者備注什么的,可以用如下配置實現:
1 2
(setq org-log-done 'time) (setq org-log-done 'note)
Org Mode還能記錄每個狀態改變的時間,但恐怕不是所有人都需要這么精細的控制了。
- 把項目拆分成子項目
很簡單,高一級的TODO下所有的低級TODO就是它的子項目,在各級TODO的標題的任意位置插入[/] 或者[%]即會根據其子項目的完成情況自動更新進度。
如果想要當所有子項目都標記為Done的時候,父項目也被標記為Done,可以在配置中添加如下設置:
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定義快捷鍵。對於全局的定義可以寫在配置文件中:
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包圍起來。
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的記錄,為便於理解,添了不少廢話。Emacs用的是Windows版,所以都按Windows說鍵盤習慣和Emacs配置文件(init.el,在HOME目錄的.emacs.d子目錄下;據說其他系統是.emacs)。
Table of Contents
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 標題和基於標題的編輯
4.1 設定標題
對於傳統意義的標題,Org的設定非常簡單:在行首加星號,星號與標題文字之間至少有一個空格,星號的數量表示標題的級別,方法簡單明了。你不用為字體、行間距、縮進等設置而煩惱,專心做自己的事情。事實上標題是Org文檔句法中唯一不需要通過上下文關系就能確定的內容:一行文本是不是標題只需要看行首字符。例如:
* 一級標題 ** 二級標題 *** 三級標題 正文內容 * 其他一級標題
然而,為使標題適應更廣泛的應用(不僅僅是表明文檔的結構層次),Org對其進行了較復雜的定義。它的完整語法為:
STARS KEYWORD PRIORITY TITLE TAGS
其中:
STARS即星號,這是一個標題唯一必要的內容,其他(包括標題名稱)都可以省略。KEYRORD為TODO關鍵詞,大小寫敏感。PRIORITY為優先級選項,為#號加一個字符並用方括號括起來,如[#A]TITLE即為實際的標題文本TAGS為標簽。
下面是一個完整標題的例子:
** TODO [#2] 優先級為2的待辦事項 :@家庭作業:
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關鍵詞和優先級后標題的外觀如下:
在標題上使用 S-UP/DOWN 可以選擇和改變任務的優先級。
5.3 任務標簽
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文件,然后加入你的日程表文件列表,產生日程表時會這些事件。
############################################################################################
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-模式。
![]() |
|
| 原作者 | Carsten Dominik 等 |
|---|---|
| 開發者 | Bastien Guerry 等 |
| 穩定版本 | 8.0.3/ 2013年5月14日[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。
本文介紹最基本的編輯、格式化文本以及導出功能,后續再討論高級玩法。
Table of Contents
1 用大綱組織內容
盡管Org-mode的功能不斷豐富,現在已經可以記筆記,管理個人事務,制定項目計划以及很多其他的用途,但是最初和最基本的功能還是通過大綱(outline)的方式來編輯文檔。 而且,無論是筆記管理,任務管理還是項目計划的編寫,都是以對內容進行高效的組織(organization)為基礎的。
在編輯文檔,尤其是大型文檔的時候,對內容的組織就顯得尤為重要。經常需要在文檔中快速定位,只關注某一部分的內容, Word之類的編輯器,通過文檔結構圖來定位文檔位置,速度很慢,而且很多時候不能滿足編輯的需要。盡管Word也提供了“大綱視圖”,但是,唉……不說也罷, 如果那個功能真的好用,也就不需要Omni Outliner了。
Org-mode天然支持大綱視圖,通過在文檔中定義標題,可以方便的瀏覽每個小節,從而把握文檔的總體內容。 Org是基於Outline模式的,它提供了更靈活的編輯結構文件的命令。比如折疊文檔,針對大綱的編輯功能等,極其強大。
1.1 定義標題
要實現大綱,首先要定義標題。用emacs新建一個orgmode.org,輸入如下內容:
* org-mode ** 大綱 正在編寫大綱 ** 輕量級標記語言 * 可以導出其他格式 支持html,pdf等格式
注意:
- * 要位於每行的行首
- * 之后要有一個空格,然后再輸入標題
- 連續幾個*就表示是第幾級大綱,最多支持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)
- The attack of the Rohirrim
- 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提供了以下功能:
| KEYS | COMMENT |
|---|---|
| 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
Org version 7.8.08 with Emacs version 23
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-projects, blog, 生成的 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 學習筆記
Table of Contents
參考文獻與版權聲明:
用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
- 枚舉3,
有序的列表可以由'1.'或'1)'來組織。這里可以方便的使用Alt+左右方向鍵調整列表項的級別。M-Ret可以在當前位置插入一個列表項;C-Ret可以在文檔尾部插入一個列表項或者標題。
- 第一級
- 第二級
- 第二級第一點
- 第三級
帶描述的列表效果是這樣的:
- 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]
接下來必須頂格寫這些腳注的內容了,這樣在文檔的末尾會自動生成腳注。C-c C-c可以在腳注的標記與內容之間切換。C-c C-x f可以在當前位置添加一個腳注。
[1 ] 12345 [fn:bla ] 67890
- 結構化編輯的常用快捷方式
這里是Structure Editing的默認快捷方式:next/previous heading C-c C-n/p next/previous heading, same level C-c C-f/b backward to higher level heading C-c C-u jump to another place in document C-c C-j previous/next plain list item S-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用來指定在文檔內部引用該表格的標簽。 效果是:
C-c RET可以在光標所在表格內插入一行ABCD A B C D 這里是表格相關的常用快捷鍵:
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,似乎它還有很多其他功能,等我需要的時候再去研究吧。
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 公司最偉大的產品之一。
文獻管理有哪些功能?
一個文獻管理軟件,必須具備以下幾項功能。
-
bibtex 格式
-
文章標題、作者、期刊名等關鍵詞搜索
-
鏈接到本地保存的文章(一般為 PDF 格式)
-
做筆記(寫文章的時候,筆記很重要)
-
在 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 \” 來搜索關鍵詞。
效果圖
............
........
...
.....


