1 概括

1.1 Org-mode Or Bullet Journal ?

首先,你如果是一个 Org-mode 和 Emacs 用户这会帮助你在 org-agenda 相关。如果不是,也别忽略这篇文章。Org-mode 仅仅是一个帮助我们建立日程安排的表的工具,我也会从原始文学的方案 Bullet Journal 去探索和分析。笔记本日记是人类延续几千年记录的方式,它依然蕴含有着无穷的魅力值得我们探索。如果是非技术人员或者喜欢用笔记录自己的生活在书本上。那么这将会是你最好的选择。

其次在这篇文章里,我不会谈论关于在日程安排上所引导我思考的东西。比如日程安排和分类总结为什么重要,我思考关于哲学,人相关的问题,如何我引导我发现我问题,想要去解决的。如果需要阅读这方面信息,请阅读 画一个我 一文。

-这里我清楚的表达这篇的文章的目的性 [33] :

在开始阅读这篇文章的时候,我不仅需要读者怀着探索和发现自身问题,带着自身问题,有耐心的去阅读。无论涉及到的理论还是技术问题,都涉及到不少知识。如果你有时间和想法,请尽可能多的涉猎相关知识。

1.2 关于个人日程安排设计相关设计到的知识:

1.2.1 番茄工作法(时间管理方法)百度百科

然而我并是一严格的番茄钟的实践者和遵循者。从我实践经验和个人任务设计来面临的问题:

  • 对于 25 分钟工作 5 分钟休息所遇到的问题

    • [X] [缺点] 25 分钟很难让人快速进入工作状态,尤其的是深度工作。这严重影响到一个工作的质量和进度。假使 25 到来,你正在想一个问题,这个时候你是否要打断思绪或者工作状态,去获取这 5 分钟的休息时间?

    • [✔] [优点] 对于我而言它高效完美的适用于除却要深度工作,和高度集中的,且思绪不容易被打断(这个我用时间块去解决)的事件。如个人爱好,听音乐,看视频,锻炼,浏览论坛,刷 feed 别人文章时候。番茄工作法能够帮我有效的支配和控制这些容易过度花费时间的任务。

1.2.2 Org Mode - Organize Your Life In Plain Text!

正如标题所说的那样,Org mode 可以帮助让你的生活更加有调理,无论是对于学习 org-mode 的人还是想要掌握如果用 org-mode 建立自己的日程的人来说,这都无疑是模板级别的文章。在这里我会取其中精华的思想和方法融入到我的方案里。

EOS: Org Module [重要]Complete Computing Environment: Org-Mode

Bullet Journal Blog 提供很多不错对于理论知识点概括的文章,如果没有自己特别的理解我并不是一个喜欢把别人东西原本拿过来,用自己的语言讲述一遍的人。所以我附带一些相关链接方便你理解

✰ Important 1.2.3 Bullet Journal & 小结

在这里展示一个我是如何从网上去发现 Bullet Journal 用户他们的文章,从中和 org-mode 找出不同点,去改进和适配,所以只谈论一个小例子。

我引用文章中这段话,表达的已经相当简单明了。很多时候我们给自己的内心或者只是简单的记载,但一个目的的实践成功失败,无论它是大是小,我们需要一个明确的时间周期用来 跟踪 和回溯。

We often measure success by reaching some tiny un-informed point we plopped on the map of our life long ago. The target is small, and risk of failure is high. When goals are lighthouses, success is defined by simply showing up, by daily progress no matter how big or small. We’re no longer confining ourselves to some questionable target. This gives us latitude to grow and to explore. It allows us to update our goals based on what we learn, keeping them relevant.

以下是 org-mode 中对简单的目的任务设置:

  • 设定期望的时间周期
  • 设定对任务的分类

    • 目标

      ** 迁移 Init org 到 Doom Emacs Init.org :emacs:goals:

      SCHEDULED: <2019-11-19 Tue>–<2019-11-30 Sat>

      ** 单臂倒立 hand-hop :myself:goals:workout:

      SCHEDULED: <2019-08-11 Sun>–<2020-03-30 Mon>

  • 探讨 别人的 Priority 和 Org-mode 区别

How I use a notebook to stay organised

在 Org-mode Priority 用 A B C 三个等级给 task 打一个优先等级,那些是优先去做此等去做.用 org-set-property 给其属性值。

我们从 Bullet Journal 这用户的博文图片中可以看出它方法的不同。她给 Priority 赋于 course 的值,她的思维顺序应该是先做 course 相关的任务。而 Course 本身属于分类标签, Course 底下还有许多任务,那么这些任务还是需要赋于一个优先等级。但是 Org-mode 下我们轻松的解决来这个问题:

先给任务打一个 ABC 优先权的标签,然后发送一个 state 状态 TODO,最后给打一个标签 tags。属性赋于 course。这样这个任务主题就明细很多了。从她划掉的值 HABIT 看得出她想法是,这个任务每天都会做。所以在给这个任务属性的时候我会添加一个 style:habit 然后每天给时间周期设定一个时间 每 1 天或 2 都会做一次。如果你笔记要记录类似的要求一定要避免她出现的问题

