QuietHeart's Site

使用Orgmode进行GTD管理


这里给出采用orgmode进行gtd管理的策略。

注:orgmode工作目录说明文件(orgmode/gtd/readme.org)即此文的副本,此文定期更新同步到orgmode工作目录的说明文件。

1 任务状态

状态含义同一般GTD系统,这里先不做深入介绍。主要设置如下任务状态:

INBOX
任何未经处理的任务。
NEXT
正在处理的任务。
LATER
被暂缓延迟的任务。
WAIT/FORWARD
等待能够继续处理的条件。
MAYBE/FUTURE
可能会处理,可能不处理的任务。
CANCEL
被取消的任务。
DONE
已完成的任务。

2 划分文件

主要设置如下目录和文件来存放数据:

inbox.org

整个体系的输入,产生的任何任务、灵感、想法都会通过快速捕捉命令(例如 C-c c )默认收集到这里。

单个文件,因为进入其中的任务迟早会被清空,不会积累。这里的内容是最原始的、迅速捕捉到的内容,待处理,甚至都没有任务状态关键字。每次回顾后,这里的内容要么被移动到相应位置,要么被直接处理,要么归档。

next.org

这里内容主要存放当前处理的任务。

单个文件,因为进入其中的任务迟早会被清空,不会积累。处理任务之时,集中在next.org中进行处理,处理之时相应的任务可能会被切换成各种状态,每次经过定期回顾处理后,这个文件其它状态的内容被移动到合适的位置,导致仅包含 NEXT 状态的任务。

later.org

这里的内容存放 LATER 状态的任务。

单个文件,因为进入其中的任务迟早会被清空,不会积累。每次回顾之后,可能会有一些新的任务切换成 LATER 状态并进入这个文件;也可能有一些任务被切换至其它状态并移出到对应文件。

wait_forward.org

这里的内容存放 WAIT/FORWARD 状态的任务。

单个文件,因为进入其中的任务迟早会被清空,不会积累。每次回顾之后,可能会有一些新的任务切换成 WAIT/FORWARD 状态并进入其中;也可能有一些任务被切换至其它状态并移出这里到对应目录。

maybe_future.org

这里的内容存放 MAYBE/FUTURE 状态的任务。

建议为目录,因为其中内容可能会积累。每次回顾之后,可能会有一些新的任务被切换成 MAYBE/FUTURE 状态并进入其中;也可能有一些任务被切换至其它状态并移出这里到对应目录。

cancel.org

这里的内容存放 CANCEL 状态的任务。

建议为目录,其中内容可能会积累。每次回顾之后,可能会有一些新的任务切换成 CANCEL 状态并进入其中;也可能有一些任务被切换至其它状态并移出这里到对应目录。

done.org

这里的内容存放 DONE 状态的任务。

建议为目录,其中内容可能会积累。每次回顾之后,可能会有一些新的任务切换成 DONE 状态并进入其中;也可能有一些任务被移至其他回顾目录、归档目录、或者加入特定关联信息等。

output

将处理好的任务转化为文档的地方。

建议为目录,其中内容可能会积累。主要存放将要整理成笔记的内容,整理好的内容存放到这里,在合适的时候(如回顾之时)会被转移至其它笔记系统;另外为了借助orgmode环境方便集中访问和refile,有些草稿性质的文档,也可为之做成一个软链接,将软链接放在这里,源文档仍在其初始目录。

_review

存放与任务关联的项目。

建议为目录,其中内容可能会积累。主要存放之前整理过的、或者不活跃的回顾项目。项目其实是对任务的一种“分类”,每个项目包含多个任务,由gtd系统管理,回顾之时会将相关联的任务组织整理,将其概要信息归结为一条项目,存放在这里。

_active

存放与任务关联的当前活跃项目。

建议为目录,其中内容可能会积累。主要存放当前正在整理或者进行的、或者活跃的回顾项目。项目条目的含义同上,是多个相关联的任务的概要索引,便于日后查找参考等,也使得整个gtd中被处理的任务更为有序。

_archive

归档已完成任务。

建议为目录,其中内容可能会积累。主要将一些任务归档,减少Agenda视图的冗余,以及备份,具体依实际情况待定。

3 管理方式:

3.1 大致思路:

两种划分状态的方式

任务的状态既通过其所在的 状态文件名 表示,也通过 TODO关键字标记 表示。

两种“划分”得到的状态含义大致相同,并且一一对应。

回顾阶段与处理阶段

为方便信息检索,以及避免信息重复,采用“分阶段”(处理阶段和回顾阶段)方式管理。

虽然我们划分任务状态的采用的文件名和TODO状态标记两种方式,通过如下方式对处理阶段划分,并不会造成混乱。

