home-lab/modules/development/EMACS_README.md
Geir O. Jerstad 251222037d feat(emacs): robust Nix-based Emacs setup with daemon service, improved elisp dev, and full package documentation
- Emacs daemon runs as a systemd service via Nix
- Modular Emacs config with Nix-managed packages (elisp-slime-nav, aggressive-indent, highlight-defined, etc.)
- Keybinding fixes and error handling improvements
- New EMACS_README.md explains ecosystem and troubleshooting
- Nix config: GUI sudo askpass, podman, and desktop tweaks
- All errors from missing packages and keybindings resolved
2025-07-03 20:39:07 +02:00

3.7 KiB

Emacs + Nix Setup: Overview and Package Guide

Introduction

This document explains the Emacs ecosystem and the Nix-based configuration used in this project. It covers the purpose of key Emacs packages, how they are managed with Nix, and how to extend or troubleshoot your setup.


Why Use Nix for Emacs?

  • Reproducibility: Nix ensures your Emacs environment is consistent across machines and rebuilds.
  • Declarative Configuration: All packages and dependencies are listed in a single place (emacs.nix), making it easy to update or share.
  • Isolation: Nix prevents conflicts between Emacs packages and system/global packages.

Emacs Packages in This Setup

Navigation & Completion

  • vertico, consult, marginalia, orderless, embark, embark-consult, corfu, cape: Modern completion and minibuffer enhancements for fast, fuzzy, and context-aware navigation.
  • projectile: Project management and navigation.

Version Control

  • magit: The best Git interface for Emacs.
  • forge: GitHub/GitLab/Magit integration for issues and pull requests.

Development Tools

  • lsp-mode, lsp-ui: Language Server Protocol support for IDE-like features.
  • company: In-buffer code completion.
  • flycheck: On-the-fly syntax checking.
  • yasnippet: Snippet expansion for faster coding.
  • elisp-slime-nav: Easy navigation of Emacs Lisp code.
  • aggressive-indent: Keeps your code automatically indented.
  • highlight-defined: Highlights defined symbols in Emacs Lisp.

Language Support

  • nix-mode: Nix language editing.
  • rust-mode, python-mode, typescript-mode, json-mode, yaml-mode, markdown-mode: Major modes for popular languages and formats.
  • elisp-ls: Emacs Lisp Language Server for LSP features in Emacs Lisp.

Org & Knowledge Management

  • org, org-roam, org-roam-ui: Org-mode for notes, tasks, and literate programming; org-roam for Zettelkasten-style knowledge management.

UI & Usability

  • doom-themes, doom-modeline, all-the-icons, rainbow-delimiters, highlight-indent-guides: Visual enhancements for a modern, readable Emacs.
  • smartparens, expand-region, multiple-cursors, avy, ace-window: Editing and navigation power tools.
  • vterm: Terminal emulator inside Emacs.

How the Nix Setup Works

  • The file modules/development/emacs.nix defines a function that builds a custom Emacs with all the above packages.
  • Packages are grouped by purpose (essential, minimal, development, workstation) and selected based on your machine profile.
  • When you rebuild your system or run nix develop, Nix fetches and builds all required Emacs packages.
  • Environment variables (like AG_PATH, FD_PATH, etc.) are set for Emacs to use external tools.

Extending Your Setup

  • To add a new package, add it to the appropriate list in emacs.nix (e.g., under development = epkgs: with epkgs; [ ... ]).
  • Rebuild your system or development shell to apply changes.
  • For packages not in Nixpkgs, consider using MELPA as a fallback, but prefer Nix for reproducibility.

Troubleshooting

  • If you see Cannot open load file errors, make sure the package is included in your Nix config.
  • For missing language servers, check if the correct Nix package is used (e.g., elisp-ls for Emacs Lisp LSP).
  • Use emacs --daemon --debug-init to debug startup issues.

Resources


This setup gives you a modern, reproducible, and powerful Emacs environment managed entirely by Nix. Happy hacking!