有兴趣的可以阅读一下来源:

2 来谈谈如何设计有效实用灵活的笔记表

2.1 初步小探索

老规矩,从代表性的 Org-mode 和 Bullet 用户写的文章去分析他们的做法。

一个时间的 state 的设定,除了标准 TODO 和 DONE 中,我们还是要根据你本身各个事件周期频率,而因地制宜的去设置一些 state keyword.

我对 Ryan Rix 他任务状态流程简化和修改了部分

  • 修改了 NEXT 为 org-mode 初始值 TODO,PLANNING 计划后直接给 TODO
  • 将 NEXT 变为当给任务分配了 TODO 的任务昨晚了,我会从 NEXT 的任务里找些,并换为 TODO
  • 将 ICEBOX 改为 ☕ BREAK ,其任务为当前这个指定的任务,我当前时间段不想做,或者由于说明事情我得中断。而非取消了这个任务。
  • 这里需要说明以下 IMPORTANTNOTE 的区别,IMPORTANT 就是不能忽略,star 一个任务。而 NOTE 是这个任务需要记录和自身去产生想法的,且长期会跟踪。类似于 IDEA 想法的 state 看下图:

通过两个作者,不同平台的实现。我们发现除了 TODO DONE 外,IDER 和 ICEBOX 对我们是尤其重要的,有些突入起来想法,或大或小。它需要我们 Note 打一个标记,长期来更总实现。如果由于各种问题不得不放弃或者 crash,请把它当放在 ICEBOX 或 cache 里,它对于你依然代表着很多价值。

  • 我们需要细致的分类 IDEAS 想法和 thinking,在分类之前你需要明白 2 概念:

什么是 Thinking outside the box - Wikipedia

相对的也有 Inside the box.很多时候我们放在 outside the box 想法是大胆的,创造性的。跳出了正常的思维框架去思考。创造性的,大胆思维是这个时代我们需要的,它往往带来意想不到的收获和新奇的发现,但它同样也伴随着一定的风险。所以我们对 Inside the box 同样也重视。就像引用 wiki 这样说的

On the other hand, Bandrowski argues that the process of thinking “inside the box” need not be construed in a pejorative sense. It is crucial for accurately parsing and executing a variety of tasks — making decisions, analyzing data, and managing the progress of standard operating procedures, etc.

优先会思考或者多于在 Inside the box 框架下思考的人,他们不意味着贬义,死板,饱受没有开拓创新的精神。稳定的,基础的低风险,合乎在当前社会,环境人为因素的想法和策略,是我们倾向的一种方式。

对于想法和思考的保存和跟踪,我们一定要有一个清晰的认知去实践和跟踪。想了而不去实践,不去做,等于白活瞎想。等洄溯问题的想法的时候,我们可以通过想法和思考的跟踪记录,实践结果去

衡量当下的自己,在各种认知和思维方式上是否已经落伍,还是跳跃性过于极限

  • ❤ Love 的意思是,单纯对于我讲,它是我比较喜欢的一个任务,喜欢的事件。

以下是我 org-mode 的实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 (setq org-todo-keywords
        '((sequence
           "☞ TODO(t)"  ; A task that needs doing & is ready to do
           "PROJ(p)"  ; An ongoing project that cannot be completed in one step
           "⚔ INPROCESS(s)"  ; A task that is in progress
           "⚑ WAITING(w)"  ; Something is holding up this task; or it is paused
           "|"
           "☟ NEXT(n)"
           "✰ Important(i)"
           "✔ DONE(d)"  ; Task successfully completed
           "✘ CANCELED(c@)") ; Task was cancelled, aborted or is no longer applicable
          (sequence
           "✍ NOTE(N)"
           "FIXME(f)"
           "☕ BREAK(b)"
           "❤ Love(l)"
           "REVIEW(r)"
           )) ; Task was completed

接下来看看 Bullet 用户的实现方法:

  • Dash: Incomplete action item
  • Plus: Completed action item
  • Right arrow: Action item currently waiting for another action or person before it can be completed
  • Left arrow: Action item that’s been delegated to someone else
  • Triangle: Note
  • Circle: Action item moved to another list

他这里添加了简单的符号,和给予 task state。看了我们的 Org-mode 里面实现的方法和是不是感觉这个文件的作者设计的比较简单化,没有考量到其他的情况。:P

为了隐私,我这里展示部分任务在 org-mode 下的效果:

在 Super-agenda 的分类任务 state 的展示:(如何去配置 super-agenda 请阅读下面内容)

对比 Bullet

通过软件和手工笔记本的优势就很明显了吧。

3 日程文件安排结构树

在介绍这章节的时候,我强烈建议阅读以下这位作者的文章

如何想静静 - Yihui Xie | 谢益辉

