Momomacs is a well-organized, modular Emacs configuration using the Elpaca package manager. It features a clean separation of concerns with packages organized by category and loaded dynamically.
the-silver-searcher(ag) - Fast code searchingjdtls- Java language server (if using Java)git- Required for package management
guix- If using Guix package manager integration- PDF rendering tools for pdf-tools
Clone the repository to either ~/.emacs.d/ or ~/.config/emacs:
git clone <your-repo> ~/.config/emacsOn first launch, Emacs will automatically:
- Install Elpaca package manager
- Download and configure all packages
- Compile native code (if applicable)
Note: First startup may take 2-5 minutes while packages install.
Momomacs is also a Guix channel: its package set lives in the module
(momomacs packages) (under guix/), which exports
%momomacs-package-specifications, (momomacs-packages), and
(momomacs-manifest). Three ways to consume it:
One-off shell — works from a plain checkout, no channel setup
(manifest.scm is a thin wrapper over the module):
# include emacs itself so EMACSLOADPATH covers the manifest's packages
guix shell emacs -m ~/.emacs.d/manifest.scm -- emacsAs a channel — add to ~/.config/guix/channels.scm, then guix pull:
(channel
(name 'momomacs)
(url "https://github.com/Momo-Softworks/Momomacs")
(branch "main")
(introduction
(make-channel-introduction
"5710608a5767728224abbdbf6c61bcc205a32aca"
(openpgp-fingerprint
"989C 4DF6 BE60 E876 9E71 2001 7B98 B55D E129 2F08"))))The introduction lets guix pull authenticate the channel: every commit
after it is signed by a key in .guix-authorizations (public keys on the
keyring branch).
and in a Guix Home configuration:
(use-modules (momomacs packages))
(home-environment
(packages (append (momomacs-packages)
;; ...your other packages...
)))From a live checkout (the development loop — changes apply on the next
reconfigure, no guix pull): instead of the channel entry, put
(add-to-load-path "/path/to/Momomacs/guix") at the top of your config and
use the same (momomacs packages) import.
Packages Momomacs uses that Guix cannot provide are listed at the bottom of
guix/momomacs/packages.scm and are fetched by Elpaca at startup instead.
User configuration files and utilities:
user-config.el- Core user customization variablesexwm-config.el- EXWM window manager configurationelfeed-config.el- RSS and YouTube feed configurationsproject-utils.el- Project creation utilitiesdesktop-launcher.el- Desktop application launcherminecraft-utils.el- Minecraft-specific project utilitiesorg-config.el- Org-mode capture and refile configurationelfeed-setup.el- Elfeed package setup and integrationsettings.el- General Emacs settingskeybindings.el- Keybinding definitions
Package-specific configuration organized by category:
UI/- User interface packages (doom-modeline, modus-themes, dashboard)completions/- Completion frameworks (vertico, corfu, orderless)defaults/- Default packages loaded automaticallyfile-handling/- File management (pdf-tools, dirvish)keybindings/- Keybinding packages (meow, which-key)libraries/- Library packages (transient)org/- Org-mode extensions (modern, roam, fragtog)programming/- Programming language supportproject-management/- Project tools (magit, projectile)social/- Social/feed readers (elfeed)system/- System integration (exwm, eat)utils/- Utility functions and package managers (elpaca, guix, loaders)
init.el- Main initialization file, loads everything in orderearly-init.el- Early initialization (GC settings, UI tweaks)momo.el- Configuration loader that loads all config modulescustom.el- Auto-generated customizations (git-ignored)manifest.scm- Guix package manifest
The configuration loads in this specific order to ensure dependencies are met:
- early-init.el - Before GUI initialization
- Increase GC threshold for faster startup
- Disable package.el in favor of Elpaca
- Set custom-file location
- Suppress compiler warnings
- init.el - Main initialization
- Load Elpaca package manager
- Load utility modules (loaders, helpers)
- Load Guix integration (if present)
- Load user configuration (momo.el)
- Load default packages from
modules/defaults/ - Load general settings
- Load specific config modules (org, elfeed, etc.)
- Load keybindings
- Load package configurations via
momo/load-packages - Apply theme
- momo.el - User-specific configuration
- Load user customization variables
- Load optional modules (EXWM, elfeed, project-utils, etc.)
C-c m- Main leader (Momo commands)C-c o- Org-mode operationsC-c n- Org-roam (notes)C-c c- Configuration commands
| Key | Command | Description |
|---|---|---|
| c | kill-ring-save | Copy |
| x | kill-region | Cut |
| v | yank | Paste |
| z | undo | Undo |
| y | undo-redo | Redo |
| Key | Command | Description |
|---|---|---|
| r | momo/reload-config | Reload configuration |
| o | momo/open-config | Open init.el |
| Key | Command | Description |
|---|---|---|
| c | org-capture | Capture new item |
| r | org-refile | Refile current item |
| Key | Command | Description |
|---|---|---|
| f | org-roam-node-find | Find or create node |
| c | org-roam-capture | Capture to roam |
| i | org-roam-node-insert | Insert node link |
| j | org-roam-dailies-capture-today | Today’s daily note |
| Key | Command | Description |
|---|---|---|
| F5 | momo/reload-config | Reload configuration |
| C-x b | consult-buffer | Enhanced buffer switching |
| C-z | nil | Disabled (was suspend-frame) |
| Key | Command | Description |
|---|---|---|
| H | dired-hide-dotfiles | Toggle dotfile hiding |
| h | dired-up-directory | Go to parent dir |
| l | dired-find-file | Open file/dir |
Momomacs is a framework: anything personal (feed lists, machine hostnames,
site-specific tooling, experiments) belongs in a separate overlay directory —
momo-personal-dir, default ~/.config/momomacs/ — typically its own git
repo. If present, it is loaded in three phases:
| File / dir | Loaded | Use for |
|---|---|---|
early.el | before the package manager | momo-* variables, backend overrides |
config/*.el | with the optional configs (momo.el phase) | personal features; prototyping new modules |
late.el | last, after keybindings | final overrides |
All files are optional; a missing overlay is fine. Prototype candidate
modules in the overlay’s config/, then move them into the framework once
they are generic.
Declared in config/user-config.el; override them in your personal
overlay’s early.el (don’t edit the framework file):
momo-use-guix- Use Guix as the package backend (default: auto-detected;ton a Guix System withguixon PATH, elsenil→ Elpaca)momo-projects- List of project directories (default:'("~/Projects"))momo-roam-directory- Org-roam notes (default:"~/Documents/Roam")momo-capture-directory- Org captures (default:"~/Documents/Org")momo-personal-dir- Personal overlay location (default:"~/.config/momomacs")
- Create configuration file in appropriate
modules/subdirectory:
;;; package-name.el --- Package description -*- lexical-binding: t; -*-
;;; Commentary:
;; Brief description of what this package does
;;; Code:
(use-package package-name
:config
;; your configuration here
)
(provide 'package-name)
;;; package-name.el ends here- Register it in
modules/utils/loaders.el:
(setq momo/packages-alist
(momo/defun-packages
'((package-name . "category/package-name")
;; ... other packages
)))- Add to load list in
init.el:
(momo/load-packages
'(;; ... other packages
package-name
))Add custom functions to modules/utils/helpers.el:
(defun momo/my-function ()
"My custom function description."
(interactive)
;; your code here
)This configuration uses Elpaca, a modern, declarative package manager for Emacs.
- Asynchronous package installation
- Integration with
use-package - Better dependency handling than
package.el - Support for package pinning and custom builds
- Install packages: Restart Emacs (automatic on first load)
- Update packages:
M-x elpaca-update-all - Rebuild package:
M-x elpaca-rebuild - View package status:
M-x elpaca-manager
Currently using Modus Vivendi Tinted (dark theme).
modus-vivendi- Dark thememodus-vivendi-tinted- Dark theme with subtle tints (current)modus-operandi- Light thememodus-operandi-tinted- Light theme with subtle tints
M-x load-theme RET modus-operandi RET ; Switch to light themeOr edit init.el to change the default theme.
- Roam notes: ~~/Documents/Roam/~ (customizable via
roam-directory) - Org captures: ~~/Documents/Org/~ (customizable via
capture-directory)
| Key | Type | Description |
|---|---|---|
| t | Todo | Capture a task |
| j | Journal | Journal entry with timestamp |
| i | Idea | Quick idea capture |
| T | Tickler | Future reminder/tickler item |
The configuration supports Getting Things Done workflow with these refile targets:
tasks.org- Active taskssomeday.org- Someday/maybe itemsprojects.org- Multi-step projectsdelegated.org- Delegated taskstrash.org- Archived/cancelled items
- Auto-align tags disabled (modern clean look)
- Hide emphasis markers (show styled text, not markup)
- Pretty entities (render LaTeX symbols)
- Indented startup
- Custom agenda time grid with Unicode characters
- GC threshold increased to maximum during startup
- Restored to 16MB after initialization
- Native compilation enabled
- Deferred package loading where appropriate
- Backup files stored in dedicated directory
~1-2 seconds (varies by system and number of packages)
View actual startup time in messages buffer after launch.
doom-modeline- Modern, minimal modelinemodus-themes- High-contrast accessible themesdashboard- Startup screen with quick access
vertico- Vertical completion UIvertico-posframe- Posframe display for verticocorfu- In-buffer completion popupcape- Completion-at-point extensionsorderless- Flexible completion style
meow- Modal editing (alternative to evil)which-key- Display available keybindingsgeneral- Convenient keybinding definitions
flycheck- On-the-fly syntax checkingeca- Editor Code Assistantrainbow-delimiters- Colorize nested delimitersracket-mode- Racket/Scheme supportjava- Java development
projectile- Project interaction librarymagit- Git interface
org-modern- Modern org-mode appearanceorg-roam- Note-taking and knowledge managementorg-fragtog- Auto-toggle LaTeX fragmentsciteproc- Citation processing
pdf-tools- Enhanced PDF viewing
elfeed- RSS/Atom feed readerelfeed-tube- YouTube integration for elfeed
savehist- Save minibuffer historysmartparens- Smart parenthesis handlinggeneral- Keybinding managementconsult- Enhanced search and navigationmarginalia- Annotations in minibufferdired-hide-dotfiles- Toggle dotfiles in diredyasnippet- Snippet expansioneglot- LSP clienttreesitter-auto- Tree-sitter integration
M-x momo/reload-config
;; or press F5Check the *Warnings* buffer for detailed error messages:
M-x switch-to-buffer RET *Warnings* RETM-x view-echo-area-messagesM-x elpaca-rebuild RET package-name RETM-x elpaca-managerIf things are completely broken:
# Backup your config first!
rm -rf ~/.config/emacs/elpaca/
# Restart Emacs - packages will reinstall automaticallyM-x emacs-init-timeemacs -Q --eval "(progn (require 'profiler) (profiler-start 'cpu))" \
-l ~/.config/emacs/init.el \
--eval "(profiler-report)"This is a personal configuration, but you’re welcome to:
- Use it as inspiration for your own config
- Fork and modify for your needs
- Submit issues if you find bugs
- Suggest improvements via pull requests
- Elpaca - Modern package manager
- Modus Themes - Beautiful, accessible themes
- The Emacs community for excellent packages and documentation