A configuration you can explain line by line is a configuration you can debug; every setting here traces back to a concept already introduced.
This configuration contains only concepts already introduced. Read it as a checklist of decisions, not a recipe to paste blindly.
The block
;; One canonical directory.
(setq org-directory (expand-file-name "~/org/"));; Only operational files participate in Agenda.
(setq org-agenda-files
(mapcar (lambda (name) (expand-file-name name org-directory))
'("inbox.org" "projects.org" "areas.org")));; A small task state machine with transition logging.
(setq org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "WAITING(w@)"
"|" "DONE(d!)" "CANCELLED(c@)")));; Deliberately small context vocabulary.
(setq org-tag-alist
'((:startgroup) ("@home" . ?h) ("@office" . ?o) (:endgroup)
("deep" . ?d) ("waiting" . ?w)));; Capture is available outside Org buffers.
(global-set-key (kbd "C-c c") #'org-capture);; Enable only reviewed, installed Babel languages.
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t) (python . t) (shell . t)));; Keep the evaluation prompt: Org documents may execute programs.
(setq org-confirm-babel-evaluate t)What is intentionally absent
No package framework, no org-roam, no visual decoration, no global property inheritance, no automatic execution, and no dozens of templates. Add each only in response to an observed need. Leaving org-confirm-babel-evaluate at t keeps a real trust boundary: globally setting it to nil buys convenience at the cost of a broad decision to run any block silently.
Keep the installation reproducible
Org is unusual because a bundled version can coexist with a separately installed one, and loading part of each is a common source of incompatible-function errors. While learning, use the Org bundled with stable Emacs and confirm what loads:
M-x emacs-version
M-x org-version
M-x locate-library RET org RETDo not call package-refresh-contents on every startup; it adds network delay and failure to opening the editor. Upgrade Org only for a needed fix, following the official isolated-batch procedure rather than an arbitrary decade-old bootstrap snippet. A package list alone does not preserve versions, so record Emacs and Org releases in a lock note, and preserve readable source so long-lived documents remain accessible even when the customized environment cannot be reconstructed.
Why keys behave differently in context
Many Org keys dispatch on point. C-c C-c toggles a checkbox, recalculates a table formula, executes a source block, or refreshes a keyword depending on where you are; TAB folds at headings but moves and recalculates in tables. Learn each command by its semantic context, and when a key surprises you, C-h k reports the active command and maps. The universal prefix C-u is not an "advanced mode": each command defines what it means, so read the docstring before relying on a prefix in automation.
Summary. One canonical directory, a small task state machine, a deliberately short vocabulary, and only reviewed Babel languages. The value is as much in what is absent as in what is present, and in keeping your installation reproducible.
Exercises
- Basic: Locate the physical Org library your Emacs would load with `M-x locate-library RET org RET`, then confirm releases with `M-x emacs-version` and `M-x org-version`.
- Practical: Type the consolidated block into your init, restart Emacs, and confirm that only `inbox.org`, `projects.org`, and `areas.org` appear in the Agenda.
- Advanced: Design an upgrade test and rollback procedure for Org that does not disturb your daily bundled installation: restart fully, verify `org-version` and `locate-library`, test Capture, Agenda, Babel, and export in a copy of real data, and keep a documented path back.