谢益辉作者很多观点我都非常同意,所以我们需要建立一个属于自己的日程文件,它帮我整理记录生活,发现问题。从烦躁的外部环境中找到一个科学适用的方式,去记录保存、回溯自己的想法,找到一个平衡点去使自己的内心安静下来。

继续之间的问题,了解完个人事情和任务的 state 和优先等级属性等,我们需要创建不同的文件,对应存放不同的

3.1 首要优先级

1
2
3
4
5
6
├── gtd.org  // 主要放置日程去做的文件
├── gtd_old.org // 堆放不那么需要的,做一半不想做的。清理垃圾事件
├── images // 存放图片的文件夹
├── mobileorg.org  // 同步显示在手机上remote org-agenda by Orgzly on android
├── myself.org  // 放置存放一些自己感兴趣的事情尽量不合自己主业,major job相关
├── notes.org //Only note My fields

GTD 展示

将完成的事件放到 Archives 里面保持 GTD 文件里面内容干净:

  • 在 Myself 里面展示
  • Notes 我主要 refile 任务到 GTD 任务表的来源,很多时候我发现一个好的项目和有趣的代码,需要我学习的,包括文章等等。但我当前并想就直接保存后然后去浏览,因为浏览和我 major job 相关有趣的事情,也是设定在一个事件,我会在保存在 notes 里面,后面有时间我会逐个查看一遍,往 GTD 迁移到我实际要做的事情里面。

3.2 次要优先级

  • Post

发布或记录一些事情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
post
├── Learn //在org-notes下长期要维护更新的
├── myself //放置自己感情,生活个人意识流,感悟的地方
├── agenda //将能够公开的部分日志安排表存放的目录
├── life-thing //生活相关
├── art //艺术相关包括电影,音乐,游戏等等
├── nsm //公开的工作相关
├── project //公开的项目相关
└── traveling //关于,旅行,旅游,探索等等
...

任何做过的事情只要是有价值的值得回忆的,就值得被记录。它是你人生里一段 真实的 发生过 的事情,如果有一天你忘记,那么就等于白活。这里我展示我记录音乐相关的笔记,这里是我博文发布的链接:

  • Course

用来记录和学习的课程书籍的目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
course
├── ELK
├── WGEECN
│   └── resource
├── bro
├── hello-emacs
│   └── Emacs_Redux
├── onlisp-cn
│   ├── auto
│   └── figures
├── osquery
├── pcl-cn
│   └── docsrc
│       ├── chap01
│       ├── chap02
│       ├── ...
├── practical-common-lisp
│   └── practicals
│       ├── Chapter03
│       ├── ...
│       └── libraries
│           └── cl-ppcre-1.2.3
│               └── doc
├── suricata
  • NsmOrg

与我工作相关的目录,做了 org-pulish 到 blog 下的 post

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  NSM-GTD
  ├── CVE.org
  ├── NsmOrg.org
  ├── README.md
  ├── README.org
  ├── database.org
  ├── debug.org
  ├── thesis
  │   ├── Deep\ Packet\ Inspection-over-Encrypted-Traffic.pdf
  │   ├── embark.pdf
  │   └── thesisfinal.pdf
  ├── workflow.html
  └── workflow.org
  • archives

用来存放已经完成的事项,保证当前的 agenda list 没有多余的杂项。

1
2
3
4
5
archive
|── film.org
└── music.org
└── Lernmusic.org
└── Wallpaper //好看中意的图片,背景,照片等
  • art

myself.org 文件收集的电影,书籍,书画等分类的事件完成后,refile 到 art 目录下的指定分类文件。

1
2
3
4
art
├── film.org
└── music.org
...

3.3 文学编程

纯 Org-mode 下管理命令和配置,如果你是非技术人员请跳过这个章节。

这里我 link 一个比较 Pro 的仓库和方式,适合有文学编程意向的人学习。

从前 4 个月前,我从 arch linux 转移到 nix,从 0 学习 nix,完全用 nix function 去管理整个系统的文件和 home profile。能解决环境,重复配置,将所学习到的配置的东西记录下来。不会有无用的,忘记自己学习过的那种事情出现。

这是我的 nix 包括整个环境的配置,非常适合想入门 nix 新手去学习和效仿

现在来看看我是如何用 org-mode 去管理我的所有配置,以文本的格式去记录然后 tangle 在不同的文件下: my-profile/init.org at master · GTrunSec/my-profile

  • init.org

管理生成 Emacs 相关的配置

这样的方式下,我每次只需要在当前的 org 文件下更新配置就然后把它 tangle 为对应的文件格式和名字就可以了。方便我管理,和记录。

  • nix.org

管理生成 NIX 相关的配置

Ob-src 快速学习测试程序语言 -Haskell -python -C++ -Common lisp

/每当我们要学习一门新的语言技术的时候,我们需要写很多小测试去输出不同的样例,去发现它的语言特性和异样性。那么文学编程提供了我这样一个高效的测试环境,并却记录和发表/

Haskell 快速测试展示,我们可以把标题设置为书本章节,或者文档的章节标题。

