Note-Taking with Org Mode

Org mode is a plain-text outliner, task manager, and literate-programming environment built into Emacs. For a researcher it doubles as a lab notebook: one .org file can hold your outline, to-dos, links, tables, and runnable code, then export to a PDF or slides — all in version-controllable plain text.

Why plain-text notes

Outlining

Structure is just headlines marked with asterisks; depth is the number of stars.

* Project: spillover risk
** Background
** Analysis
*** Data cleaning
*** Model fit
** Meeting notes

Press TAB on a headline to fold or unfold its subtree, and S-TAB to cycle the whole document between overview, contents, and full detail. M-<up>/M-<down> move a subtree, and M-<left>/M-<right> promote or demote it — so reorganizing a document is a few keystrokes, not cut-and-paste.

Tasks, tags, and the agenda

Any headline becomes a task by giving it a keyword; C-c C-t cycles TODODONE. Add :tags:, priorities, and timestamps to make notes actionable.

** TODO Refit model with waning immunity :analysis:urgent:
   DEADLINE: <2026-07-10 Fri>
** DONE Send draft to co-authors
   CLOSED: [2026-07-02 Thu]

C-c c (org-capture) drops a quick note or task into an inbox from anywhere without losing your place, and C-c a (the agenda) collects deadlines and scheduled items across all your files into one calendar view.

Link to a URL, a file, or another headline with C-c C-l; the syntax is [[target][description]]. Tables are just text with | separators — press TAB and Org auto-aligns the columns, and it even supports spreadsheet-style formulas.

See [[https://doi.org/10.1038/nature02104][Antia et al. 2003]] and [[file:notes.org::*Model fit][the model section]].

| strain    | R0  | note         |
|-----------+-----+--------------|
| wildtype  | 0.9 | subcritical  |
| mutant    | 1.5 | supercritical|

Literate notebooks with Babel

Org’s killer feature for analysis is Babel: embed source blocks in many languages, execute them in place with C-c C-c, and capture the results in the document. This makes a .org file a language-agnostic, reproducible notebook (see reproducibility).

#+begin_src R :results output
  set.seed(1)
  mean(rnorm(1000))
#+end_src

Because prose, code, and output share one file, you can weave a full analysis — much like R Markdown or Jupyter — and the same math notation you would use in LaTeX renders on export.

Exporting

C-c C-e opens the export dispatcher: choose HTML, LaTeX → PDF, Markdown, or Beamer slides from the same source. Your notes, a manuscript, and a talk can all come from one file, which keeps them in sync.

A Zettelkasten with org-roam

For interlinked, atomic notes, org-roam adds a lightweight Zettelkasten on top of Org: each note is a file, notes link to each other, and a backlinks buffer shows everything that points at the current note. It is an excellent way to grow a personal knowledge base of papers, methods, and ideas over a whole program.

Creating and navigating notes

Where a note lives matters as much as what it says, and a useful split is:

Create a note in a specific place

To create a project-specific file, just open it by path and Emacs writes it on first save.

Because you are only naming a path, “put this note in this project” and “put it in my central notes” are the same action aimed at different directories — the file system, not a hidden app database, decides where a note lives.

Route captures to the right file

org-capture (C-c c, or Doom SPC X) writes a note without first navigating to a file; capture templates decide where each kind of note is filed. Point different templates at different targets — a project’s TODO list, a central inbox, a journal:

(setq org-capture-templates
      '(("t" "Project todo" entry
         (file+headline "~/projects/flu/notes.org" "Tasks")
         "* TODO %?\n  %U")
        ("i" "Inbox note" entry
         (file+headline "~/org/inbox.org" "Inbox")
         "* %?\n  %U %a")))   ; %a links back to where capture was invoked

Find and move between notes

Getting started

Cheat sheet: vanilla Emacs

The classic C-c (Control-c) bindings work in any Emacs, and still work inside Doom.

KeysAction
TABfold / unfold the current subtree
S-TABcycle global folding
C-c C-tcycle TODO state
C-c C-jjump to a headline in this file
C-c C-linsert or edit a link
C-c C-wrefile the subtree elsewhere
C-c ccapture a quick note or task
C-c aopen the agenda
C-c C-cexecute a code block / act on context
C-c C-eexport dispatcher

Cheat sheet: Doom Emacs

Doom layers a discoverable, SPC-leader (spacebar) scheme on top; SPC m is the local leader for Org-specific commands. The bindings below are Doom defaults — search them live with SPC h b b (search keybindings) or SPC h d h (Doom help), since they can vary by version and enabled modules.

KeysAction
SPC .find file in the current directory (create one here)
SPC f ffind any file · SPC f F from this folder
SPC p ffind a file in the current project
SPC Xcapture a note (org-capture)
SPC n fbrowse notes in your org-directory
SPC n r ffind an org-roam node · SPC n r i insert a link
SPC n r rtoggle the org-roam backlinks buffer
SPC n jopen the journal / daily note
SPC s ijump to a headline (imenu)
SPC m tset the TODO state
SPC m rrefile the current subtree
SPC m l linsert a link
SPC m d dset a deadline · SPC m d s schedule
SPC m eexport dispatcher
SPC m 'edit a source block in its own buffer