Personal Doom Emacs setup with two parts in one repo:
.doom.d/: your user configuration (modules, package declarations, personal settings).emacs.d/: a vendored Doom Emacs framework tree (including modules, CLI, and docs)
This layout gives you a self-contained setup where both framework and private config are versioned together. 1
.doom.d/init.el: enabled Doom modules and flags.doom.d/config.el: user-level settings (theme, line numbers, org directory, custom Lisp).doom.d/packages.el: extra package declarations (org-gcal).doom.d/custom.el: Emacs Custom variables.doom.d/private/: ignored private files (credentials/secrets).emacs.d/: Doom framework source, CLI scripts, and official module docs.gitignore: excludes private credentials and common Emacs artifacts
:completion(corfu +orderless)vertico
:uidoom,doom-dashboard,hl-todo,modeline,ophints(popup +defaults)(vc-gutter +pretty)vi-tilde-fringe,workspaces
:editor(evil +everywhere)file-templates,fold,snippets(whitespace +guess +trim)
:emacsdired,electric,tramp,undo,vc
:checkerssyntax
:tools(eval +overlay),lookup,magit
:osmacos(conditionally, only when running on macOS)
:langemacs-lisp,markdown,org,sh
:config(default +bindings +smartparens)
Defined in .doom.d/config.el:
- Theme:
doom-acario-dark - Line numbers: enabled (
display-line-numbers-typeset tot) - Org directory:
~/org/
Defined in .doom.d/packages.el:
org-gcal
custom.el also records selected packages including:
all-the-iconsall-the-icons-nerd-fontsorg-gcal
The repo ignores .doom.d/private/.
Use this directory for sensitive files, e.g. OAuth/client secrets for calendar integrations.
Current ignored pattern:
.doom.d/private/
Recommended approach:
- Keep secrets in files under
.doom.d/private/. - Load them from
config.el(or a separate private file) with guarded logic. - Never commit token/client-secret files.
Install at minimum:
- Emacs (Doom README in this repo lists supported versions)
gitripgrep(rg)
Optional but recommended:
fd- Nerd Fonts / icon fonts (for modeline/icons)
git clone https://github.com/seth-woo/doom-emacs-config.git
cd doom-emacs-configChoose one model:
- Use this repo in-place and link/sync the directories to your expected Doom paths.
- Or copy
.doom.d/and.emacs.d/to your preferred locations.
Typical expected locations are user-level dotdirs (~/.doom.d and ~/.emacs.d) unless you use custom env vars/launch scripts.
Windows symlink example (PowerShell, from your home directory):
New-Item -ItemType SymbolicLink -Path $HOME\.doom.d -Target "C:\Users\Seth Woo\doom-emacs-config\.doom.d"
New-Item -ItemType SymbolicLink -Path $HOME\.emacs.d -Target "C:\Users\Seth Woo\doom-emacs-config\.emacs.d"From repo root:
.emacs.d\bin\doom.ps1 syncOn Unix-like shells:
./.emacs.d/bin/doom syncThen restart Emacs.
- After changing
.doom.d/init.elor.doom.d/packages.el:- run
doom sync
- run
- After changing only
.doom.d/config.el:- usually just reload/restart Emacs
- Update Doom/framework and package pins periodically:
.emacs.d\bin\doom.ps1 upgradeUseful diagnostics:
.emacs.d\bin\doom.ps1 doctor- This repository tracks the full
.emacs.dDoom framework tree instead of using it only as an external dependency. - Because framework code is vendored, normal updates may involve larger diffs than a config-only repo.
- Keep personal credentials and machine-local secrets in
.doom.d/private/.
- Add/disable modules in
.doom.d/init.el, then rundoom sync. - Add packages in
.doom.d/packages.el, then rundoom sync. - Put personal Lisp in
.doom.d/config.elusingafter!,use-package!, andmap!.
- Local upstream README:
.emacs.d/README.md - Doom docs in repo:
.emacs.d/docs/ - Official site: https://doomemacs.org
Footnotes
-
I am exploring Doom Emacs primarily for Org-Mode. More specifically, the Org-Mode-Google Calendar integration (
org-gcal). I am still undecided whether this workflow is efficient for me, or if it would be better to just use the official Google Calendar web UI directly. Not everything has to be done through a CLI but I guess time will tell. Best, Seth. ↩