你可以把它看出 Jupyter 的另一种方式,当然 org-mode 的文学编程可以支持 jupyter.

这样是不是感受到了文学编程的魅力,其实 wiki 上面有很多关于文学编程的理论知识,如果你还是不能够理解它

4 配置 org agenda 以及相关文件的搜索系统

4.1 org-starter

使用简单明了去定位和设定 agenda file

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
(use-package org-starter
  :config
  ;; (add-hook! 'after-init-hook 'org-starter-load-all-files-in-path)
  (org-starter-def "~/Documents/org-notes"
                   :files
                   ("GTD/gtd.org"                      :agenda t :key "g" :refile (:maxlevel . 5))
                   ("GTD/notes.org"                    :agenda t :key "n" :refile (:maxlevel .5 ))
                   ("GTD/myself.org"                   :agenda t :key "m" :refile (:maxlevel .5 ) )
                   ("GTD/Habit.org"                    :agenda t :key "h" :refile (:maxlevel .5 ))
                   ("post/traveling/traveling.org" :key "t" :refile (:maxlevel .5 ))
                   ("post/myself/love.org"         :key "l" :refile (:maxlevel .5 ))
                   ("post/myself/qing.org"         :key "q" :refile (:maxlevel .5 ))
                   ("post/myself/plan.org"         :key "p" :refile (:maxlevel .5 ))
                   ("GTD/my-books.org"             :agenda t :key "b" :refile (:maxlevel .5 ))
                   ("post/life-thing/life-things.org")
                   ("NSM-GTD/workflow.org"         :agenda t :required t)
                   ("NSM-GTD/NsmOrg.org"           :agenda t :required t)
                   ("art/music.org"                :agenda t :required t)
                   )
  (org-starter-def "~/.doom.d"
                   :files
                   ("init.org" :key "i" :refile (:maxlevel . 5))
                   ;;("nix.org" :key "x" :refile (:maxlevel . 5))
                   )
  (org-starter-def "~/.config/nixpkgs"
                   :files
                   ("README.org")
                   ("global-readme.org")
                   ("dotfiles/wallpaper/wallpaper.org" :agenda nil)
                   )


 (defhydra gtrun/hydra-org-starter nil
      "
  Org-starter-files
  ^^^^------------------------------------------------
 _i_: init.org    _g_: gtd.org      _l_: love.org
 _n_: note        _t_: traveling    _h_: Habit.org
 _m_: myself      _q_: 情-qing      _p_: Plan.org
 _b_: my-books
  "
      ("i" org-starter-find-file:init)
      ("g" org-starter-find-file:gtd)
      ("n" org-starter-find-file:notes)
      ("m" org-starter-find-file:myself)
      ("t" org-starter-find-file:traveling)
      ("q" org-starter-find-file:qing)
      ("l" org-starter-find-file:love)
      ("h" org-starter-find-file:Habit)
      ("p" org-starter-find-file:plan)
      ("b" org-starter-find-file:my-books)
)
 :bind
 (
  ("C-c e" . org-starter-select-file))
 ;; "C-c e" . org-starter-refile-by-key))
  )

这里设置的 hydra key 可以快速的让我到达我要的文件下面

