使用org-habit跟踪习惯



说明

org-habit作为org提供的模块之一,可以在时间轴上显示习惯的保持频率。

如:遛弯。

TODO标题如下:

* TODO 遛弯 SCHEDULED: <2026-08-25 周二 .+1d/2d> :PROPERTIES: :STYLE: habit :LAST_REPEAT: [2026-08-24 周一 06:18] :END: :LOGBOOK: - State "DONE" from "TODO" [2026-08-24 周一 06:18] - State "DONE" from "TODO" [2026-08-23 周日 05:49] - State "DONE" from "TODO" [2026-08-22 周六 05:49] - State "DONE" from "TODO" [2026-08-20 周四 03:55] - State "DONE" from "TODO" [2026-08-18 周二 03:55] - State "DONE" from "TODO" [2026-08-13 周四 03:55] - State "DONE" from "TODO" [2026-08-12 周三 03:55] - State "TODO" from [2026-08-11 周二 01:33] :END:

输出如下

graph


使能org-habit

[orgmode]5.3.3 Tracking your habits

使用内置org。

elisp
        1(use-package org
2  :config
3  (add-to-list 'org-modules 'org-habit)
4  (require 'org-habit)
5  )
      

验证

elisp
        1(featurep 'org-habit)
      

org-habit配置


将记录写在LOGBOOK区域

elisp
        1(setq org-log-into-drawer t)
      

记录插入TODO标题时间

  1. [C-c C-t t]使标题状态变为TODO;进入TODO状态自动记录时间戳
  2. [C-c C-t d]使标题状态变为DONE;进入DONE状态自动记录时间戳;对习惯更新[LAST_REPEAT]
elisp
        1(setq org-todo-keywords '((sequence "TODO(t!)" "|" "DONE(d!)")))
2(setq org-treat-insert-todo-heading-as-state-change t)
      

设置图表宽度

elisp
        1(setq org-habit-graph-column 40)
      

图表涵盖天数范围

elisp
        1;; 从左到右
2(setq org-habit-preceding-days 20) ;; 今天之前,过去天数
3(setq org-habit-following-days 20) ;; 今天在内,未来天数
      

今天完成习惯后,是否显示

设置为不再显示(TODO标题永远为TODO状态,含歧义)。

elisp
        1(setq org-habit-show-all-today nil)
      

是否在未开始日期显示习惯

设置为不显示。

elisp
        1(setq org-habit-show-habits-only-for-today t)
      

色块文本


含义

!

  1. 今天
  2. 任务还未完成

*

  1. 当天已完成任务
  2. 过去/今天

支持自定义

elisp
        1(setq org-habit-today-glyph ?◆)
2(setq org-habit-completed-glyph ?◉)
      

进阶:修改函数org-habit-build-graph

空位设置字符。

elisp
         1(cond
 2 (donep
 3  (aset graph index org-habit-completed-glyph)
 4  (setq markedp t)
 5  (while (and done-dates (= start (car done-dates)))
 6 (setq last-done-date (car done-dates))
 7 (setq done-dates (cdr done-dates))))
 8 (todayp
 9  (aset graph index org-habit-today-glyph))
10 (t
11  (aset graph index ?○))
      

unicode


org-habit图表样式

4组共8个样式。

其中,foreground为字体颜色,background为色块颜色。

注释仅供参考。


前置

elisp
        1;; 计算起始,首个完成,显示文本*
2(set-face-attribute 'org-habit-clear-face nil
3                       :background "blue" :foreground "white")
4
5;; 计算起始之前
6(set-face-attribute 'org-habit-clear-future-face nil
7                       :background "purple")
      

合理提醒区

elisp
        1;; 提醒区,显示文本*/!
2(set-face-attribute 'org-habit-ready-face nil
3                    :background "grey" :foreground "white")
4
5;; 提醒区,不显示文本;即使未完成,也在合理范围内
6(set-face-attribute 'org-habit-ready-future-face nil
7                    :background "#89CFF0")
      

告警示意区

elisp
        1;; 告警示意区,显示文本!;当天任务未完成则过期,当前还未过期,仍可完成
2(set-face-attribute 'org-habit-alert-face nil
3                           :background "black" :foreground "white")
4
5;; 告警示意区,当天任务未完成则过期;过去确定过期,未来可能过期
6(set-face-attribute 'org-habit-alert-future-face nil
7                    :background "orange")
      

逾期区

elisp
        1;; 当天确定逾期;可显示文本*
2(set-face-attribute 'org-habit-overdue-face nil
3              :background "red" :foreground "white")
4
5;; 未来,计算范围外
6(set-face-attribute 'org-habit-overdue-future-face nil
7              :background "white")
      

TODO标题

必须包含以下内容

  1. SCHEDULED
    C-c C-s

    SCHEDULED: <2026-08-25 周二 .+1d/2d>

    .+nd 表示n天一次
    /md 表示m天内至少有一次

  2. 属性

    :PROPERTIES: :STYLE: habit :END:

记录习惯的org文件路径需添加到[org-agenda-files]。

标题目录