- Emacs Lisp 100%
| docs | ||
| user-lisp | ||
| .gitignore | ||
| early-init.el | ||
| init.example.el | ||
| LICENSE | ||
| README.org | ||
Helheim Emacs
https://github.com/user-attachments/assets/09d1a77d-2a3e-4cae-a005-e69ae03e5a7e
This is the realm of Hel
Helheim is an Emacs configuration framework built around Hel — a Helix emulation layer for Emacs. You get Kakoune/Helix-style selection → action modal editing with multiple cursors + the entire Emacs ecosystem.
Helheim is modular to the core. Every folder in user-lisp/ is a module; you
require only what you want.
Highlights
- Selection → action modal editing + multiple cursors, smooth-scrolling.
- Sane defaults + treesitter configuration.
- Xref is patched to try all registered backends in sequence until one succeeds, with Dumb Jump as a universal fallback.
- Org-mode fully preconfigured as personal knowledge management system with bidirectional links and daily notes.
- Ibuffer, done right. Buffers are grouped by project, then by file-tree depth, with paths relative to the project root. Special buffers and out-of-project buffers are separated, and Denote IDs are stripped from names. A picture is worth a thousand words.
Modular architecture
Every folder in user-lisp/ is added to the load-path, all Elisp files are
byte-compiled and scraped for ;;;###autoload cookies. require only the modules
you need in your init.el.
Run : prepare-user-lisp to rescan user-lisp/ after adding content at runtime.
With universal-argument (M-u : prepare-user-lisp) it recompiles all files and
rebuilds the .user-lisp-autoloads.el file with autoload cookies.
[!NOTE] This is an Emacs 31 feature backported to Helheim.
Modules
Every entry in user-lisp/helheim/ is a self-contained module, require only
what you need.
-
UI
-
Essentials
- minibuffer — Vertico + Marginalia
- completion — Orderless + Corfu + Cape
- embark — A keyboard-driven analogue of a right-click context menu.
- dired — File manager
- ibuffer — Buffers menu
-
Search
-
Version control
- magit — Magit with keys adopted for Hel
- git-gutter — Git gutter indicators
- ediff — 2-way and 3-way diffs
-
IDE
-
- org-node — personal knowledge management (Org-roam alternative)
- daily-notes — Daily scratchpad / Inbox
-
Terminal emulators
-
LLM
- agent-shell — Shell for coding agents inside Emacs
- mcp-server — MCP server exposing Emacs to LLMs
-
Misc
- notmuch — Notmuch email client
- browser-integration — Edit browser text fields in Emacs (GhostText)
- speech-to-text — speech-to-text conversion with whisper.el
Installation
GNU Emacs 29.1 or later is required.
- Install Symbols Nerd Font from nerdfonts.com. It contains only the icon glyphs — Emacs can map individual code points to it, so you keep your own text font and still get Nerd Icons.
-
If you want just to try Helheim, clone it into any directory:
git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/helheim-emacsOr clone to the standard
~/.config/emacsif you want Emacs to load it automatically.git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/emacs - Rename
init.example.eltoinit.el. -
Run Emacs. Passing the path to config explicitly if it is not standard:
emacs --maximize --init-dir ~/.config/helheim-emacs &
[!IMPORTANT]
init.example.elsets the default font to Cascadia Code. Install it or swap to a font you prefer.
[!IMPORTANT] Hel uses
U+2000(EN QUAD) for secondary cursors by default. It should be bound to a variable-pitch font.
Configuration
Package manager
Helheim supports two package managers:
- straight — (default) mature, stable, lock-file support.
- elpaca — younger, asynchronous, much faster, lock file is not fully supported yet
See the helheim-package-manager variable.
Keybindings
Helheim uses Space as the leader key, but the Emacs native leader key is C-c.
Space emulates a C-c press internally with the hel-leader package (see its
README because it also emulates C-x, C-c C-…, M-… and C-M-…).
[!IMPORTANT] If you want to create a keybinding under the leader prefix, bind under
C-c.
Example:
(keymap-global-set "C-c RET" 'dired-jump)
Color themes management
Emacs color themes management is quite tedious:
- Which function should you use to properly activate a color theme:
load-themeorenable-theme? - How to customize faces for a specific theme? By default you can only use the
customizeinterface, and all face overrides are global — if you switch themes, the overrides persist. - How do you switch themes on the fly? It’s not easy. Loading a new theme doesn’t disable the previous one, leaving multiple themes enabled simultaneously.
Helheim takes care of all of these problems:
- Use
load-themeeither interactively or programmatically to load and activate the theme you want. - Use
helheim-theme-set-facesto customize faces for a specific theme. If the theme is currently enabled, the changes will be applied immediately.
(helheim-theme-set-faces 'modus-operandi
'(region :background "#d9eaff")
'(help-key-binding :foreground "#0000b0" :background "grey96"
:box (:line-width (-1 . -1) :color "grey80")
:inherit fixed-pitch))
To apply your customizations without restarting Emacs: place the cursor after
the closing parenthesis and evaluate the form with ,ee (Emacs native: C-x C-e).
Usage
[!IMPORTANT]
universal-argumentis rebound toM-usinceC-uis used for scrolling.
[!TIP] Bind
Caps LocktoEsc, and configureSpaceto tap+hold behavior:Spaceon tap andCtrlon hold. You can use any of these tools: kanata, kmonad, keyd (Linux), Karabiner-Elements (Mac).
The story behind Helheim
I wasted an unreasonable amount of time and effort trying to adapt other editors to my preferences. It started with Sublime Text, then Atom (which I really liked), then VS Code (which I never liked), then Neovim, Emacs + Evil, VS Code again, then Doom Emacs. I also tried Helix and Zed. I liked one thing in one editor and something else in another.
I wanted a keyboard-driven modal editor, multiple cursors, smooth scrolling, Lisp (I would prefer Common Lisp, but Emacs Lisp is better than nothing).
Eventually, I decided that enough was enough — it's easier to implement all the things I want by myself. After all, if Linus Torvalds can maintain his own MicroEmacs, why can’t I? That’s how Hel and Helheim were born.
Helheim started as a thin config to try Hel. It has since grown into a full-featured framework.
Someone might say that I’m continuing to tune yet another editor — Emacs this time — but I would disagree. Emacs is not a text editor; it’s a Lisp machine with a terminal emulator (which is unfortunate, since I would prefer a full-fledged GUI).
Contributing
Helheim aims to become a community project one day. The most useful things you can do:
- Share it. A post about Helheim on your blog or social media brings new people to Emacs — and that's the whole point.
- Write or improve a module. The modular architecture makes it easy to add support for a package or major mode. PRs welcome.
- Improve the docs. If something is unclear, open an issue — I struggle to guess what's obvious versus what needs explaining, and your confusion is the best signal.
- Support development. Hel and Helheim were built on an old laptop with a cracked screen, instead of grinding LeetCode. If they're useful to you, you can donate via PayPal. Every bit is appreciated.