- 題目
org-mode 與工作流: 為何我離不開 emacs
- 簡介
如果你在路上抓到使用 Emacs 的人,問說為何繼續用 Emacs ? 十個有九個會說因為 Emacs 有 org-mode。 究竟 org-mode 有何魔力呢? 本次介紹延伸自講者於 2013 年在 COSCUP 的演講「Org-mode : Emacs 下的瑞士軍刀」,開頭會先介紹 org-mode,並帶自如何在 Emacs 下透過 org-mode 管理代辦事項、撰寫工作文件 … 等實務上的應用。
- 時間
COSCUP 2017 2017/08/07 16:20 ~ 16:40
在 2013 年我所講的 Org-mode Emacs 下的瑞士軍刀 個人感覺是把大部分的東西基本帶過,但是偏向 『文學編程』(Literate programming) 的形式。
(並且由於當時經驗不足,講的很趕)
這次希望可以針對以下幾點進行進一步的說明:
- 基本 org-mode 語法介紹 (3 分鐘)
- 時間管理 (org-clock-in, org-clock-out) (3 分鐘)
- Agenda (5 分鐘)
- Capture (3 分鐘)
- 文件輸出 (剩下時間)
注意到我只有 20 分鐘
的時間可以講,所以針對以上東西進行重點介紹。
這次著重在個人使用 org-mode 於工作上的經驗。
這是為了讓這場演講可以順利運作的 elisp 設定,我們在這邊預先設定好一些變數
這會讓本 DEMO 的範例可以順利運作的函式,請對其使用 C-c C-c
進行 eval
(setq org-directory (file-name-directory (buffer-file-name)))
(setq org-agenda-files (list org-directory))
(require 'find-lisp)
(setq org-agenda-files
(find-lisp-find-files org-directory "\.org$"))
(setq org-default-notes-file (concat org-directory "TODO.org"))
;; bind clock-in/clock-out to C-. and C-,
(global-set-key (kbd "C-x .") 'org-clock-in)
(global-set-key (kbd "C-x ,") 'org-clock-out)
(org-indent-mode t)
(setq org-use-speed-commands t)
此次 DEMO 採用 org-tree-slide 進行線上 DEMO 來展示
(package-install 'org-tree-slide)
(defun my/slide-show-start ()
"Start this slideshow."
(interactive)
;; 使用 simple profile
(org-tree-slide-simple-profile)
;; 跳過 level 3 標題
(setq org-tree-slide-skip-outline-level 3)
;; 啟動 slide
(org-tree-slide-mode))
(defun my/slide-show-stop ()
"Stop this slideshow."
(interactive)
;; 關閉 slide
(org-tree-slide-mode -1))
;; 綁到 C-x [
(global-set-key (kbd "C-x [") 'my/slide-show-start)
;; 綁到 C-x ]
(global-set-key (kbd "C-x ]") 'my/slide-show-stop)
;; next/previous
(global-set-key (kbd "C-M-.") 'org-tree-slide-move-next-tree)
(global-set-key (kbd "C-M-,") 'org-tree-slide-move-previous-tree)
另外,為了讓大家可以看到我按了哪些按鍵,我使用 showkey 搭配以下命令來顯示當下按鍵資訊在 **KEYS** 緩衝區
(package-install 'showkey)
(defun my/quick-show-key ()
"Create a window below and launch showkey mode"
(interactive)
(require 'showkey)
(showkey-log-mode t)
(delete-other-windows)
(split-window-vertically (floor (* 0.88 (window-height))))
(other-window 1)
(switch-to-buffer (get-buffer "*KEYS*"))
(other-window 1))
;; 綁到 C-x \
(global-set-key (kbd "C-x \\") 'my/quick-show-key)
本場次演講現場展示的是 org-mode 9.09 版本,目前 Emacs 預設的 org-mode 版本則是 8.x, 因此為了更好的體驗最好升級至最新的版本。
(如果你是 spacemacs 的用戶,請參考 Org layer 的說明。)
一般的 Emacs 用戶,則請加入以下程式到你的 ~/.emacs.d
去,這會幫你下載最新的 org-mode
(add-to-list 'package-archives
'("org" . "http://orgmode.org/elpa/") t)
然後更新套件資訊
M-x package-refresh-contents
接下來使用以下方式安裝最新的 org-mode (9.x)
(package-install 'org-plus-contrib)
org-mode 與工作流: 為何我離不開 emacs
李彥瑾 <coldnew>
COSCUP 2017.08.06 16:20 ~ 16:40 / 20 min
:講稿: 我在網路上習慣使用的 ID 是 coldnew。使用 Emacs 自 2006 年至今,並有維護一些 emacs-lisp 套件。
如果您對我的專案有興趣,可以到我的 GitHub 或是 Blog 看看 ^_^
- User id:
coldnew
- 自 2006 用 Emacs 到現在
- 我的 Emacs-Lisp 專案列表:
- org-ioslide + linum-ace [deprecated]
- pangu-spacing + org-remark [deprecated]
- ac-octave + org-pelican [deprecated]
- linum-relative + org-hexo [deprecated]
- qml-mode + emacs-blogit [deprecated]
- left-pad.el + org-html5slide [deprecated]
- eshell-autojump + evil-elscreen [deprecated]
- 本質是 Embedded System RD
- 混跡於台灣各 LISP 群組: EmacsTW、ClojureTW
- GitHub: https://github.com/coldnew
- Blog: https://coldnew.github.io
COSCUP 2013
by coldnew
org-mode 是類似 Markdown 的樣板語言,可以用來寫寫文件。
此外,org-mode 還適合:
- 生成 HTML、PDF、Markdown 等檔案
- 管理待辦事項
- 專案規劃
- 時間管理
- 財務管理
而這些事情,只要用 純文字
就可以辦到。
org-mode 其實就是 大綱模式
的衍生版,一個文章是這樣組成的
* 關於 org-mode
介紹 org-mode 的各種用途。
** 時間管理
如何使用 org-mode 來進行時間管理。
** 產生文件檔
*** 產生 HTML 檔案
*** 產生 Latex 檔案
按鍵 | 用途 |
---|---|
TAB | 折疊/打開標題和其內容 |
S-TAB | 折疊/打開標題和其內容 |
M-RET | 插入同一級標題 |
M-Left/Right | 將當前標題升級/降級 (減少/增加星星) |
M-S-right/M-S-left | 切換包含子項目的標題等級 |
C-* | 將游標所在的那一行變為標題 |
如果你有在你的 ~/.emacs.d
設定好以下項目,則可以使用 org speed commands 去瀏覽你的文件
(setq org-use-speed-commands t)
快速命令:
將你的游標放置到標題欄 (headline) 的第一個字元的位置, 確定上面的命令設定好後,你就可以使用下面的命令來快速瀏覽你的文件
n 下一個標題欄 (headline) p 上一個標題欄 (headline) u 回到父節點 c 折疊/展開當前標題欄
j 快速移動 這個命令會彈出一個選單,看你要根據怎樣的狀況進行移動 ? 看還有什麼命令可以用
將游標放置在標題欄 (headline) 並使用 M-right
M-left
來切換標題欄的等級 (level)
你也可以使用 M-S-right
或 M-S-left
去切換包含子項目的標題欄等級
當有在 ~/.emacs.d
設定好以下命令的時候, 我們也可以用 org speed commands 去調整標題欄的等級
(setq org-use-speed-commands t)
快速命令:
r 將當前標題欄降級 (向右移動) R 將當前標題欄與子項目降級 (向右移動) l 將當前標題欄升級 (向左移動) L 將當前標題欄與子項目升級 (向右移動)
將游標放置在標題欄 (headline) 並使用 M-up
M-down
來切換標題欄的順序 (order)
快速命令:
U 將當前節點往上搬 (包含子項目) D 將當前節點往下搬 (包含子項目)
列表類型 | 表達符號或方法 |
---|---|
無序列表 | - 、 + 、 * |
有序列表 | 1. 或者 1) 開頭 |
描述列表 | 使用 :: 將描述內容與項目分開 |
- 這是項目一
- 項目的定義
- 這是項目二
- 項目二的子項目一
- 項目二的子項目二
- 條列式 1
- 條列式 2
- 子項目 1
- 子項目 2
:講稿: org-mode 下對文字進行 markup 的方式和 Markdown 有點不一樣
粗體 斜體
刪除線 H_2 O
E=mc^2 等寬字
下劃線
被格式化的字詞,會根據要輸出的後端 (Latex、HTML) 等進行相對應的轉換
輸入 <s 後按下 TAB 展開 #+BEGIN_SRC … #END_SRC 區塊,你可以透過 C-’ 切換到該程式碼的 major-mode 後再切回來
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello, Org-mode!\n");
return 0;
}
<e 按下 TAB 產生 Example Block
Example block 就不會對裡面的內容作而外的格式化
org-mode 支援很多種不同的連結形式,可以用 M-x org-insert-link
直接插入連結
https://www.google.com file:/home/coldnew/test.png news:comp.emacs irc:/irc.com/#emacs mailto:[email protected] file:assets/do_mount.sh::5 [[file:assets/do_mount.sh][mount the file]]
你也可以使用 C-c %
(org-mark-ring-push) 暫存當前你移動的位置然後移動到別處
要切回來的時候用 C-c &
(org-mark-ring-goto) 就可以切到上一個暫存的位置
也可以用 M-x org-store-link
將當前位置存起來,再使用 M-x org-insert-link
插入連結
- 使用
|
作為表格分隔 - 按下
TAB
可以再表格內切換 - 輸入
|-
再按下TAB
可以產生分隔線
Name | Phone | Age |
---|---|---|
Peter | 1234 | 123 |
Anna | 4321 | 25 |
org-mode 的表格也具有試算表的功能,游標移動到 #+TBLFM: 後,使用 C-c C-c
看看
名稱 | 單價 (NT) | 數量 | 花費 |
---|---|---|---|
蘋果 | 5.0 | 3.0 | |
香蕉 | 20.0 | 10.0 | |
鳳梨 | 100.0 | 2.0 | |
總價 |
對大綱使用 C-c C-t
選擇或切換 TODO/DONE 狀態
(或是使用 S-<right>
切換狀態)
可以用 M-S-return
(org-insert-todo-heading) 快速增加新的欄位
使用 C-c C-c
勾選/取消 項目
- [ ] task 1
- [ ] task 2
- [ ] task 3
可以對項目使用 C-c C-c
加入標籤
(標籤具有繼承性,子項目會具有父項目的標籤屬性)
* 工作項目 :work:
** 專案 A :prjA:
*** TODO issue #1234 :issue:
:講稿: 當我們有待辦事項後,也許會希望知道這件事情的處理時間,這時候就可以透過 org-mode 的 clocking commands 來進行處理。
(建議將以下命令綁成全域命令,這樣在不是 org-mode 下也可以用)
按鍵 | 命令 | 用途 |
---|---|---|
C-c C-x C-i | org-clock-in | 在當前項目開始計時 |
C-c C-x C-o | org-clock-out | 結束當前的計時 |
C-c C-x C-q | org-clock-cancel | 取消當前的計時 |
C-c C-x C-d | org-clock-display | 顯示整體計時結果 |
C-c C-x C-r | org-clock-report | 顯示報表 |
- 只用來紀錄
工作時間
- 在處理某項目時開始計時,停止處理的話暫停他
- 在 Agenda view 上移動到項移動到項目後
- 按下 I 開始計時
- 按下 O 結束計時
:講稿:
使用 C-c C-s
指定任務的時間表 (schedule)
使用 C-c C-d
指定任務的截止日期 (deadline)
* 某某任務
DEADLINE: <2017-08-20 Sun> SCHEDULED: <2017-08-09 Wed>
:講稿:
使用 C-c a < a
來查看當前檔案的 agenda (排程) 資訊
在 agenda-view 裡面:
t 可以將標記為 TODO
的項目變成 DONE
g 刷新 agenda-view
v 選擇觀看 日/星期/月 或者其他狀況的資訊
(這邊假設我們要放入 Agenda-View 的檔案在 ~/Dropbox/Org/ 裡面)
在你的 ~/.emacs.d
加入以下命令
;; 預設的 org-mode 檔案位置
(setq org-directory "~/Dropbox/Org")
;; 會加入 Agenda-View 的檔案
(setq org-agenda-files
(list "~/Dropbox/Org/Work.org"
"~/Dropbox/Org/Life.org"))
好了後執行 C-c aa
進去 Agenda-View 看看
使用 C-c a
進入到 Agenda 選單:
a 顯示當日或是本週的任務排程 (agenda) L 顯示目前緩衝區的任務線 t 顯示所有的代辦事項 (TODO) T 顯示特定類型的待辦事項 (TODO, DONE … etc) 選一 m 顯示有符合標籤 (tag) 的事項 M 顯示有符合標籤 (tag) 的代辦 (TODO) 事項 s 根據搜索結果顯示符合的事項
http://orgmode.org/worg/org-tutorials/org-custom-agenda-commands.html(setq org-agenda-custom-commands
'(("w" . "工作任務")
("wa" "特急件" tags-todo "work+PRIORITY=\"A\"")
("wb" "一般件" tags-todo "work+PRIORITY=\"B\"") ; <= 預設優先權是 B
("wc" "慢慢來" tags-todo "work+PRIORITY=\"C\"")
("l" "待處理書籤" tags-todo "link"))) ; <= 後面講 Capture 會提到
如果習慣用月曆軟體來看排程的話,在 Emacs 下有一套 emacs-calfw 可以在 Emacs 下顯示月曆
我們首先安裝支援 org-mode 的版本
(package-install 'calfw-org)
接著就可以用以下命令召喚他出來 (在 calfw 裡面,輸入 D 切換到當天檢視, M 切換回月檢視)
(require 'calfw-org)
(cfw:open-org-calendar)
- 當你正在作某件事,比如正在 live demo
- 突然電話響了, 是某個大人物打過來的所以不能掛斷
- 你希望紀錄這份對話,但是又不想影響到現在正在做的工作
- C-c c (org-capture) 來紀錄這件事
- 選擇樣板,將你要紀錄的東西寫下來
C-c C-c
離開回去工作
;; 預設將 Capture 的資訊存到這個檔案內
(setq org-default-notes-file "~/Dropbox/Org/TODO.org")
(setq org-capture-templates
'(("t" "TODO" entry (file+headline "" "Tasks") "* TODO %?\n %i\n")
("n" "NOTE" entry (file+headline "" "Tasks") "* NOTE %?\n %i\n %a")
("l" "Links" entry (file+headline "" "Links") "* TODO %? :link:\nSCHEDULED: <%<%Y-%m-%d %a>>\n %i\n %a")))
(setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/gtd.org" "Tasks")
"* TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/journal.org")
"* %?\nEntered on %U\n %i\n %a")))
講到這邊,大約 15 分鐘了
。COSCUP 的傳統就是演講超過 15 分鐘,就要放隻貓緩和氣氛,所以我放個 Nyan Cat 在 Emacs 上。
(本場次主要使用 Emacs 直接進行演講 -> live coding)
你可以使用以下方式安裝 zone-nyan (對下面 src-block 使用 C-c C-c
進行 evaluate)
(package-install 'zone-nyan)
然後我們就可以這樣叫出他來 (對下面 src-block 使用 C-c C-c
進行 evaluate)
(require 'zone-nyan)
;; play sound by `mpv'
(setq zone-nyan-bg-music-program "mpv"
zone-nyan-bg-music-args
`("-loop" "0" ,(expand-file-name (concat org-directory "assets/nyan.mp3"))))
(zone-nyan-preview)
我們可以將 org-mode 轉換成 Markdown、PDF、HTML …etc。
參考範例:
使用 M-x org-latex-export-to-pdf
轉換成 PDF
在 ~/.emacs.d
裡面要加入以下設置
;; This buffer is for text that is not saved, and for Lisp evaluation.
;; To create a file, visit it with <open> and enter text in its buffer.
(require 'ox-latex)
(setq org-latex-pdf-process
(if (executable-find "latexmk")
'("latexmk -pdflatex=xelatex -pdf -silent --shell-escape -f %f")
'("xelatex -interaction nonstopmode --shell-escape %f"
"xelatex -interaction nonstopmode --shell-escape %f")))
;; To use this, add following to your org-mode file
;;
;; #+LaTeX_CLASS: coscup2017-article
;;
(add-to-list 'org-latex-classes
'("coscup2017-article"
"\\documentclass[12pt,a4paper]{article}
\\usepackage[T1]{fontenc}
\\usepackage{fontspec}
\\usepackage{xeCJK}
\\setCJKmainfont{Hiragino Sans GB W3}
\\XeTeXlinebreaklocale \"zh\"
\\XeTeXlinebreakskip = 0pt plus 1pt
\\usepackage{graphicx}
\\usepackage{tikz}
\\usepackage[bookmarks=true,colorlinks,urlcolor=blue]{hyperref}
\\defaultfontfeatures{Mapping=tex-text}
\\setmonofont[Scale=0.8]{Monaco}
\\usepackage{geometry}
\\usepackage{minted}
\\usemintedstyle{emacs}
\\geometry{a4paper, textwidth=6.5in, textheight=8in,
marginparsep=10pt, marginparwidth=.6in}
\\pagestyle{plain}
\\linespread{1.5}
\\title{}
[NO-DEFAULT-PACKAGES]
[NO-PACKAGES]"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")
))
(add-to-list 'org-latex-packages-alist '("" "minted"))
(setq org-latex-listings 'minted)
(setq org-latex-minted-options
'(("frame" "lines")
("fontsize" "\\scriptsize")
("linenos" "true")))
Info.js 是可以將 org-mode 文檔變成像是 HTML 版本的 Info 文件的工具 (內建在 org-mode 中)
在 org-mode 檔案前面加上以下東西後,用 M-x org-html-export-to-html
輸出成 HTML
#+INFOJS_OPT: view:info toc:nil
http://orgmode.org/worg/code/org-info-js/index.html
org-html-themes 整合了兩種不錯的 HTML 版本的 org-mode 主題,具體請參見以下連結
https://github.com/fniessen/org-html-themes
我使用 Hexo 搭配自己維護的 hexo-renderer-org (fork) 來撰寫 blog 以及工作日誌
相關範例請見: https://coldnew.github.io/hexo-org-example/
本場次演講的範例檔案可以在以下位置下載:
https://github.com/coldnew/COSCUP2017_org-mode
若對 org-mode / Emacs 有興趣或有問題想問的,歡迎來 irc/telegram 和我們討論
具體邀請連結請見 EmacsTW 網站
這邊整理我看過覺得不錯的關於 org-mode 的資訊連結。