处理阶段
在任务处理时进行,将任务切换至合适的TODO关键字标记。
回顾阶段
在系统回顾时进行,将相关TODO关键字标记的任务转移到对应的状态文件中集中存放。

3.2 回顾

3.2.1 回顾种类

短期回顾

比较频繁的,例如“日”回顾,主要用来清理inbox中的内容,以及切换状态。

对于inbox状态文件,将其中的任务和内容切换到合适状态并refile;对于其它文件的任务,只需切换其状态即可;为简化频繁的文件操作,操作可在orgmode的agenda view下进行。

中期回顾

根据项目情况定期的,例如“周”回顾,主要用来梳理当前任务的状态和关系。

主要涉及对任务的refile,以及文档生成等。

长期回顾
便于总结复习整理的,例如“月”、“年”回顾,主要用来梳理任务状态、复习曾经整理的内容、归档等等。

3.2.2 回顾内容:

3.2.2.1 短期回顾

在"短期回顾"中,定期处理inbox中的内容使得收集状态的内容及时被处理。根据情况,可能有如下类型:

立即处理
一般处理过程仅需1-2分钟,直接处理完,让其归结为done状态。
做为任务处理
转移到对应的gtd任务状态中开始对其进行gtd管理,如果任务复杂,可考虑为其创建项目(回顾)来管理相关任务。
不需要处理
直接删除。
归档与笔记
从gtd输出(例如到out目录),或直接转移到对应的笔记系统。

对其他状态任务的处理,只需切换相应任务状态,直接在orgmode中的AgendaView中进行可以避免频繁的文件切换。

3.2.2.2 中期回顾

在"周"回顾中,梳理各种任务状态中的内容,将相关的内容关联起来,将相应的状态内容移动到对应的文件等等。处理方式类似对于inbox的处理,可能有如下类型:

立即处理
将已完成的任务梳理,并且从其它文件中移动到"done",需要添加项目回顾关联的,则添加相应的关联信息。
做为任务处理
没有完成的任务,视情况将其放置到合适的状态和位置,必要时可能会追加更详细的任务属性(如优先级、截止日期、重复间隔等等)。
不需要处理
将不需要继续进行的任务,放置到cancel状态中,将其取消。
归档与笔记
将一些有必要归档的内容归档(减少agenda的负担),以及将特定内容移动到特定的笔记系统(内容管理)。

4 实现方式

下面给出实现上述管理主要需要注意的几个部分。

4.1 实现基本Orgmode任务管理

4.1.1 TODO 标题表示任务

TODO标题是一种包含状态的特殊标题

在标题标记后面加上相应状态名,便成为TODO项目。状态默认为TODO和DONE,可以自行配置。

* TODO 这是一个TODO项目
** TODO 这是TODO的子项目
带有统计子项目的TODO项目

在一个待办标题中添加子待办标题,然后在待办标题中添加 [%] 或者 [%] 。 每当子标题更新时,父标题上面的相应比例会自动统计变化,如果强制刷新,则在父标题相应的比例标记上输入 C-c C-c

* TODO 这是一个统计子项的TODO项目 [0/2]
** TODO 这是TODO的子项目1
** TODO 这是TODO的子项目2

当然这样也行:

* TODO 这是一个统计子项的TODO项目 [0/2] ([0%])
** TODO 这是TODO的子项目1
** TODO 这是TODO的子项目2