4.2 配置 Notdeft 作为总体的搜索系统和快速笔记

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
(use-package! notdeft
:config
(setq notdeft-extension "org")
;;(setq notdeft-secondary-extensions '("md" "org" "scrbl"))
(setq notdeft-directories '(;;"~/Documents/org-notes/post/myself"
                            "~/project/my-code"
                            "~/Documents/org-notes"
                            ))
(setq notdeft-xapian-program "/home/gtrun/src/notdeft/xapian/notdeft-xapian")
:bind (:map notdeft-mode-map
        ("C-q" . notdeft-quit)
        ("C-r" . notdeft-refresh)
        )
;; (setq notdeft-xapian-program
;;       (expand-file-name
;;        "xapian/notdeft-xapian"
;;        (package-desc-dir
;;         (cadr (assq 'notdeft package-alist)))))
)
  • 支持中文搜索
1
(setenv "XAPIAN_CJK_NGRAM" "1")

notdeft 开始要解决的问题就是快速的笔记,query language 去搜索关键字。说是在的我不怎么喜欢用 org-journal,因为我每天有很多事件要做,很多事件就已经分散了日记的作用。而且我的想法和思想不一定会明天产生。所以 Notdeft 解决了一个我快速笔记和过滤的功能,很喜欢

  • 通过关键字过滤含有 keyword 的文件

4.3 org-push-project

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  (setq org-publish-project-alist
        '(("NSM"
           :base-directory "~/org-notes/NSM-GTD"
           :publishing-function org-html-publish-to-html
           :publishing-directory "~/Dropbox/application/Bitcron/gtrun.bitcron.com/custom"
           :include ["workflow.org"]
           )
          ("init"
           :base-directory "~/.emacs.d"
           :publishing-function org-html-publish-to-html
           :publishing-directory "~/Dropbox/application/Bitcron/gtrun.bitcron.com/custom"
           )
          ("art"
           :base-directory "~/org-notes/art"
           :publishing-function org-html-publish-to-html
           :publishing-directory "~/Dropbox/application/Bitcron/gtrun.bitcron.com/custom"
           )
          ("course"
           :base-directory "~/org-notes/course"
           :publishing-function org-html-publish-to-html
           :publishing-directory "~/Dropbox/application/Bitcron/gtrun.bitcron.com/custom"
           )
          ))

每个月底的时间我会发布关于工作相关,使用 org-public 发布.并且加载 css

5 设计 org-agenda 以及快捷搜索

5.1 Super-agenda

5.2 Setting

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
(use-package! org-super-agenda
:config
(add-hook! 'after-init-hook 'org-super-agenda-mode)
 (require 'org-habit)
  ;; (setq org-agenda-time-grid
  ;;       '((daily today)
  ;;         ))
  (setq
   org-agenda-skip-scheduled-if-done t
   org-agenda-skip-deadline-if-done t
   org-agenda-include-deadlines t
   org-agenda-include-diary nil
   org-agenda-block-separator nil
   org-agenda-compact-blocks t
   org-agenda-start-with-log-mode t)
)
  • 分类 org agenda 任务
 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(setq org-agenda-custom-commands
      '(("z" "GtruN Agenda"
         ((agenda "" ((org-agenda-span 2)
                      (org-agenda-start-day "-1d")
                      (org-super-agenda-groups
                       '((:name "Today List"
                                :time-grid t
                                :date today
                                :todo "⚔ INPROCESS"
                                :scheduled today
                                :order 1)))))
          (alltodo "" ((org-agenda-overriding-header "")
                       (org-super-agenda-groups
                        '((:name "Next to do"
                                 :priority>= "B"
                                 :order 2)
                          (:name "Important"
                                 :todo "✰ Important"
                                 :order 6)
                          (:name "Due Today"
                                 :deadline today
                                 :order 3)
                          (:name "Due Soon"
                                 :deadline future
                                 :order 8)
                          (:name "Overdue"
                                 :deadline past
                                 :order 20)
                          (:name "Issues"
                                 :tag "Issue"
                                 :order 12)
                          (:name "Projects"
                                 :tag "Project"
                                 :order 14)
                          (:name "Emacs"
                                 :tag "Emacs"
                                 :order 13)
                          (:name "Research"
                                 :tag "Research"
                                 :order 15)
                          (:name "To read"
                                 :tag ("BOOK" "READ")
                                 :order 30)
                          (:name "Waiting"
                                 :todo "⚑ WAITING"
                                 :order 18)
                          (:name "trivial"
                                 :priority<= "C"
                                 :todo ("SOMEDAY")
                                 :order 90)
                          (:discard (:tag ("Chore" "Routine" "Daily")))))))))

        ("b" . "BOOK")

        ("bb" "Search tags in todo, note, and archives"
         search "+{:book\\|books:}")

        ("bd" "BOOK TODO List"
         search "+{^\\*+\\s-+\\(⚔ INPROCESS\\|☞ TODO\\|⚑ WAITING\\)\\s-} +{:book\\|books:}")

        ("d" "ALL DONE OF TASKS"
         search "+{^\\*+\\s-+\\(✔ DONE\\|✘ CANCELED\\)\\s-}")

        ("i" "ALL INPROCESS OF TASKS"
         search "+{^\\*+\\s-+\\(⚔ INPROCESS\\)\\s-}")

        ))

5.3 展示和说明

在配置中,我们为此设定了几个 全局 主题和标签的 tags 搜索。

  • Tags 搜索说明:对于高频使用的 tags 和高频使用复合搜索的 state 这里我们添加为 agenda 的快捷键搜索,比如说带有 Blog Book books 标签的任务。
1
2
3
4
5
6
7
("b" . "BOOK")

("bb" "Search tags in todo, note, and archives"
 search "+{:book\\|books:}")

("bd" "BOOK TODO List"
         search "+{^\\*+\\s-+\\(⚔ INPROCESS\\|☞ TODO\\|⚑ WAITING\\)\\s-} +{:book\\|books:}")

快捷键匹配:

多重匹配:

这样一来,我们通常想要搜索过滤的任务就可以快速用写好的快捷键过滤。

  • 最后我来展示一个曾经我用 spacemacs 参考 bh 配置的一个完全 key 展示,在 doom emacs 我做了相关配置的迁移,

关于 org-agenda-skip-function 大家可以选择不使用 bh function,具体如何 skip 大家可以网上搜索最新的方法

