初试org-mode
org-mode是Emacs自带的一个插件,可以进行任务管理。在网上看了介绍发现是一个基于纯文本任务管理,还挺有趣的。
安装
首先安装emacs:
sudo apt install emacs默认emacs很简陋,所以安装spacemacs,覆盖默认配置文件:
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
git clone https://github.com/syl20bnr/spacemacs %USERPROFILE%/AppData/Roaming/.emacs.d #Windowsspacemacs默认使用官网源,比较慢,这里改用镜像源。在.spacemacs的(defun dotspacemacs/user-init ()加入:
(setq configuration-layer-elpa-archives
'(("melpa-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
("org-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")
("gnu-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")))
)然后打开Emacs,Spacemacs会开始装一大堆插件,等到初始化完成即可。
完成后把.spacemacs的dotspacemacs-default-font改成指定字体。这里改成更纱黑体Sarasa Fixed SC,大小改成20。
配置
NOTE以下快捷键C指代Ctrl,M指代Alt,S指代Shift
建一个agenda.el文件,在.spacemacs的(defun dotspacemacs/user-init ()加入:
(load-file "~/agenda.el")在agenda.el文件里加入配置:
(setq org-agenda-files '("/media/leilei/Data/Notes/org-mode"))
(global-set-key (kbd "C-c a") 'org-agenda)
(setq org-default-notes-file "/media/leilei/Data/Notes/org-mode/todo.org")
(global-set-key (kbd "C-c c") 'org-capture)
(setq org-log-done 'time)这里把agenda的位置设为**/media/leilei/Data/Notes/org-mode**,默认的org文件为**/media/leilei/Data/Notes/org-mode/todo.org**,绑定了两个快捷键。这里绑定C-c a打开agenda页面,C-c c为新建页面。
此时打开Emacs按C-c c再按t就能新建一个任务,按C-c C-s可以添加计划日期,时间,输入按C-c a再按t能管理任务。
(setq org-log-done 'time)可以让任务状态变成DONE的时候添加一个CLOSED属性,记录完成的时间。
日期重复
如果想要让计划日期可以重复,将SCHEDULED:<日期>改成SCHEDULED:<日期 +1d>就可以每天重复,+1w则是每周重复。
这种重复默认不会更新时间戳,如果要更新时间戳,可以改成++1d 或.+1d。.+1d会将时间戳更新到完成时间一天后,++1d会将时间戳更新到设定时间一天后。
还有一个org-habit插件可以在重复任务上显示热力图,在agenda.el里加入:
(require 'org-habit)然后在一个任务上输入C-c C-x p,设置STYLE:为habit,就可以显示热力图了。注意热力图只会在今天显示,完成就会消失。
自定义模板
org-capture默认只有一个选项Task模板,不过这个模板是可以自定义的,参考以下:
(setq org-capture-templates
'(("t" "Task" entry (file+headline org-default-notes-file "Tasks")
"* TODO %?\n %i\n %a")
("s" "Study" entry (file+headline org-default-notes-file "Study")
"* TODO %?\n %i\n %a")
))配置Diary
Diary是Emacs里一个实用的功能,可以在日历里显示节日,日出日落时间等。org-agenda支持整合Diary,在agenda.el里添加
(setq org-agenda-include-diary t)可以将org-agenda与Diary整合。
然后配置Diary显示日出,日落时间,首先配置经纬度:
(setq calendar-latitude +31.1)
(setq calendar-longitude +121.4)然后添加:
(defun diary-sunrise ()
(let ((dss (diary-sunrise-sunset)))
(with-temp-buffer
(insert dss)
(goto-char (point-min))
(while (re-search-forward " ([^)]*)" nil t)
(replace-match "" nil nil))
(goto-char (point-min))
(search-forward ",")
(buffer-substring (point-min) (match-beginning 0)))))
(defun diary-sunset ()
(let ((dss (diary-sunrise-sunset))
start end)
(with-temp-buffer
(insert dss)
(goto-char (point-min))
(while (re-search-forward " ([^)]*)" nil t)
(replace-match "" nil nil))
(goto-char (point-min))
(search-forward ", ")
(setq start (match-end 0))
(search-forward " at")
(setq end (match-beginning 0))
(goto-char start)
(capitalize-word 1)
(buffer-substring start end))))接下来在.emacs.d/diary里添加:
%%(diary-sunrise)
%%(diary-sunset)然后打开org-agenda就可以发现可以显示日出日落时间了
RSS
org-mode自带org-feed.el收取RSS功能,可以把rss收集到一个org文件里。
在agenda.el里加入:
(setq org-feed-alist
'(("Sspai"
"https://sspai.com/feed"
"D:/Notes/org-mode/feed.org" "少数派")))
这里用的是少数派的RSS源。输入M-x再输入org-feed-update,选择订阅源,Emacs就会为订阅源创建org层级,在org文件里就可以查看了。
归档
在一个org文件里输入C-c C-x C-a就可以把org文件的层级归档,内容会移至一个以_archive重新命名的文件里,可以配合RSS使用。
如果不想让归档单独存一个文件,可以在org层级输入C-c C-x a添加:ARCHIVED:属性,此时这个层级显示为灰色,不能按<<.kbd TAB>>展开。
还有一种归档是在当前层级创建一个Archive目录,再将要归档的条目移至Archive条目底下。这个归档方法可以处理已完成的任务,快捷键为C-c C-x A
生成clocktable
在org文件里按C-c C-x x再选择clocktable就可以生成一个分析表格,可以分析当前文件计时统计。如果要包括归档文件,可以将:scope agenda改成:scope agenda-with-archives。如果只要显示今天,可以添加:block today。更新在顶部按C-c C-c即可。
基本操作
org页面
| 操作 | 快捷键 |
|---|---|
| 折叠层级 | TAB |
| 关闭窗口 | C-x 0 |
| 显示帮助 | C-h |
| 打开链接 | C-c C-o |
| org-feed更新 | C-c C-x g |
| 计算计时时间 | C-c C-x C-d |
| 归档 | C-c C-x C-a |
| 添加归档标签 | C-c C-x a |
| 设置属性 | C-c C-x p |
agenda页面:
| 操作 | 快捷键 |
|---|---|
| 添加标签(:tag1:tag2:) | C-c C-q |
| 调整优先级(默认有#A,#B,#C) | S UP/DOWN |
| 标记为完成 | C-c C-t |
Clock in(开始计时,记录会添加到属性:LOGBOOK:) | C-c C-x C-i |
| Clock out(停止计时) | C-c C-x C-o |
| 添加计划日期 | C-c C-s |
| 添加结束日期 | C-c C-d |
| Log mode | l |
| 跳转到今天 | . |
| 跳转到日历 | c |
| 列视图 | C-c C-x C-c |
| 导出 | C-x C-w |
总体来说org-mode的功能很强大,但是还是有不足的地方:移动端功能太少(Orgzly,beorg,mobileorg等)。而且Emacs是要靠键盘操作的,学习门槛很高,需要预先配置。
不过虽然在很多方面不完善,但org-mode作为Emacs的一个插件,在任务管理这个功能上已经是非常完善了,比如热力图功能,计时功能,表格分析功能,甚至是RSS,非常全面。
其他1
在日历里高亮节日:
(setq calendar-mark-holidays-flag t)之前在org-agenda里显示Diary的方法是这样:
(setq org-agenda-include-diary t)
;; diary
;; %%(diary-sunrise)
;; %%(diary-sunset)这样会拖慢org-agenda加载速度,所以推荐使用下面这种在org文件里配置的方法:
* Holidays
:PROPERTIES:
:CATEGORY: holiday
:VISIBILITY: folded
:END:
%%(org-calendar-holiday)
* Sun
:PROPERTIES:
:CATEGORY: sun
:VISIBILITY: folded
:END:
%%(diary-sunrise)
%%(diary-sunset)这样可以提升org-agenda的初始化速度。
Spacemacs配置
(defun dotspacemacs/init ()
(setq-default
;; ...
;; 显示列表
dotspacemacs-startup-lists '((recents . 5)
(agenda . 5)
(todos . 7)
)
;; underwater主题
dotspacemacs-themes '(underwater
spacemacs-dark
spacemacs-light)
;; ...
;; 启动时全屏
dotspacemacs-maximized-at-startup t
))参考
Footnotes
此部分内容合并自原文章“org-mode一些配置”(2026.5.23) ↩