These are my Emacs customizations. I am in the process of learning and using Emacs as my primary text editor (amongst all the other things that Emacs seems to do for you).
Installed via Homebrew:
cmakeandlibtool- Required for vterm compilationghostscript- Required for PDF renderinggit- Required for tree-sitter grammar compilationpandoc- Required for Markdown processing
The important thing to understand is that learning Emacs isn’t just learning the particulars of a text editor. Learning Emacs means learning a framework written in Emacs Lisp that is all about taking actions on buffers of text. Learning the Emacs basics are important, but that only scratches the surface of the different interaction modes.
My configuration follows the philosophy of better-defaults - starting simple and adding functionality as needed, rather than using a large framework like Spacemacs or Doom Emacs.
- Uses
use-packagefor declarative package configuration - Configured with MELPA, Org, and GNU ELPA repositories
- better-defaults - Sensible defaults for Emacs
- which-key - Discover keybindings as you type
- ido-mode - Enhanced minibuffer completion
- ido-completing-read+ - Ido everywhere
- ido-vertical-mode - Vertical display for Ido
global-auto-revert-mode- Automatically reload files when changed on diskvisual-line-mode- Soft line wrapping in text modes- visual-fill-column - Wrap text at fill-column with visual indicator
- doom-themes - Modern color themes (using doom-one)
- solaire-mode - Visual distinction between code and UI buffers
- doom-modeline - Clean, informative modeline
- anzu - Search match count display
- Font: SF Mono at 12.4pt (when available)
project.el(built-in,C-c p) - Project management and navigation- magit - Git interface
- gist - GitHub gist integration
- exec-path-from-shell - Inherit shell environment (important on macOS, optimized for fast startup)
- direnv - Automatically load direnv environments (essential for nix/devenv projects)
eglot(built-in) - Language Server Protocol support using standard Emacs bindingsflymake(built-in,M-g n/p) - On-the-fly syntax checking, displays LSP diagnosticstree-sitter(built-in) - Advanced syntax highlighting and code navigation (Emacs 30)- company-mode - In-buffer completion
- treemacs (
C-c t) - File tree sidebar with git status indicators - vterm - Terminal emulator
- claude-code-ide (
C-c C-') - Claude AI integration
- Uses built-in
typescript-ts-modewith tree-sitter (Emacs 30) - Automatically compiles and installs tree-sitter grammars from source on first use
- Eglot provides LSP features (go-to-definition, find-references, completion, diagnostics)
- Requires:
npm install -g typescript-language-server typescript
- rust-mode - Rust language support
- nix-mode - Nix expression editing
- paredit - Structural editing for Lisp and Scheme
- markdown-mode - Markdown editing with pandoc support
- dockerfile-mode - Dockerfile syntax
- docker - Docker management
- nov.el - EPUB reader
- gptel - ChatGPT/Claude interface
| Key | Command | Description |
|---|---|---|
C-h t | help-with-tutorial | Emacs tutorial |
C-h a | apropos-command | Search for command |
C-h m | describe-mode | Current mode help |
C-h k | describe-key | Describe key binding |
C-h . | display-local-help | Help at point |
| Key | Command | Description |
|---|---|---|
C-c p f | project-find-file | Find file in project |
C-c p p | project-switch-project | Switch project |
C-c p g | project-find-regexp | Search in project |
C-c p b | project-switch-to-buffer | Switch to project buffer |
C-c p d | project-find-dir | Find directory in project |
| Key | Command | Description |
|---|---|---|
M-g n | flymake-goto-next-error | Jump to next error |
M-g p | flymake-goto-prev-error | Jump to previous error |
C-h . | display-local-help | Show error at point |
M-x | flymake-show-buffer-diagnostics | List all errors |
| Key | Command | Description |
|---|---|---|
M-. | xref-find-definitions | Go to definition |
M-? | xref-find-references | Find references |
M-, | xref-go-back | Go back |
C-h . | eldoc-doc-buffer | Show documentation |
C-c r | eglot-rename | Rename symbol |
C-c a | eglot-code-actions | Execute code action |
C-c f | eglot-format | Format buffer/region |
| Key | Command | Description |
|---|---|---|
C-c t | treemacs | Toggle file tree sidebar |
M-x magit-status | magit-status | Git status |
C-c C-' | claude-code-ide-menu | Claude Code menu |
Inside the treemacs buffer:
| Key | Command | Description |
|---|---|---|
n/p | next/previous | Navigate files/folders |
RET | treemacs-RET-action | Open file or toggle dir |
TAB | treemacs-TAB-action | Expand/collapse directory |
q | quit-window | Close treemacs |
? | treemacs-helpful-hydra | Show all keybindings |
- Mastering Emacs by Mickey Petersen - Comprehensive guide
- Emacs Lisp Guide by Chris Done
People whose configs I’ve learned from:
- https://github.com/flyingmachine/emacs.d
- https://github.com/bodil/emacs.d
- https://github.com/magnars/.emacs.d
- https://github.com/howardabrams/dot-files (uses Literate Programming in Org-mode)
- https://github.com/bbatsov/prelude
- https://github.com/bodil/ohai-emacs
The key is to keep C-h a (pattern-matching help) and C-h m close at hand. C-h everything!
Some things I’m considering adding:
- More language modes as needed
- Org-mode configuration for note-taking and planning
- Custom keybindings as I discover my workflow patterns
- Performance optimizations (compile, lazy loading tweaks)
Eventually, I’ll get the hang of it.