4.1.2 按照实现策略进行配置

  • 增加TODO状态 在配置文件中加入类似如下代码:

    ;;set status for TODO.
    (setq org-todo-keywords
         '((sequence "INBOX" "NEXT" "LATER" "WAIT/FORWARD" "MAYBE/FUTURE" "|" "CANCEL" "DONE")))
    
  • 配置状态颜色 通过org-todo-keyword-faces的设置实现,添加内容如下

    ;; color for todo keywords
    (setq org-todo-keyword-faces '(
    ("INBOX" . (:foreground "blue" :weight bold)) 
    ("NEXT" . org-warning)
    ("LATER" . "yellow")
    ("WAIT/FORWARD" . "blue")
    ("MAYBE/FUTURE" . "purple")
    ("DONE" . "green")
    ("CANCEL" . "grey")
    ))
    
  • 配置状态快捷切换键 通过定义状态时将快捷按键放在状态后面,用‘()’括起来,添加内容如下:

    ;;set status for TODO.
    (setq org-todo-keywords '((sequence 
                             "INBOX"
                             "NEXT(n)"
                             "LATER(l)"
                             "WAIT/FORWARD(w)"
                             "MAYBE/FUTURE(m)"
                             "|" "CANCEL(c)" "DONE(d)"
                             ))
     )
    
  • 配置状态切换的跟踪时间戳 当TODO列表切换到结束状态时,会自动为其添加一个结束时候的时间戳(转变为非结束状态时会将其移除)。

    ;;add timestamp when todo change to done.
    (setq org-log-done 'time)
    

4.1.3 常用操作

TODO项目相关操作:

  • M-S-Ret 当前位置插入TODO项目,默认状态和上一条统计TODO状态一样
  • C-S-Ret 当前级别子树后面插入TODO项目
  • C-c C-t 当前所在TODO项目状态切换(不一定要在TODO标题上面)

默认状态下,循环切换次序是TODO->Done->普通标题(只有*)。

  • S-RIGHT/S-LEFT 当前所处TODO标题上进行状态切换,默认状态下,循环切换次序是:TODO->DONE->普通标题
  • C-c , 修改优先级(包括A,B,C三个级别,不一定在TODO标题上面)
  • S-UP/S-DOWN 切换优先级,默认次序是A->B->C->无。
  • C-u C-c C-t 快捷切换状态,输入后会提示你要输入的状态,可以支持Tab补全,可以用快捷按键替代。
  • 光标停留在 [%] 或者 [%] 之上,输入 C-c C-c

4.2 交叉引用

因任务可能会在不同的文件与标题间迁移,所以需要为每一条目采用与文件与位置无关的id,即采用全局唯一id链接的方式实现交叉引用。

  1. 首先配置全局链接

    类似如下:

    ;;Settings for global id link.
    (require 'org-id)
    (setq org-id-link-to-org-use-id t)
    
  2. 为被引用标题创建全局链接id 保存链接内容的同时也创建了相应的链接。当然,这需要事先配置好保存链接快捷键

    (global-set-key "\C-cl" 'org-store-link)
    

    输入 C-c l 之后便创建好了相应的全局链接,类似如下:

    * 子树标题  
     :PROPERTIES:
     :ID:       60b13787-86e8-43a3-9a33-73d3eb7e6f58
     :END:
    
  3. 引用链接 像正常插入链接一样,输入 C-c C-l 即可,默认插入最近一次保存的链接。

    引用的格式举例

    [[id:60b13787-86e8-43a3-9a33-73d3eb7e6f58][子树标题]]
    

4.3 设置优先级别

4.3.1 可采用四象限法则,将事情按照重要和紧急两个不同的程度进行划分,分为四个“象限”。

第一象限

重要但不紧急的事。

法则重点,这才是最需要做的事。需要制定计划,按时完成。可以让你进入良性循环的做法!

第二象限

重要并紧急的事。

需要优先解决,这也是没有计划的做法,无休止地一直在“瞎忙”。

第三象限

不重要但紧急的事。

会让我们产生“这事很重要”的错觉。实际上就算重要也是对别人而言。我们花很多时间在这个里面打转。自以为是在第一象限,其实不过是在满足 别人的期望与标准。

第四象限

不紧急也不重要的事。

浪费时间,或者完全对自己完全无意义的事。如果有可能,交给别人去做。

我们把事项进行一些梳理,就会清楚自己的时间和精力主要应该用在什么地方了。

4.3.2 设置优先级

通过如下方式:

;;set priority
(setq org-highest-priority ?A)
(setq org-lowest-priority ?D)
(setq org-default-priority ?A)
(setq org-priority-faces '(
                           (?A . org-warning)
                           (?B . (:background "DodgerBlue" :foreground "black" :weight bold)) 
                           (?C . (:foreground "SkyBlue" :weight bold))
                           (?D . (:foreground "DodgerBlue" :weight bold)) 
                           )
)

4.3.3 切换优先级

在标题上输入 S-<up>/<down>

5w1h分析

4.4 Capture-Refile-Archive

4.4.1 概念

Capture用来迅速收集一些临时产生的想法,尽可能少的打断当前的工作状态。通过指定好快捷方式和相应的Capture目标位置后,在任意时间运行捕获命令会将这些临时的记录存放在一个指定的位置,空闲之时再做进一步整理。

Refile以特定的命令,用来将之前Capture的内容直接转移到特定的地方,避免了手动剪切(复制)和粘帖。

4.4.2 配置

4.4.2.1 Capture的配置

不同的管理方式可能会导致不同的配置,但是一般都包含两个方面:首先设置好一个启动Capture的快捷方式,再配置用于存储Capture信息的目的地。 这里以gtd管理为例给出一个配置例子:

;;Setting for gtd captures
;;Directory for capture files.
(setq org-directory "~/mydata/orgmode/")
;;Default capture files.
(setq org-default-notes-file (concat org-directory "gtd/inbox.org"))
;;Capture template
(setq org-capture-templates '(
			      ("t" "Tasks" entry (file+headline "gtd/inbox.org" "Tasks") "* INBOX %?\nTime:%T\nFrom:%F\n")
			      ("p" "Projects" entry (file+headline "gtd/inbox.org" "Projects")  "* %?\nTime:%U\nFrom:%F\n")
			      ("i" "Item notes" item (file+headline "gtd/inbox.org" "Items")  "+ %?\n  Time:%U\n  From:%F\n")
			      ("m" "Misc notes" plain (file+headline "misc.org" "Notes")  "-----------------------------------------------------\nTime:%U\n %?")
			     )
)
 
;;set tags
;;where?(h/o/w),what?(c/l/s),when?(gtd|immeiately,wait,action),who?(my gtd,others),why?how?(delete/archieve/schedule)
(setq org-tag-alist '(
                    (:startgroup . nil)
                         ("home" . ?r) ("office" . ?o) ("way" . ?w)
                    (:endgroup . nil)
                    ("职业" . ?c)
                    ("生活" . ?l) 
                    ("学习" . ?s)
                    ))
