aboutsummaryrefslogtreecommitdiff
path: root/README.org
blob: 2350504690a881d00483421b47de8fa337042df6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#+TITLE: Craig's Emacs Configuration
#+AUTHOR: Craig Jennings
#+OPTIONS: toc:2

Personal Emacs configuration. Pure Elisp, modular, no framework (not
Doom, not Spacemacs). Used daily for real work — this is a lived-in
config, not a demo.

Still in active development.

* Status

Personal. Published in case bits are useful to others, but not intended
as a distribution or starter kit. Conventions and keybindings reflect
my habits. Feel free to read, borrow, or steal; no support promised.

* Requirements

- Emacs 30 or newer (developed on 30.2; uses ~lexical-binding~,
  ~use-package~, native comp)
- Linux / macOS / FreeBSD / Windows — the config checks host via
  =host-environment.el= and degrades where platform features are missing
- Several modules shell out to external tools (e.g. =ffmpeg=,
  =mu4e=, =pdftools=); those modules fail gracefully when the tool
  is absent

* Layout

#+begin_example
.
├── early-init.el        startup perf, package system, local repos
├── init.el              module loader (one require per feature)
├── modules/             feature modules — one domain per file (~120 files)
├── tests/               ERT tests — test-<module>*.el, testutil-*.el
├── assets/              data files checked into git
├── custom/              user customizations and overrides
├── snippets/            yasnippet templates
├── themes/              local themes
├── scripts/             helper scripts + theme-studio (the theming tool)
├── docs/                specs and design documentation
├── org-roam-templates/  capture templates for org-roam
├── githooks/            optional git hooks (pre-commit, etc.)
└── Makefile             test / lint / validate / profile targets
#+end_example

=modules/= is organized by domain: ~org-*~, ~prog-*~, ~custom-*~,
~ui-*~, and standalone feature files (e.g. ~calendar-sync.el~,
~transcription-config.el~, ~reconcile-open-repos.el~).

* Features

- *Local package repository* (=.localrepo/=) — last-known-good package
  versions checked in for fully offline reinstalls. Highest priority
  in the archive list, so online repos are additive, not required.
- *ELPA mirror support* — optional script (=scripts/create-elpa-mirror.sh=)
  clones GNU / NonGNU / MELPA / MELPA-stable locally (~1.9 GB) for
  portability behind firewalls.
- *Google Calendar sync* (=modules/calendar-sync.el=) — pure-Elisp
  =.ics= parser, one-way sync to org-mode, no external dependencies.
- *Audio transcription* (=modules/transcription-config.el=) — pluggable
  backends (OpenAI, AssemblyAI, local) via descriptor alist.
- *Repo reconcile* (=modules/reconcile-open-repos.el=) — walks
  project directories, surfaces dirty/unpushed repos for review.
- *Mu4e + org-msg + org-contacts* — integrated mail workflow.
- *Reveal.js and ox-hugo* — slide decks and blog publishing from org.
- *Theme Studio* (=scripts/theme-studio/=) — an in-house, browser-based
  theme builder: edit faces across packages with live previews, contrast
  readouts, and export to a loadable theme. Carries its own test pyramid
  (=run-tests.sh=: Python + Node + headless-browser gates).
- *Native terminal* (=modules/term-config.el=) — ghostel (over
  libghostty-vt) with an F12 toggle and a tmux-aware copy-mode; replaced
  vterm.
- *AI agent terminals* (=modules/ai-term.el=) — launch and switch between
  per-project Claude/agent sessions in ghostel under =C-; a=.
- *Custom keymap* under =C-;= prefix for personal commands.

* Development

Makefile targets:

#+begin_src bash
make                    # Show all targets
make test               # Run all ERT tests
make test-file FILE=test-foo.el         # One test file
make test-name TEST=pattern             # Match by test name
make coverage           # Generate .coverage/simplecov.json
make coverage-summary   # Per-file + project coverage table (the watched number)
make validate-parens    # Check for unbalanced parens in modules
make validate-modules   # Load all modules to verify they compile
make compile            # Byte-compile modules
make lint               # checkdoc + package-lint + elisp-lint
make profile            # Profile Emacs startup
make clean              # Remove .elc and test artifacts
#+end_src

Coverage is substantial but not uniform — critical utilities
(calendar-sync, transcription, reconcile, custom-* helpers) have
thorough test suites; some config modules are smoke-tested only.