After two years of development, Emacs Solo has reached a significant milestone with a complete refactor separating core Emacs configuration from 35 custom-built modules. This unique Emacs configuration approach uses no external packages, relying only on built-in Emacs features and self-written Elisp. The project demonstrates what's possible with Emacs' built-in capabilities while offering a transparent, maintainable alternative to package-heavy configurations.
The Emacs ecosystem has long been defined by its package manager and the vast collection of third-party extensions available through MELPA and ELPA. Yet one developer, Rahul, has been pursuing a different path for the past two years with Emacs Solo, a configuration that uses zero external packages while maintaining a full-featured Emacs experience.
Emacs Solo began as a personal challenge: can one create a productive, modern Emacs setup without installing a single external package? The answer, after two years of development and a recent major refactor, is a definitive yes. The project has evolved into a comprehensive configuration with 35 self-contained modules that reimplement functionality typically found in popular external packages.
The Architecture: Core vs. Extras
The most significant change in this cycle was architectural. Emacs Solo was previously a single large init.el file with everything bundled together. This approach had drawbacks: it was difficult to navigate, hard to extract individual components, and unclear where "configuring built-in Emacs" ended and "custom implementations" began.
The solution was a clean separation into two layers:
Layer 1: init.el (Emacs core configuration)
This file configures only built-in Emacs packages and features. Every use-package block specifies :ensure nil, as it's pointing to something that ships with Emacs. The goal is to provide pure, standard Emacs customization that anyone can read, understand, and copy directly into their own config without dependencies.
Layer 2: lisp/ (Self-contained extra modules) These are Rahul's own implementations: replacements for popular external packages, reimagined as small, focused Elisp files. Each module is a proper provide/require module that can be loaded independently. The modules live under lisp/ and are loaded at the bottom of init.el via simple require statements.
"If you don't want one of them, just comment out the require line," Rahul explains. "If you want to use one in your own config, just copy the .el file into your own lisp/ directory and require it. That's it."
The Core: Built-in Emacs Configuration
The init.el file is organized into clearly labeled sections using outline-mode-friendly headers. It configures a wide range of built-in packages:
- General Emacs Settings: Key rebinding, window layout commands, file handling, and quality-of-life improvements
- Abbrev: A custom placeholder system for abbreviations
- Auth-Source: GPG-encrypted credential storage
- Auto-Revert: Automatic buffer refresh when files change
- Window Management: Enhanced window controls beyond defaults
- Tab-Bar: Workspace management using Emacs' built-in tabs
- RCIRC and ERC: Two configured IRC clients
- Icomplete: Vertical completion using Emacs' built-in icomplete-vertical-mode
- Dired: Heavily customized file manager
- Eshell: Enhanced shell with shared history, custom prompts, and large history storage
- VC (Version Control): Extensive configuration for Emacs' built-in version control
- Org-mode: Configuration for Emacs' legendary organization system
- Language Modes: Configurations for various programming languages
The Extras: 35 Custom Modules
The lisp/ directory contains 35 self-contained modules that reimplement functionality typically provided by external packages. Each module is designed to be small, understandable, and good enough for daily use without becoming bloated.
Notable modules include:
- emacs-solo-gutter: Git diff indicators in buffers
- emacs-solo-ace-window: Quick window switching with labels
- emacs-solo-olivetti: Centered document layout
- emacs-solo-icons: File type icon definitions
- emacs-solo-container: Docker/Podman management interface
- emacs-solo-ai: AI assistant integration for Ollama, Gemini, and Claude
- emacs-solo-erc-image: Inline image display for IRC
- emacs-solo-yt: YouTube search and playback
"I call them 'hacky reimplementations' in the spirit of Emacs Solo," Rahul writes. "They're not trying to be feature-complete replacements for their MELPA counterparts. They're trying to be small, understandable, and good enough for daily use while keeping the config self-contained."
Technical Insights and Trade-offs
The project offers several technical insights:
Emacs has more capabilities than most users realize: Many "missing" features actually exist in Emacs core but require proper configuration.
Writing your own packages is an effective way to learn Elisp: Implementing features from scratch forces understanding of Emacs' internal mechanisms.
Small modules are maintainable: Most modules are under 200 lines, making them easy to understand and modify.
Upstream contribution is valuable: Some workarounds eventually became upstream patches, demonstrating that deep engagement with features can lead to improvements in Emacs itself.
The project isn't without trade-offs. Rahul acknowledges that "this config is long" and that the code is "sketchy sometimes." However, the trade-off is control: "I wrote it, I understand it, and when it breaks, I know exactly where to look."
Emacs 31 and Future Directions
Throughout the configuration, features tagged for Emacs 31 highlight how the project will evolve as new Emacs versions incorporate functionality that currently requires custom implementations.
Notable Emacs 31 features include:
- Window layout commands (transpose, rotate, flip)
- Tree-sitter grammar sources defined in modes
- Improved icomplete with better vertical rendering
- Speedbar integration within existing frames
- Enhanced VC capabilities
"Some of the polyfill code I carry today, particularly around icomplete, exists specifically because those features haven't landed in a stable release yet," Rahul notes.
Who Is This For?
Emacs Solo is not intended as a replacement for popular configurations like Doom Emacs or Spacemacs. Instead, it serves a different purpose:
- Users who want to understand every line of their configuration
- Those seeking a dependency-free setup
- Developers interested in Emacs internals
- People frustrated with package repository issues
- Emacs users who value transparency and control over convenience
The project demonstrates that modern Emacs development doesn't necessarily require a complex package ecosystem. By leveraging Emacs' extensive built-in capabilities and writing targeted custom modules, one can create a powerful, maintainable configuration.
For those interested in exploring Emacs Solo, the complete configuration is available at https://github.com/LionyxML/emacs-solo. The repository includes screenshots, documentation, and all 35 custom modules that showcase what's possible with Emacs' built-in capabilities combined with thoughtful custom development.
Comments
Please log in or register to join the discussion