Org GTD is an attempt to implement the GTD flow described in the GTD book as faithfully as possible.
This manual is for Org GTD version 3.0
Copyright (C) 2018-{{{year}}} Aldric Giacomoni <[email protected]>You can redistribute this document and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
This package tries to replicate as closely as possible the GTD workflow (see diagram below).This package, and this documentation, assume familiarity with the flow of GTD as described in the book.
This package provides a system that allows you to capture incoming things into an inbox, then process the inbox and categorize each item based on the GTD categories. It leverages org-agenda to show today’s items as well as the NEXT items. It also has a simple project management system, which currently assumes all tasks in a project are sequential.
+-------+ |"STUFF"| +---+---+ | +---v---+ | INBOX | +---+---+ | Eliminate +-----------+ | +----------->| Trash | +------v------+ | +-----------+ | What is it? | | +------+------+ | +-----------+ | | Incubate | Someday/ | | +----------->| Maybe | +----------+ YES (multi-step) +------v------+ NO | +-----------+ | Projects |<--------------------| Is it |-----+ +-+----^---+ | Actionable? | | File +-----------+ | | +----------------+ +------+------+ +----------->| Reference | | | Review for | | +-----------+ +-v----+---+ Actions | | | Planning | +---------->| YES +----------+ | +------v------+ Less than Delegate | What's the | 2 minutes +-----------+ +-----------+ NEXT +----------------->| DO IT | | | Action? | +-----------+ | +------+------+ | | | | FOR ME: | | Specific Date or Time | +-------------------------------+ | ASAP| | +-----v-----+ +-----v-----+ +-----v-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-----------+ +-----------+ +-----------+ Waiting For Next Actions Calendar
It became too difficult for me to support 27.1.
- Habits have their place now (h)
- What used to be called “archive” is now called “knowledge” (k)
- Modify project is now “Add to project” (a)
There’s now two more powerful commands you can use to clarify almost anything:
org-gtd-clarify-item
org-gtd-clarify-agenda-item
These both allow you to enter a one-off clarify/organize flow.
Make GTD truly a part of your emacs experience! These functions take various arguments (check the documentation in emacs) and automatically add something to your org-gtd. This would be useful after sending an email, for instance. Please share your own hooks as issues in Github or in the discord so we can create a community library!
org-gtd-habit-create
org-gtd-calendar-create
org-gtd-delegate-create
org-gtd-incubate-create
org-gtd-single-action-create
Org mode’s habits now have a specific place here.
See all the configuration options
The package domain now is a better match for the domain language of GTD.
Functions use the words capture
, process
, clarify
, organize
, review
.
- SCHEDULED and DEADLINE are intended to be used for things that have to start and things that have to end, respectively. V2 abused them, v3 is more respectful of how org-mode wants to work.
- We use our own timestamp property. For compatibility with orgzly, we currently duplicate the timestamp into the body.
- They can be displayed while clarifying
- There’s an optional organize-hook for areas of focus
- There’s an agenda view for areas of focus
Working with the GTD Horizons.
Options and commands related to clarification
If you are installing and not upgrading, you can skip this section entirely and just go to the next section, Installing.There’s a lot here, so you may want to make yourself some tea. We have to cover support for org habits, upgrading data, key changes in the configuration, a change in the menu, and the rest of the API changes. And once that’s done, you should head back to the What’s new in 3.0 section to see what else is available for you!
Beta testers using doom emacs found they needed to do a fully clean install. The regular upgrades did not work. We could not find a clean fix. We suspect this is related to org-mode being a very complex beast, but we’re not sure.
For the sake of keeping the org-agenda-custom-commands
as simple as possible, habits are now stored under headings with the property ORG_GTD: Habits
. The same rules for refiling apply to these headings.
Some not-inconsequential data structure changes happened under the hood. To keep using org-gtd
you will need to upgrade your data, using M-x org-gtd-upgrade-v2-to-v3
.
Backups are always recommended, even though there are tests.
Note that if there are any habits managed by org-gtd v2
then they will be moved to a heading * Habits
, in a file called org-gtd-tasks.org
, in org-gtd-directory
.
Here’s a table of the changes, with sample config change and explanations afterwards.
2.0 | 3.0 |
---|---|
org-gtd-process-mode | org-gtd-clarify-mode |
org-gtd-process-map | org-gtd-clarify-map |
org-gtd-choose | org-gtd-organize |
org-gtd-process-item-hooks | org-gtd-organize-hooks |
org-gtd-capture-templates | Now looks like org-capture-templates |
Projects :TRIGGER: | changed again (see below) |
org-gtd-agenda-custom-config | gone (see below) |
org file headers | Drop ‘em (see below) |
(use-package org-gtd
:after org
:quelpa (org-gtd :fetcher github :repo "trevoke/org-gtd.el"
:commit "3.0.0" :upgrade t)
:demand t
:custom
(org-gtd-directory "~/org-gtd")
(org-edna-use-inheritance t)
(org-gtd-organize-hooks '(org-gtd-set-area-of-focus org-set-tags-command))
:config
(org-edna-mode)
:bind
(("C-c d c" . org-gtd-capture)
("C-c d e" . org-gtd-engage)
("C-c d p" . org-gtd-process-inbox)
:map org-gtd-clarify-map
("C-c c" . org-gtd-organize)))
The new trigger line looks like this:
:TRIGGER: org-gtd-next-project-action org-gtd-update-project-task!
This allows us to define these functions as flexibly as we want, in the future, and that will mean we can expand what it means to be a project in the future.
Most of you users have not had to touch this, so you probably won’t have a use for this section of the upgrade documentation.
The new data structure is now a complete parallel for the org-capture-templates
structure, so you can see how to structure it by looking at the help file for that.
The key elements are still the same, however:
- the template has to start with a single asterisk
- the entry has to be
entry (file ,#'org-gtd-inbox-path)
This customization is no longer in use. It wasn’t an easy decision to make, but I have to make way for bigger, future changes in org-gtd over the next major releases.
If you have an existing org-gtd-agenda-custom-commands
setup, then you can do something like this to keep using it. In short, for now, create your own function, and wrap the definition with the with-org-gtd-context
macro. You can see the source code of org-gtd-engage
for an example.
; only so I refer to it with a name in this snippet
(setq my-commands org-gtd-agenda-custom commands)
(defun my-org-gtd-engage ()
(interactive)
(with-org-gtd-context
(let ((org-agenda-custom-commands my-commands))
; "g" is what the previous command used, replace with what you need
(org-agenda nil "g"))))
The TODO keywords are now customizable (see M-x customize-group org-gtd RET
), while they were hard-coded in v2. Those hard-coded values are now the defaults, but you should remove the hard-coded values anyway, so remove the following line:
#+TODO: NEXT(n) TODO(t) WAIT(w@) | DONE(d) CNCL(c@)
- Habits have their place (
h
) - What used to be called “archive” is now called “knowledge” (
k
) - Modify project is now “Add to project” (
a
)
Do note that that “a” got completely reassigned! If you used to use it for items that went into your personal knowledge management system, you’ll need to retrain yourself.
I’m very sorry about this. In the future, you’ll be able to customize this UI.
This is the function to call if you want to delegate without refiling.
V3 means you can freely clarify and organize anything in the agenda with the above function.
The nomenclature changes here because of an effort to, over time, define a better language for GTD, slicing vertically through org-mode features.
Same reason as above.
Same reason as above.
Same reason as above.
Go check out What’s new in 3.0 as well as Configuring.
The upgrade to 2.0.1
allowed addition of a task as the first task of an existing project while organizing a clarified item.
2.0.2
allows the user to choose what they prefer. Correspondingly, it lets the org-mode
variable org-reverse-note-order
operate as it should. In your configuration, use:
(setq org-reverse-note-order t) ;; refile to the top of the list, or
(setq org-reverse-note-order nil) ;; refile to the bottom of the list
Note that if you’re upgrading directly from 2.0.0 you still need to make the adjustment to the TRIGGER for your project headings.
In order for project modification to work, you will need to go to every Project heading that you have. You will find the following:
:PROPERTIES: :TRIGGER: next-sibling todo!(NEXT) :ORG_GTD: Projects :END:
And you will need to update the trigger so it looks like this:
:PROPERTIES: :TRIGGER: relatives(forward-no-wrap todo-only 1 no-sort) todo!(NEXT) :ORG_GTD: Projects :END:
Now be sure to set the following variable in your config file, before org-gtd loads, to disable the loud warning:
(setq org-gtd-update-ack "2.1.0")
That is it! You’re ready to add tasks to existing projects while processing the inbox.
Org GTD now handles dependency loading more intelligently, so you no longer need the overly complicated setup of org-gtd
, org-agenda
and org-capure
in your config for dependency loading. You now only need org-gtd
. If you are using use-package
then the following is the minimal config required.
(use-package org-gtd :after 'org)
You no longer need to configure org-agenda-property-list
yourself. Org GTD now manages the context with a macro, with-org-gtd-context
. Any prior configuration of this subpackage can be handled as you did before.
You no longer need to configure org-agenda-files
. Same reason as above. This allows you to use org-gtd without destroying your previous setup, and makes it easier to try org-gtd and then get rid of it if you don’t like it.
You no longer need to configure org-agenda-custom-commands
. Now there’s org-gtd-agenda-custom-commands
to take the relay - see the variable documentation for more information.
The org-capture templates are now simplified and managed by org-gtd-capture-templates
. If you did not change the default configuration, then you can just remove what you had. Read the variable documentaton for further information.
My org-gtd config for 1.x was as follows:
(use-package org-gtd
:after org
:quelpa (org-gtd :fetcher github :repo "trevoke/org-gtd.el"
:commit "1.1.1" :upgrade t)
:demand t
:custom
(org-gtd-directory "~/org-gtd")
(org-agenda-property-list '("DELEGATED_TO"))
(org-edna-use-inheritance t)
:config
(org-edna-load)
:bind
(("C-c d c" . org-gtd-capture)
("C-c d a" . org-agenda-list)
("C-c d p" . org-gtd-process-inbox)
("C-c d n" . org-gtd-show-all-next)
("C-c d s" . org-gtd-show-stuck-projects)
:map org-gtd-process-map
("C-c c" . org-gtd-choose)))
(use-package org-agenda
:ensure nil
:no-require t
:after (org-gtd)
:custom
(org-agenda-skip-deadline-if-done t)
(org-agenda-skip-scheduled-if-done t)
(org-agenda-files `(,org-gtd-directory))
(org-agenda-custom-commands '(("g" "Scheduled today and all NEXT items" ((agenda "" ((org-agenda-span 1))) (todo "NEXT"))))))
(use-package org-capture
:ensure nil
:after org-gtd
:config
(setq org-capture-templates `(("i" "Inbox"
entry (file ,(org-gtd--path org-gtd-inbox-file-basename))
"* %?\n%U\n\n %i"
:kill-buffer t)
("t" "Todo with link"
entry (file ,(org-gtd--path org-gtd-inbox-file-basename))
"* %?\n%U\n\n %i\n %a"
:kill-buffer t))))
And my config for 2.0 is:
(use-package org-gtd
:after org
:quelpa (org-gtd :fetcher github :repo "trevoke/org-gtd.el"
:commit "2.0.0" :upgrade t)
:demand t
:custom
(org-gtd-directory "~/org-gtd")
(org-edna-use-inheritance t)
:config
(org-edna-mode)
:bind
(("C-c d c" . org-gtd-capture)
("C-c d e" . org-gtd-engage)
("C-c d p" . org-gtd-process-inbox)
("C-c d n" . org-gtd-show-all-next)
("C-c d s" . org-gtd-show-stuck-projects)
:map org-gtd-process-map
("C-c c" . org-gtd-choose)))
org-agenda-list
->org-gtd-engage
org-gtd-clarify-finalize
->org-gtd-choose
(see the section on Key bindings below)
You need to rename CANCELED to CNCL. a simple string replace in the org-gtd-directory
will do the trick.
Org GTD no longer uses the name of the heading to figure out how to refile things, and which headings are useful. Instead it uses a custom Org property called ORG_GTD. This means you are free to rename the existing headings whatever you want, but you DO need to make some adjustments to your current files.
If you would like to add new refile targets, it’s simple, follow these instructions.
For projects, make sure the heading has the following two properties.
:PROPERTIES:
:TRIGGER: next-sibling todo!(NEXT)
:ORG_GTD: Projects
:END:
For other headings, make sure there is an ORG_GTD property, like for the project, above.
The other ORG_GTD properties are set as follows. Note that Single and Delegated actions are together now, so you can merge those headings if you want.
- Scheduled actions
ORG_GTD: Calendar
- Single & Delegated actions
ORG_GTD: Actions
- Incubated actions
ORG_GTD: Incubated
For incubated actions, version 1.x of Org GTD asked for second-level heading, such as *To Read
. No more - these are now top-level headings, exactly as described above, with a heading property of ORG_GTD: Incubated
.
There is a new variable, org-gtd-refile-to-any-target
. By default this variable is set to t
. This means that Org GTD will refile to whatever the first target it finds is. This is the default value because it most closely matches the behavior for version 1.x.
THIS BEHAVIOR ALSO APPLIES TO INCUBATE REFILE TARGETS. Therefore, if you have multiple incubated refile targets, you will need to set this variable to nil
, or change to a single refile target. You can e.g. set a custom property to describe the kind of incubated item it is, if it is useful to you, something like:
* Incubated ** Buy a boat SCHEDULED: <2035-06-01 Fri> :PROPERTIES: :INCUBATE: big financial investment :END:
Version 1.x of Org GTD recommended a binding for org-gtd-clarify-finalize
. This binding must now be set as follows (replace the keybinding with one of your choice):
(define-key org-gtd-process-map (kbd "C-c c") #'org-gtd-choose)
This package is on MELPA and MELPA stable under the name org-gtd
.
Just make sure this is loaded after org-mode
like so.
(use-package org-gtd :after org)
Check out the source code for dependencies and install them.
Then, clone this repo to a directory of your choice, e.g. ~/.emacs.d/packages
.
Finally, add this to your config:
(add-to-list 'load-path "~/.emacs.d/packages")
(require 'org-gtd)
Just turn on org-gtd-mode
(M-x org-gtd-mode
). This will set up emacs, Org mode, and Org GTD’s dependencies. It will wrap a number of org-agenda
functions to work smoothly. If you are just testing out Org GTD, this is a good way to start.
Turn off org-gtd-mode
to restore emacs to pre-org-gtd settings.
Note, you should still head over to the Recommended key bindings section.
package: https://www.nongnu.org/org-edna-el/This is one of the dependencies. This setting change is REQUIRED. It automatically changes the next TODO heading to NEXT in a project when you’ve finished the current task.
You do not need to make this change if you choose to toggle org-gtd-mode
.
(setq org-edna-use-inheritance t)
(org-edna-mode 1)
The most direct way to find out about the configuration options for org-gtd is to see the customize group: M-x customize-group RET org-gtd
. They are all optional because they all come with default values.
The only one you may want to change before starting to use Org GTD is org-gtd-directory
, which is the directory that Org GTD
will look to for everything it needs to do.
The configuration options will also be mentioned in the relevant subsections of Using Org GTD.
Make sure you also read about sub-package configuration: Required configuration of sub-packages.
org-gtd-directory
- set this to a directory.
org-gtd
will look for all its files in this directory. org-gtd-next
- Keyword to use for actions ready to be taken
org-gtd-next-suffix
- org-mode keyword suffix (e.g. !, @)
org-gtd-todo
- Keyword to use for actions not yet ready
org-gtd-todo-suffix
- org-mode keyword suffix (e.g. !, @)
org-gtd-wait
- Keyword to use for blocked actions (e.g. delegated)
org-gtd-wait-suffix
- org-mode keyword suffix (e.g. !, @)
org-gtd-done
- Keyword to use for completed actions
org-gtd-done-suffix
- org-mode keyword suffix (e.g. !, @)
org-gtd-canceled
- Keyword to use for actions that won’t be done
org-gtd-canceled-suffix
- org-mode keyword suffix (e.g. !, @)
org-gtd-capture-templates
- (!note: take care when changing this) This defines the pre-filled text that will show up when capturing an item to the inbox. The only requirements are that the template string must define an org-mode top-level heading, and that the entry point to the inbox. That is to say, the first two characters must be a single asterisk followed by a space:
"* "
, and the entry type must be like this:entry (file ,#'org-gtd-inbox-path)
. Adding things to the inbox. org-reverse-note-order
- (
org-mode
variable) set this tot
to add new items to the top of project tasks and tonil
to add new items to the bottom of project tasks when organizing an item as such. org-gtd-organize-hooks
- this is a list of functions that you can use to decorate each item when you clarify it. For instance, you could add a function to set the effort, or the priority, or some category, etc. By default it has only one function, which lets you add tags, but of course you can change this entirely. Organizing an item.
org-gtd-archive-location
- Points to a function to generate the archive file dynamically. Default value generates a file suffixed with the current year. The function has an arity of zero and generates an org-mode file+outline path. Cleaning up / archiving completed work.
org-gtd-refile-to-any-target
- when
t
,org-gtd
will refile to the first target it finds, and create a target if it doesn’t find one. When false, it will ask for confirmation before refiling. Refiling to the appropriate area. org-gtd-delegate-read-func
- function that is used to prompt for a person a task is delegated to. Must return a string. By default this is set to
read-string
. org-gtd-areas-of-focus
- list of strings representing your areas of focus (horizon 2 in GTD).
org-gtd-clarify-show-horizons
- When clarifying, do you want the horizons buffer to be shown by default, or do you prefer it hidden?
org-gtd-clarify-project-templates
- Alist of strings:
project template name . project template
where there template is a series of tasks you may want to insert automatically, if you have a generic type of project that comes up a lot. org-gtd-horizons-file
- Name of the file, in
org-gtd-directory
, that will be displayed when the horizons buffer is displayed when clarifying. org-gtd-engage-prefix-width
- how many characters to dedicate to the prefix, on the left side of the TODO items, so the project name, if any, can show clearly.
There’s an important keymap you’ll want to make the flow of processing the inbox smoother. To limit impact on your emacs configuration, there is a specific keymap you can use. The function you’ll want to bind is org-gtd-organize
. I suggest C-c c
, as in the following example.
(define-key org-gtd-clarify-map (kbd "C-c c") #'org-gtd-organize)
For other keybindings, do what you need. My bindings use C-c d
as a prefix, i.e.:
C-c d c
org-gtd-capture
C-c d e
org-gtd-engage
etc.
If you are a Doom Emacs user, then your configuration may look something like this:
(use-package! org-gtd
:after org
:config
(setq org-edna-use-inheritance t)
(org-edna-mode)
(map! :leader
(:prefix ("d" . "org-gtd")
:desc "Capture" "c" #'org-gtd-capture
:desc "Engage" "e" #'org-gtd-engage
:desc "Process inbox" "p" #'org-gtd-process-inbox
:desc "Show all next" "n" #'org-gtd-show-all-next
:desc "Stuck projects" "s" #'org-gtd-review-stuck-projects))
(map! :map org-gtd-clarify-map
:desc "Organize this item" "C-c c" #'org-gtd-organize))
This section introduces how Org GTD leverages org-mode.
Org Gtd uses org-edna
to automatically trigger state changes in projects, such that when you mark a NEXT item from a project as DONE, the next TODO in that project automatically becomes NEXT, such that the agenda is always up-to-date (you may need to refresh the agenda).
Org GTD uses org keywords to figure out the relevant state of each task. By default, NEXT
, TODO
, WAIT
, CNCL
, and DONE
, though you can configure them.
Org GTD uses the following properties:
ORG_GTD
- top-level property, used for simple filtering when it comes to agenda views
ORG_GTD_TIMESTAMP
- where the timestamp for appointments and other date-relevant actions is stored. It’s separate from everything else org-mode related in order to allow you, the user, to use
SCHEDULED
,DEADLINE
, or even plain timestamps as you see fit. DELEGATED_TO
- used by a dependency,
org-agenda-property
, to show the name of the person to whom the task is delegated in the agenda view.
Here are the domain elements of GTD that we handle:
The trip through GTD arguably begins by adding things to the inbox. The inbox is a file called inbox.org
in the directory stored in the variable org-gtd-directory
. By default this means the file will be ~~/gtd/inbox.org~.
Org GTD provides one function to capture items: M-x org-gtd-capture
. In my setup I have this bound globally as such:
(global-set-key "C-c d c" #'org-gtd-capture)
This function uses the variable org-gtd-capture-templates
to define org-gtd-specific capture templates. By default it comes with two templates, one to just capture a new item, and one to capture an item with a link to the file where you were when you started the capture.
You can customize these templates as you see fit. In order to maintain proper functioning of org-gtd, however, there are two constraints:
- the first two characters of the template string must be a single asterisk followed by a space:
"* "
- the entry type must be like this:
entry (file ,#'org-gtd-inbox-path)
You can start processing the inbox with org-gtd-process-inbox
. This starts a looping behavior of clarifying each item in the inbox.
Besides ending up in here automatically while processing the inbox, there’s two more ways to enter the clarifying flow:
org-gtd-clarify-item
- call this from any org-mode heading to do a one-off clarification.
org-gtd-clarify-agenda-item
- call this from the agenda view, if you have anything you want to re-clarify, or possibly clarify for the first time, from somewhere outside the inbox.
* Task desc
.
The only exception will be a project, that will look like a top-level heading for the project description with, underneath, a series of second-level headings representing each task to be executed sequentially before the project is complete.
* Project heading ** First task ** Second task ** Third taskThe clarify buffers are
org-mode
buffers that use the minor mode org-gtd-clarify-mode
. There is a keymap, org-gtd-clarify-map
, that you can use to bind useful
While clarifying, you may find it useful to see your GTD horizons. You can use:
org-gtd-clarify-toggle-horizons-window
- a function that toggles the display of the horizons buffer
org-gtd-clarify-show-horizons
- a boolean variable defining whether the horizons window should be shown (t) or hidden (nil) by default when clarifying an item. See Working with the GTD Horizons for more details.
If you are clarifying a project, you may be interested in project templates:
org-gtd-clarify-project-insert-template
- a function that will ask you to choose a template to insert.
org-gtd-clarify-project-templates
- an alist of the form
(name . template)
where both name and template are strings.name
will be used in the interactive menu, andtemplate
will be inserted in the buffer.
M-x org-gtd-organize
(or hit your keybinding for it, see Recommended key bindings). This will open a transient menu to let you choose how Org GTD should categorize this item.
Organizing is broken up into three steps:
- Choosing a task type
- Applying hooks to add additional relevant information
- Refiling to the appropriate area
Here are the following task types you can choose.
- *[P]rojects
- This is a multi-step action. In Org GTD, this is defined as a top-level org heading with a set of second-level org headings. Those second-level headings represent the sequentially-ordered set of tasks to be executed before the project can be called complete.
- *[A]dd to existing project
- Add current task to pre-existing project. See
org-reverse-note-order
to choose a default position (first or last) for this new task. You can always adjust this yourself later, then put your point on the project heading and callorg-gtd-projects-fix-todo-keywords-for-project-at-point
to have Org GTD clean it up for you. - [C]alendar
- Single action to be done at a given date or time. Org GTD will ask you for a date/time for this appointment.
- *[D]elegate
- Let someone else do this. Org GTD will ask you for a name to whom to delegate to and a date/time when to check up on the task with that person. You can customize
org-gtd-delegate-read-func
to specify a custom name input function (e.g. for completion purposes). - [S]ingle action
- This is a one-off to be done when possible.
- [H]abit
- org-mode-style habit. Org GTD will ask you for a valid org-mode repeating stamp and a date when to start the habit tracking. See the org-mode documentation for more information.
- [I]ncubate
- no action now; review later. Org GTD will ask you for a date at which it should remind you about this.
- *[Q]uick action
- Less than 2 minutes. Do it now, then choose this to mark the item as DONΕ and archive it.
- [K]nowledge
- This is knowledge to be stored away. Choose this after you have properly saved this item as knowledge.
- [T]rash
- Not actionable; not knowledge. Discard this item.
The decorations (priority, tags, categories, etc.) are customizable as you desire and managed by org-gtd-organize-hooks
, a list of functions. You can add your own functions to this list, as long as the functions do not modify the text in any “custom” way, separate from what org-mode understands.
See Adding your own hooks when organizing for more details on how you can add your own or customize this further.
By default, org-gtd will refile to a single file in the directory, but you can create your own headings if you find it helpful.If you would like to add new refile targets, it’s simple, follow these instructions.
Add a top-level heading in any .org
file (including a new one) in org-gtd-directory
and make sure its property drawer matches the one in the constant org-gtd-projects-template
.
Create a new top-level heading in any .org
file (including a new one) in org-gtd-directory
and make sure its property drawer matches the one in the relevant template constant:
org-gtd-habit-template
org-gtd-calendar-template
org-gtd-incubate-template
org-gtd-action-template
Here is an example:
:PROPERTIES:
:ORG_GTD: Action
:END:
You can see a list of all NEXT actions, and scheduled actions, with M-x org-gtd-engage
.
You can call org-gtd-show-all-next
to only see NEXT actions, nothing scheduled.
You can use org-gtd-oops
to see all the appointments you missed, and act on them accordingly.
The weekly review is not yet implemented.
In GTD, the horizons are defined as such:- Ground
- the day-to-day
- Horizon 1
- projects
- Horizon 2
- areas of focus
- Horizon 3
- 1-2 year goals
- Horizon 4
- 3-5 year vision
- Horizon 5
- purpose and principles
Obviously, Ground and Horizons 1 are handled by the “capture/clarify/organize/engage” flow we’ve already seen.
GTD recommends that you do not start using the horizons above Horizon 1 until you have both Ground and Horizon 1 under control. So, when you are ready…
Horizon 2 is now handled by a variable and a hook you can add to org-gtd-organize-hooks
:
org-gtd-areas-of-focus
is a list of strings, each representing one of your areas of focus.org-gtd-set-area-of-focus
is the hook you would add, e.g.(setq org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
, it ensures each item you clarify will need to be part of a horizon.
You can then use the function org-gtd-review-area-of-focus
to generate an agenda view to review a specific area of focus.
In order to add areas of focus to pre-existing items in your system, without going through the clarifying flow, we provide two functions:
org-gtd-area-of-focus-set-on-item-at-point
, when you are on a org headingorg-gtd-area-of-focus-set-on-agenda-item
, when you are on an agenda item
Do note that calling the function on item at point will trust you blindly to do the right thing, whereas setting the area of focus through the agenda will attempt to recognize if you are on a project task and thus set the category on the project itself instead of the task.
The longer-term horizons can be stored in a file in the org-gtd-directory
. A variable governs the name of the file, org-gtd-horizons-file
, by default horizons.org
.
At the moment it does not seem particularly useful to add any automation around these, since they will change so infrequently.
They are, however, useful to display.
A variable, org-gtd-clarify-show-horizons
, determines whether/where to display the side buffer while clarifying.
Regardless of the value of this variable, you can use the function org-gtd-clarify-toggle-horizons-window
to display or hide the side window. If the above variable is nil, then the horizons window will be toggled on the right side of the screen.
org-gtd-directory
files, find the headings that belong to Org GTD (see Refiling to the appropriate area), and archive the finished items.
The variable org-gtd-archive-location
points to a function that returns a string matching the org-archive-location
definition. It is a function in order to allow the filename to be dynamic.
The function to archive everything is M-x org-gtd-archive-completed-items
.
Since Org provides the agenda, it is a convenient base of operations for interacting with things that come up through org-gtd-engage
.
Here are the actions available to you:
M-x org-gtd-delegate-agenda-item
- When the point is on an action, this will properly delegate the action to someone else.
M-x org-gtd-project-cancel-from-agenda
- When the point is on a project action, this command will cancel the remaining actions in the project.
M-x org-gtd-clarify-agenda-item
- If you would like to clarify and organize an item through the agenda view, for whatever reason, this is your entry point.
You can define your own agenda views by defining your own functions like shown below, where x
is whatever your defined key is.
(defun my-agenda ()
(with-org-gtd-context
(let ((org-agenda-custom-commands '(your-definition-here)))
(org-agenda nil "x"))))
This being said, different types of tasks or items are not even created equal. For instance, there may be metadata you want to add to a project heading but not its tasks, or to a calendar item and not to a trash item.
Org GTD therefore provides a helper function, org-gtd-organize-type-member-p
, which you can use when creating your own hooks. The function takes one argument, a list of types (provided in the function’s documentation).
When called as part of a hook, this function will check a buffer-local variable called org-gtd--organize-type
, managed by Org GTD, to determine truthiness.
For an example, see the source code for org-gtd-areas-of-focus--set
, which will not run if the task being organized is a project task, trash, knowledge, or a quick action.
There’s now a few functions you can use when you are doing work within emacs and would like GTD to track something for you as a result:
org-gtd-habit-create
org-gtd-calendar-create
org-gtd-delegate-create
org-gtd-incubate-create
org-gtd-single-action-create
See the documentation for each, but suffice it to say they all take, at the very least, a string that will be used as the text part of the org heading that gets stored in org-gtd.
For instance, one way this could work:
(defun org-gtd-email-reminder ()
(let ((topic (message-fetch-field "subject"))
(delegated-to (message-fetch-field "to"))
(reminder-date (org-read-date nil nil "+3d")))
(org-gtd-delegate-create (format "Reminder: %s" topic)
delegated-to
reminder-date)))
(add-hook 'message-send-hook 'org-gtd-email-reminder)
Sometimes things break. The following functions will help you find these items:
org-gtd-review-stuck-calendar-items
org-gtd-review-stuck-incubated-items
org-gtd-review-stuck-habit-items
org-gtd-review-stuck-delegated-items
org-gtd-review-stuck-single-action-items
org-gtd-review-stuck-projects
org-edna
needs to be configured and enabled, see Configuring org-edna.
To fix such a stuck project, put the point on the project heading and call M-x org-gtd-projects-fix-todo-keywords-for-project-at-point
.
See data shape requirements. If this does not help you, please open an issue and show exactly what you have done before asking org-gtd
to create a project.