以下我单纯一个多重匹配和 agenda key 的配置方法

  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
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
(setq org-agenda-custom-commands
      '(("a" "agenda"
	     ((agenda ""
		          ((org-agenda-prefix-format "  %-12:c%?-12t% s ")))
	      (tags "LEVEL=2-project-TODO=\"NEXT\"+CATEGORY=\"task\"/!"
		        ((org-agenda-overriding-header "Unscheduled Tasks")
		         (org-agenda-prefix-format "  ")
		         ;; skip projects
		         (org-agenda-skip-function (lambda ()
					                         (or (bh/skip-project-trees-and-habits)
						                         (org-agenda-skip-entry-if
						                          'deadline 'scheduled 'timestamp))))))
	      (tags-todo "LEVEL=2|LEVEL=3-CATEGORY={practice\\|someday}/!NEXT"
		             ((org-agenda-overriding-header "Next Action")
		              (org-agenda-skip-function 'jag/skip-parent-done)
		              (org-agenda-show-inherited-tags t)
		              (org-agenda-prefix-format "  %b ")))
	      ;; show projects
	      (tags-todo "CATEGORY=\"task\""
		             ((org-agenda-overriding-header "Projects")
		              (org-agenda-skip-function 'bh/skip-non-projects)
		              (org-agenda-prefix-format "  "))))
	     ((org-agenda-show-inherited-tags nil)))

	    ("w" "review"
	     ((todo "WAITING"
		        ((org-agenda-overriding-header "Waiting for")))
	      (tags-todo "-CANCELED/!"
		             ((org-agenda-overriding-header "Stuck Projects")
		              (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
	      (tags "LEVEL=2+CATEGORY=\"appt\""
		        ((org-agenda-overriding-header "Past appointments")
		         (org-agenda-skip-function 'jag/skip-future-and-repeated-appointments)))
	      (tags "TODO=\"DONE\"-exclude-CATEGORY={practice\\|garden\\|appt}|+TODO=\"CANCELED\""
                ((org-agenda-overriding-header "Tasks to Refile"))) ; to refile/archive in bulk, press m B
	      (tags "LEVEL=2+CATEGORY=\"SOMEDAY\"-TODO=\"CANCELED\""
		        ((org-agenda-overriding-header "Someday/Maybe"))))
	     ((org-agenda-prefix-format "  ")
	      (org-agenda-show-inherited-tags nil)
	      (org-agenda-skip-function nil)
	      ))

        ("n" "notes"
         ((tags "LEVEL=2+CATEGORY=\"notes\""
		        ((org-agenda-overriding-header "Notes")
		         (org-agenda-show-inherited-tags nil)
		         (org-agenda-prefix-format "  ")))))

        ("c" . "context")

	    ("cc" "physical context (@errands, @phone, @mail, @blog)"
         ((tags-todo "errands-CATEGORY=\"tickler\""
                     ((org-agenda-overriding-header "@errands->")))
          (tags-todo "phone"
                     ((org-agenda-overriding-header "@coding")))
	      (tags-todo "mail"
		             ((org-agenda-overriding-header "@mail->☎")))
	      (tags-todo "home"
		             ((org-agenda-overriding-header "@blog")))))

	    ("cr" "read" tags "READ"
	     ((org-agenda-overriding-header "To Read")))
	    ("cw" "watch" tags "WATCH"
	     ((org-agenda-overriding-header "To Watch")))
        ("cc" "see" tags "COURSE"
	     ((org-agenda-overriding-header "To Course")))
	    ("ci" "listen" tags "LISTEN"
	     ((org-agenda-overriding-header "To Listen")))
        ("cl" "learn" tags "LEARN"
	     ((org-agenda-overriding-header "To Learn")))
        ("ct" "think-" tags "think"
	     ((org-agenda-overriding-header "To Think")))
        ;;("cq """)⛵
	    ("ch" "hold"
	     tags "+hold|+CATEGORY=\"reference\"|+CATEGORY=\"bookmark\"")

        ("i" . "Investigation")

        ("ib" "Bro" tags "+Bro|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Bro")))
	    ("is" "Silk" tags "+Silk|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Silk")))
        ("in" "NetToolset" tags "+Nettoolset|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Nettoolset")))
	    ("id" "Document" tags "+Document|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Document")))
        ("il" "learn" tags "+LEARN|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Learn")))
        ("it" "think-" tags "+THINK|+CATEGORY=\"NSM\""
	     ((org-agenda-overriding-header "To Think")))

        ("p" "print"			; press C-a a e to export
         ((agenda "" ((org-agenda-span 2)))
          (tags-todo "errands-CATEGORY=\"tickler\""
                     ((org-agenda-prefix-format "  [ ]")
                      (org-agenda-todo-keyword-format "")
                      (org-agenda-overriding-header "\n@errands:")))
          (tags-todo "phone"
                     ((org-agenda-prefix-format "  [ ]")
                      (org-agenda-todo-keyword-format "")
                      (org-agenda-overriding-header "\n@blog:"))))
         ((htmlize-output-type 'css)
          (org-habit-show-habits nil)
          (org-agenda-remove-tags t)
	      (org-agenda-files (append org-agenda-files '("~/org-notes/NSM-GTD/NsmOrg.org"))))

         ("r" "practice"
          ((tags "LEVEL>=3+CATEGORY=\"practice\"-exclude+next"
                 ((org-agenda-overriding-header "Practice")
                  (org-agenda-prefix-format "  %-10:c %-8e"))))))))

6 标准化设置一个任务安排

6.1 图书管理

以前我基本是用 org-mac-grab-link SKIM 到 org 一个图书的链接。在 Linux 下也 org-grab-x 保存书本 Path。但是现在我的方式,使用

如果是付费用户,Reading statistics tags 等功能,但免费用户本身就提供一个基本的统计图类似于 github 的打卡统计图。其实从 progress 进度周期很容易发现问题。我非常喜欢这款软件,其实免费版就足够用户使用了。接下来我说说优点

  • 能够同步读书笔记,转格式导出与多个客户端他人分享 Markdown 格式
  • 重要的一点的它们 多个客户端异步编写读书笔记,这是最吸引我的一点
  • 其次它的进程统计图,数据等等展示让你很容易发现问题

另外我用到lepisma/org-books: Reading list management with org mode去添加一本书到 org-mode.因为 Polar-book 已经满足我很多需求,我不用在 Org-mode 下打开。我只用它添加一本书的,和计算 Org-clocks

  • 如下是是 polar-book 提供的可视化
  • 对于 org-books 添加的图书,我们只需要 2 个功能
    • 添加一个 deadline 时间戳
    • 计算 org-clock-in

基本必须要的就是分类和 CATEGORY,这样的设定就满足我们的基本要求和标准。

这样在 org-agenda 就可以看到这个任务当天 deadline 天数和 clocked time。

先前面讲到过的,你可以设定一个读书的时间段,然后使用 org-agenda book 快捷键去查询过滤那些书本你想读的:

  • 思考小结: 因为 polar-book 提供的笔记功能实在方便强大,我们不要再导出图书的 table of content 在 org-mode 下,每当阅读就 DONE 一个章节的标题。这完全是没必要的,progress 和笔记 基本的可视化 polar-book 都提供。

你或许唯一要做的就是,用 Polar 生成的 markdown 读书笔记转化为 Org-mode。这样方便我们添加发布通过 org format.

6.2 设定跟踪一个想法

关于理论知识我开头就已经讲过,这里不再重复,直接设定。

下面是我对 out of the box 的实践展示

  • 说明:
    • 分类想法事件到 out of box 打一个想法的标签
    • 通过不同 state 给予当前进度的状态

我的 Sate 里面的 NOTE NEXT 和 outside the box 如何复合实践又有说明不同。

  • 举一个我自己的例子: 我是 arch Linux user 突然看到一个项目是 NIXOS 的 NIX 包管理方式,我觉得它很有前途,但我还不怎么了解,我就给予一个 NOTE 标记,提醒我日后有时间看看。我用空闲时间连接到它对用户要求特别高,学习成本高,非常跨越式的一种技术。我不确定有没有能力和学习时间去从 arch Linux 迁移到 NIXOS 上,所以我给分类到了 outside the box。当然我白天依然用 arch Linux 稳定的学习工作,有时间就会实践学习一下 NIXOS 在虚拟机里。差不多四个多月的断续学习,我已经完全迁移到了 NIXOS。所以这个大胆的新技术和实践就被我完成了。

  • 最后小结:

我们通过这个想法和设定需求,依然可以在 agenda 里面实现一个快速搜索的方式如下:

因为想法属于长期要跟踪的所以我们放在 review 里面

1
2
3
4
5
6
("w" "review"
 ((todo "WAITING"
        ((org-agenda-overriding-header "Waiting for")))
  (tags-todo "CATEGORY=\"outside the box\""
             ((org-agenda-overriding-header "Outside the box)
                  (org-agenda-skip-function 'bh/skip-non-stuck-projects)))

7 创建 org clock report 文件

为每一个时间创建一个 heading,根据个人需求做 report C-c C-c 简单生成

The Org Manual: The clock table 相关参数请阅读 Manual 这里不做赘述。

✰ Important 8 图表数据可视化所做过的事件

Org-mode 本身提供 org clock report CSV,那么我们可能从 CSV 本身去做简单的可视化测试。

8.1 Hacking CSV table

CSV Exporting Clock Entries from org-mode to CSV Unconstant Conjunction
CSV atheriel/org-clock-csv: Export Emacs org-mode clock entries to CSV format.

8.2 Simple test

以下是参考: Python, Org Mode, and writing Org tables to CSVs so that I can read them back –

对单纯的 table 生成做一个简单的数据分析展示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  (defun my-tbl-export (row)
    "Search for table named `NAME` and export."
    (interactive "s")
    (save-excursion
      (goto-char (point-min))
      (let ((case-fold-search t))
        (when (search-forward-regexp (concat "#\\+NAME: +" (car row)) nil t)
          (next-line)
          (org-table-export (format "../../agenda-csv/elisp-this-month.csv" (car row)) "orgtbl-to-csv")))))
  (mapc 'my-tbl-export tables)
1
  in_org=1

File Timestamp Tags Headline Time %
ALL Total time 4:13 100.0
gtd.org File time 2:49
Daily 1:36 37.9
[2019-10-25 Fri 12:17]   查阅胰岛素泵 1:18 30.8
[2019-10-24 Thu 23:22] Media   216 集冒险雷探长 0:18 7.1
Project 1:13 28.9
<2019-10-26 Sat>   org clock table parse to R data 1:13 28.9
notes.org File time 0:00
myself.org File time 0:00
Habit.org File time 1:24
<2019-10-26 Sat +1d> 锻炼 0:20 7.9
To Read 1:04 25.3
[2019-10-27 Sun 17:27] READ, novel   沧元图 1:04 25.3
workflow.org File time 0:00
NsmOrg.org File time 0:00
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np
import orgbabelhelper as ob
def out(df, **kwargs):
    if 'in_org' in globals():
        print(ob.dataframe_to_orgtable(df, **kwargs))
    else:
        print(df)
        return df

for row in tables:
    table = row[0]
    index = row[1]
    if row[1] == '':
        index = None
        globals()[table] = pd.read_csv('../../agenda-csv/org-month.csv').apply(pd.to_numeric, errors='ignore')
return(globals()[table])
 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
26
27
28
29
File         Tags  ...       Time Unnamed: 4
0                       NaN          ALL  ...  *1d 0:03*        NaN
1                   gtd.org          NaN  ...     *7:24*        NaN
2                       NaN          NaN  ...       7:24        NaN
3                       NaN          NaN  ...        NaN       1:14
4                       NaN       config  ...        NaN       6:10
5      gtd.org_archive_2019          NaN  ...     *1:18*        NaN
6                       NaN         READ  ...       1:18        NaN
7                 notes.org          NaN  ...     *0:00*        NaN
8                myself.org          NaN  ...     *0:00*        NaN
9   myself.org_archive_2019          NaN  ...     *0:28*        NaN
10                      NaN        movie  ...       0:28        NaN
11                Habit.org          NaN  ...     *9:48*        NaN
12                      NaN       LISTEN  ...       5:56        NaN
13                      NaN        LEARN  ...       0:35        NaN
14                      NaN       myself  ...       1:23        NaN
15                      NaN          NaN  ...       0:07        NaN
16                      NaN          NaN  ...        NaN       0:07
17                      NaN          NaN  ...       1:47        NaN
18                      NaN          NaN  ...        NaN       0:19
19                      NaN          NaN  ...        NaN       1:28
20   Habit.org_archive_2019          NaN  ...     *5:05*        NaN
21                      NaN  READ, novel  ...       5:05        NaN
22             workflow.org          NaN  ...     *0:00*        NaN
23               NsmOrg.org          NaN  ...     *0:00*        NaN
24                music.org          NaN  ...     *0:00*        NaN
25   music.org_archive_2019          NaN  ...     *0:00*        NaN

[26 rows x 5 columns]
1
2
3
4
5
6
7
MyData <- read.csv(file="~/Documents/org-notes/../../agenda-csv/org-month.csv", header=TRUE, sep=",")
library(ggplot2)
ggplot(MyData, aes(y=File, x=Time, color=Time)) +
    geom_point() +
    theme(text = element_text(size=10),
        axis.text.x = element_text(angle=0, hjust=1))
ggsave("../../agenda-csv/this-month.png",width = 10, height =5, units = "cm")
Figure 1: month-plot

Figure 1: month-plot

1
2
3
4
5
6
7
MyData <- read.csv(file="~/Documents/org-notes/agenda-cvs/org-month.cvs", header=TRUE, sep=",")
library(ggplot2)
ggplot(MyData, aes(y=Headline, x=task_time, group=task_time, color=task_time)) +
    geom_boxplot() + theme_bw() +
    theme(text = element_text(size=10),
        axis.text.x = element_text(angle=0, hjust=1))
ggsave("../../agenda-csv/this-month-line.png",width = 10, height =5, units = "cm")
Figure 2: month-line

Figure 2: month-line

⚔ INPROCESS 9 parse org 文件实现可视化

上一小章节大致展示了 org clock export to CSV 用 R 做简单的分析。那么现在我们学习一下如何用基于现如今别人写好的 Org parse 去帮助我们直接分析 org files。

作为数据分析师,在这里我不会去测重点去讲解如下项目的用法,我把 link 出来的就是让用户自己去阅读相关仓库的 manual。我重心会侧重放在,如何基于这些仓库如何去 enrichorg-agenda data,那些数据是应该被我关注的。时间任务分类阀值等如何设置调节等

如果你只想单纯 dump agenda list 看这篇文章,这里不谈论太多的分析

⚔ INPROCESS 9.1 R julia python 实现 timestamp 对 heading 的分析

10 NSM-GTD

关于个人项目学习计划的 todo list 设计和展示,这里我使用 org-html-CSS 完成