4.4.2.2 Refile的配置

主要配置两个方面的内容: Refile的目标(org-refile-targets),以及Refile时选择目标的策略(org-refile-use-outline-path会自动补全文件名以及标题,目标的格式类似文件路径的格式,包含文件和标题)。 org-refile-targets对应的可以是路径可以是列表,具体参考其中的文档,需要注意的是:

如果是列表
该变量中的文件路径需要是全路径;文件中需要有一个标题才能在做 C-c C-w 补全的时候显示出来,空文件不行。
如果是一个文件路径
如果org-refile-targets是一个文件,则:这个文件可以是一个文件列表,使用这个列表的文件做为refile目标; 每个文件项占一行(不要有""),文件项可以是对于org-directory的相对路径; 这样文件内容变化之后,不用重新载入配置也能在 C-c C-w 中显示出新增的文件; 如果有一项是文件目录,那么不要再次包含该目录下的文件,因为这样会在agenda view中导致重复显示。
;;targets for refile
(setq org-refile-targets (quote (
                                 (nil :maxlevel . 9)
                                 (org-agenda-files :maxlevel . 9)
                                )
                         )
)
;;outline path for refile
(setq org-refile-use-outline-path 'full-file-path)
;;org-outline-path-complete-in-steps
(setq org-outline-path-complete-in-steps t)
;;create new parents while refile
(setq org-refile-allow-creating-parent-nodes 'confirm)

4.4.3 操作

基于以上配置,我们可以操作如下:

  • 启动Capture 输入 C-c c 输入之后会提示选择捕获何种类型的信息,提示信息和选择命令取决于之前设置的配置变量 org-capture-templates
  • 选择将待捕获的信息存于"Tasks"标题之下 输入 t 具体如何输入取决之前的配置如何,这里输入之后会打开一个Capture Buffer,用于输入将要被记录的信息,其中按照预先配置好的模板,已经预先插入了一些基本信息(如时间、捕获信息时所处位置等等)。
  • 完成Capture 输入 C-c C-c 输入之后,会将buffer中相应的信息插入到之前配置好的位置(例如某个文件中的某个标题之下),然后回到之前被中断的工作状态。
  • 取消Capture 输入 C-c C-k 取消捕获的动作,回到之前被中断的工作状态。
  • 访问存放Capture的文件Buffer 输入 C-u C-c c 输入之后,会提示和 C-c c 一样的信息,选择相应的捕获类型后,会直接打开相关的文件,具体是何文件,取决于事先设置的信息。
  • 访问上次捕获所处的文件Buffer 输入 C-u C-u C-c c 类似前面,捕获访问的是记录上次捕获的文件Buffer,并自动定位到其中上次捕获的信息之上。
  • 以剪切方式Refile 输入 C-c C-w 输入之后,会提示Refile的目标位置(在org-agenda-files中列出),支持Tab补全,选择好相应的文件之后,可以继续将文件内的标题也类似路径的方式输入(也支持TAB补全),选择好之后,回车会将相应的内容移动到对应的目标位置。注意:移动的内容可以是用Mark方式选择的区域,或者当前光标所在的子树,在执行 C-c C-w 之后有提示。
  • 以复制方式Refile 输入 C-c M-w 输入之后,会提示Refile的目标位置(在org-agenda-files中列出),支持Tab补全,选择好相应的文件之后,可以继续将文件内的标题也类似路径的方式输入(也支持TAB补全),选择好之后,回车会将相应的内容复制到对应的目标位置。注意:复制的内容可以是用Mark方式选择的区域,或者当前光标所在的子树,在执行 C-c C-w 之后有提示。
  • 访问Refile的目标对应Buffer 输入 C-u C-c C-w 输入之后,会提示和 C-c C-w 一样的信息,选择相应的位置后,会直接打开相关的文件。
  • 访问上次Refile所处的文件Buffer 输入 C-u C-u C-c C-w 类似前面,访问的是记录上次Refile的文件Buffer,并自动定位到上次Refile目标的信息之上。

4.5 归档

具体配置方式可以参见: C-h v org-archive-default-command, C-h v org-archive-location, C-h v org-archive-save-context-info

4.5.1 配置归档位置和归档后附带信息

将内容根据“年-月-日-包含文件名的标题-被归档的标题”的层次,归档在指定的_archive/session<年月>_archive.org文件中,归档之后,被归档节点属性包含:时间、文件、标签、todo状态、分类、节点在归档前的路径等信息。

;;location for archive
(setq org-archive-location (concat org-directory "gtd/_archive/" (format-time-string "%Y%m") "_archive.org::datetree/* Archive from %s"))
;;information added to property when a subtree is moved
(setq org-archive-save-context-info '(time file ltags itags todo category olpath))

注意,以上归档文件名为类似 session201511_archive.org ,这里的时间应该是启动Emacs会话的时间并非归档操作的时间。

4.5.2 归档命令

输入 C-c C-x C-s

4.5.3 举例

如上配置之后,例如

*Title1
**DONE sub title1 
CLOSED: [2015-11-27 五 14:17]
- State "DONE"       from              [2015-11-27 五 14:17]
***subsub title1
****DONE subsubsub title1
CLOSED: [2015-11-27 五 14:18]
- State "DONE"       from              [2015-11-27 五 14:18]
****subsubsub title2
****subsubsub title3
***subsub title2
**sub title2

注意以上格式中,标题前面应该和'*' 之间有一个空格。执行 C-c C-x C-s 之后,会在相应路径生成一个201510_archive.org文件,追加了如下内容:

*2015
**2015-11 十一月
***2015-11-27 星期五
****Archive from orgmodetest.org
*****DONE subsubsub title1
CLOSED: [2015-11-27 五 14:18]
:PROPERTIES:
:ARCHIVE_TIME: 2015-11-27 五 14:23
:ARCHIVE_FILE: ~/test/emacs/orgmodetest.org
:ARCHIVE_TODO: DONE
:ARCHIVE_CATEGORY: orgmodetest
:ARCHIVE_OLPATH: Title1/sub title1/subsub title1
:END:
- State "DONE"       from              [2015-11-27 五 14:18]

4.6 便于整理周报的记录技巧

  • 按照时间列出处理情况

为便于整理工作周报,可以将每天的记录工作首先按日期时间在每个TODO项目上创建子标题。每个子标题下记录详细工作日记日志。

例如:

*[2015-10-30 五 09:43] xxxxxx

如果需要在agenda中列出时间,那么使用激活的时间戳即可。标题尽量简单叙述当前的工作情况。写周报的时候只看这个地方就行了。

另外,每个TODO任务中如果设置了状态切换的日志,这样可能会和处理进度的子标题有些意义冲突,目前对此不做过多考虑,不会在状态切换日志中记录过多信息,并且状态切换日志仅在wait和cancel中记录。

经过以上方式之后,做周报时,大致可以按照每个TODO项的日期时间标题来进行搜集。

4.7 orgmode与mobile org整合

MobileOrg是Mobile端的一个应用程序,运行在Android(也有IOS的MobileOrg);Org是PC端Emacs的一个插件应用,对应其Orgmode模式。

对其具体操作方式在orgmode的文档中有专门的介绍,并且不断更新,这里讲述相对固定的管理方式方面的内容。描述如何用Org创建可以通过MobileOrg显示的文档格式,以及如何将Mobile端的MobileOrg中修改和捕获的笔记,集成到PC端的“主” Org mode系统中(即Org与MobileOrg的同步),不涉及Agenda相关的操作。

4.7.1 配置

为了在MobileOrg中能够修改tags和TODO状态,你应该在PC端设置好自定义变量: org-todo-keywordsorg-tag-alist ,使它们包含所有需要修改的重要的tags和TODO keywords,哪怕每个文件只使用其中的部分内容。MobileOrg也能通过in-buffer settings来为你提供TODO和tags设置,但是它只能读懂这些变量中的那些设置好的TODO状态集合以及tags。

假设我们想要使PC上的Org与移动设备上的MobileOrg保持内容同步(底层通过git机制,也可以是云存储、ssh、ftp等机制)。这里给出为实现这个目的,在PC需要做的配置工作(移动端的MobileOrg做为辅助工具,其配置和操作非常简单,在适当的时候会提及)。

4.7.1.1 在PC上添加使用MobileOrg的emacs配置

主要包括对Emacs中org-mode模块的加载以及与MobileOrg同步的路径。 例如:

;;Sync with mobileorg
(require 'org-mobile)
;;mobile stage
(setq org-mobile-directory "/home/miracle/mygitrepo/pocket/MobileOrg")

另外,可以通过 org-mobile-encryption-password 设置加密方面的内容。
在后面我们可知,在PC上的orgmode中有特定的命令将相关内容推送到这个目录中。

4.7.1.2 在PC上添加同步orgmode和MobileOrg的emacs配置

主要包括PC端和MobileOrg端状态与标记的设置,PC上被推送orgmode内容的源文件路径,以及PC上接收MobileOrg修改的缓存路径设置。

  1. 为被推送文件定义只属于该文件的状态和标记

    被推送的文件可使用文件选项定义相关的状态和标签(实践发现不用定义文件的状态和标签也行),定义内容最好和PC上的相关状态变量(即 setq org-todo-keywords )一致,或者是其子集。如果使用文件定义状态,那么可以将用于push到MobileOrg的文件中的状态设置选项如下:

    #+TODO: INBOX(i!) NEXT(n!) LATER(l!) WAIT/FORWARD(w@/!) MAYBE/FUTURE(m!) | CANCEL(c!) DONE(d!)
    

    标记的设置类似。

  2. 设置状态关键字和被推送至MobileOrg的文件列表路径

    如下

    ;;set status for TODO.
    (setq org-todo-keywords '((sequence 
    "INBOX(i!)"
    "NEXT(n!)"
    "LATER(l!)"
    "WAIT/FORWARD(w@/!)"
    "MAYBE/FUTURE(m!)"
    "|" "CANCEL(c!)" "DONE(d!)"
    ))
    )   
    
    ;;mobile push
    (setq org-mobile-files (list 
    (concat org-directory "gtd/mobile_org")
    )
    )
    
  3. 设置接收来自MobileOrg内容的“缓存”目标文件路径

    如下

    ;;mobile pull
    (setq org-mobile-inbox-for-pull 
    (concat org-directory "gtd/from_mobile.org")
    )
    

4.7.2 原理

4.7.2.1 Mobile端的Mobile Org与PC端的Org同步

当我们在MobileOrg中与PC端的Org同步时,需要知道它不仅仅是从PC端获取(mobile端的pull)相应org文件用于浏览,同时也会追加(mobile端的push)被captured的entries,并且指向被标记和修改的entries,这些内容被汇总在同步目录( org-mobile-directory )中的 mobileorg.org 文件里。

4.7.2.2 PC端的Org与Mobile端的MobileOrg同步
  1. PC端的Pull

    获取MobileOrg修改内容(PC端的pull)的时候,会将这些信息从 mobileorg.org 先转移到到 org-mobile-inbox-for-pull 对应的文件中,并对指向的被标记的内容进行进一步操作,进而将能够自动处理内容同步到对应的文件中。 Pull的过程大致过程如下:

    1. Org将会将 mobileorg.org 中的所有entries移动到 org-mobile-inbox-for-pull 所指向的文件(假设为mobileinbox),每个被捕获的entry和编辑事件都会被做为这个mobileinbox中的顶级entry而存在。(进行操作之后, mobileorg.org 将会被清空)
    2. 当将entries移动到 org-mobile-inbox-for-pull 指向的文件之后,Org将会开始执行在MobileOrg进行的修改。有些修改直接就会被应用了不需要额外的用户交互(例如修改tag、TODO状态、标题、正文文本可以被简单的应用)。而需要额外动作的entries会接收到一个:FLAGGED:的tag,这样它们才会很容易地被找到。当应用修改或者寻找一个entry之时出现了问题,目标entry将会保持在 org-mobile-inbox-for-pull 中,并且被标记一个错误信息,我们需要之后手动解决这些问题,并将对应内容(entry)转移到期望的位置。
    3. (不熟悉)Org之后会生成一个包含所有flagged的entries的agenda view,用户可以遍历这些entries来做一些必要的动作。如果在对MobileOrg中的entry进行标记的时候一个note已经存储了,那么这个note会在光标处于对应agenda line的时候在回显区域显示出来。
      关于 ?
      在哪个特定的agenda中按下 ? 将会在另外一个windows中显示整个被标记的笔记(flagging note),也会将它push到kill ring中。所以,你可以在这个entry中使用 ?z C-y C-c C-c 保存哪个标记笔记为普通笔记。连续键入 ? 两次将会体同将 :FLAGGED:标签联通记录的标记笔记(flagging note)(在一个属性中被保存)一起被移走。这样,你可以用此来表示这个 flagged entry的处理已经完成。如果你不能够直接处理所有的flagged entries,你可以通过 C-c a 回到这个agenda view。
  2. PC端的Push

    推送内容到MobileOrg端(PC端的push)的时候,会推送PC上设置的 org-mobile-files 对应的文件,该变量对应的文件路径是相对 org-directory 的路径,默认使用 org-agenda-files ,被退送的目标是 org-mobile-directory 设定的位置。 Push的过程大致如下:

    1. 拷贝 org-mobile-files 中的内容到同步目录 org-mobile-directory 中,文档中提到,如果待推送的文件是一个链接文件,那么链接文件名称需要和源名称一致。
    2. 创建特定的agendas.org文件,这些文件可以是用户自定义的agenda view,由 org-mobile-agendas 来设定。
    3. 最后,orgmode会写一个 index.org 文件,这个文件包含所有到其他文件的链接,Mobile首先在Server中读取这个文件,然后把这个文件中列出的所有agendas文件和org文件下载下来,为了加速下载过程,MobileOrg只读取checksums3被改变的文件。
4.7.2.3 Org与MobileOrg的同步目录

我们需要注意,在前面的讲述中所涉及到的同步,其实暗含了两种同步:

  1. Mobile端的MobileOrg与PC端的Org之间的同步(通过设定一个同步目录做为中转) 这个前面也讲到,主要是Mobile端的Sync(包含Push/Pull)操作,以及PC端的Push/Pull操作。
  2. 同步目录在云端与PC/Mobile端的同步 前面MobileOrg和Org同步之时,需要经过它们之间的一个共通的“同步目录”。这个目录在Mobile端和PC端的内容和结构需要首先保持一致,才能保证后续MobileOrg和Org之间数据的同步一致。所以,我们在同步PC端的Org与Mobile端的MobileOrg之前,先将PC端和Mobile端的目录通过某种方式进行同步。

    这里同步目录的方式使用用git进行,PC端和Mobile端之间的同步目录用某个git托管服务器进行管理(例如github、bitbucket、或者自己的服务器),任意端的同步目录中数据发生变化后都要推送到托管服务器中,而任意端要读取最新数据都需要从托管服务器中拉取数据,同步目录中的数据更新之后,再进行后续MobileOrg和Org的数据更新。我们也可使用其它方式管理同步目录,比如云存储(百度云、DropBox等)、或者ftp、webdav、ssh等。

    另外,Mobile端的git可以使用pocketgit工具。

4.7.3 同步操作

4.7.3.1 PC端的Org推送(Pull)

命令如下:
M-x org-mobile-push
推送之后,会在同步目录(即 org-mobile-directory 对应的路径)中建立 org-mobile-files 对应文件列表的路径结构,并拷贝相应文件到其中。

4.7.3.2 PC端的Org拉取(Push)

命令如下:
M-x org-mobile-pull
运行之后,其对应的 org-mobile-files 便包含了和MobileOrg同步的内容。

4.7.3.3 Mobile端的MobileOrg同步(Sync)

这里使用Android版本的MobileOrg,大致如下:
首先设置好同步目录,然后选择软件界面中的"Sync"按钮,即可完成同步(包含Pull和Push)。

4.7.4 使用举例

  1. PC上配置好相关变量和目录
  2. 手机上安装好MobileOrg也设置好同步目录
  3. 将PC和手机上的同步目录用github/bitbucket管理
  4. PC上同步目录更新: git/pull
  5. PC上记录之前运行: org-mobile-pull 可以看到手机上修改的内容。
  6. PC上记录,记录之后运行: org-mobile-push
  7. PC上的git同步目录上传修改: git add/commit/push
  8. 手机上的git同步目录下载更新: git pull
  9. 手机上的MobileOrg同步(点击Sync)
  10. 手机上看到PC修改的内容
  11. 手机上修改并同步(点击Sync)
  12. 手机上更新同步目录: git add/commit/push
  13. 回到步骤4。

4.7.5 其它

目前发现,该功能列表中的段落,无法识别断行?对复杂的管理不是非常实用,相对而言,mobile org中Capture功能相对实用一些,可以将片段捕捉下来,同步到电脑上(但是同步的过程也比较繁琐)。

参考相关文档:MobileOrg

4.7.5.1 改进
  • 已经将状态文件冠以 _ 前缀,便于在Agenda View中集中浏览,例如: _inbox.org, _next.org …。
  • 每一步处理中,处理子项的步骤可以按照层次冠以 ---- 前缀, n层子处理步骤冠以n个 =-—=前缀。例如:

    **NEXT test1
    ***----<2015-12-21 一 16:17> xxx1
    ***----<2015-12-21 一 16:17> xxx2
    ****--------<2015-12-21 一 16:17>xxx2.1
    ****--------<2015-12-21 一 16:17>xxx2.2
    

    这样显示便于在Agenda中一目了然哪些是子待办事项,以4个为单位因为4个字符比较容易输入。

  • 回顾的细化:短期回顾简单处理时,会将特定状态关键字的任务从状态文件间迁移,稍复杂的处理会将任务直接迁移至特定文档中(在该文档中做为属于该文档的任务);中期处理之时,除了对应状态关键字和状态文件,也对状态关键字的任务必要时迁出状态文件进入特定文档中。

5 WAIT/FORWARD FAQ [8/11]([72%])

  • State "WAIT/FORWARD" from "NEXT" [2015-11-27 五 15:07]
    Wait for all done.
  • State "NEXT" from [2015-11-27 五 15:07]

5.1 DONE 如何划分任务状态以及存放的文件?

  • State "DONE" from "NEXT" [2015-10-08 四 10:23]

参见: 任务状态划分文件

5.2 DONE 如何实现任务管理的基本管理?

  • State "DONE" from "WAIT/FORWARD" [2015-11-27 五 16:13]
  • State "WAIT/FORWARD" from "LATER" [2015-11-27 五 16:13]
    wait for more
  • State "LATER" from "NEXT" [2015-11-27 五 16:13]
  • State "NEXT" from "INBOX" [2015-11-27 五 16:13]

参见:实现Orgmode任务管理的基本管理

5.3 DONE 如何设置交叉引用?

  • State "DONE" from "NEXT" [2015-11-26 四 17:51]

参考:交叉引用

5.4 DONE 如何设置优先级别?

  • State "DONE" from [2015-11-26 四 18:00]

参考:设置优先级别

5.5 DONE 如何迅速捕获临时产生的任务,以及将各个任务标题在状态文件中进行转移?

  • State "DONE" from [2015-11-30 一 10:38]

参见:Capture-Refile-Archive

5.6 DONE 如何设置归档?

  • State "DONE" from "NEXT" [2015-11-27 五 14:54]

参见:归档

5.7 DONE 便于整理周回顾?

  • State "DONE" from [2015-11-27 五 10:35]

参见:便于整理周报的记录技巧

5.8 DONE 如何将PC与移动端的orgmode整合?

  • State "DONE" from [2015-11-27 五 11:02]

参见:orgmode与mobile org整合

5.9 LATER 杂乱问题

  • State "LATER" from "NEXT" [2015-11-27 五 16:13]
  • State "NEXT" from [2015-11-27 五 15:29]

这里描述一些无法分类是杂乱问题。

  • 进入 inbox.org的 INBOX 的任务,在回顾的时候,首先切换其状态,然后再refile到对应的状态文件?

    目前是对于到状态文件的任务,是先切换,再refile;对应其它特殊文档内部的TODO任务,refile与切换次序随意。

  • 每个状态,工作日志记录到有状态切换的日志中,还是也可能根据自己情况记录工作日志?

    不用都加note,也可每个状态切换都加详细的note。折衷起见,主要处理信息还是列在后面。状态切换的列表中,可以添加每次关键的一些步骤。比如NEXT状态中,又获取到一些新的信息,可以切换状态增加NEXT->NEXT的时间戳,然后附上一个简短笔记“xxx发生了”。

5.10 NEXT 改善归档与done/cancel策略

  • State "NEXT" from [2016-02-03 三 09:43]

之前都是将done和cancel状态的内容放置目录中,按照月份存放相应状态内容,原因是相应状态的内容是属于不断积累增多的,不可能只放在一个文件中。

考虑到归档的功能,其实将done/cancel内容放置在一个文件也可,只需要定期进行归档即可,积累的内容会不断地移动到归档中,而归档又可根据日期来进行划分。

而wait/forward中的内容,需要再考虑如何进行,目前暂不设定归档, 设置的方式也仍然采用目录的方式,以便学习时能够知道目录目标的设置方式。

5.11 NEXT 改善refile的配置方式

  • State "NEXT" from [2016-02-03 三 09:46]

将refile目标放置到一个文件中,有时候会出现问题,目前不再使用这个方法。直接将refile的目标配置到配置文件中,这样更为保险。

;;set agenda files
(setq org-agenda-files (list 
                        (concat org-directory "gtd/_next.org") 
                        (concat org-directory "gtd/_later.org") 
                        (concat org-directory "gtd/_wait_forward.org") 
                        (concat org-directory "gtd/_maybe_future/") 
                        (concat org-directory "gtd/_cancel.org")
                        (concat org-directory "gtd/_done.org") 
                        (concat org-directory "gtd/mobile_org/_mobile_inbox.org") 
                        (concat org-directory "gtd/_active") 
                        (concat org-directory "gtd/_review") 
                        (concat org-directory "gtd/output/")
                       )
)