hel-demo.webm

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.

- 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.

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.

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

- search — Consult + Deadgrep

- embark — A keyboard-driven analogue of a right-click context menu.

- dired — File manager

- ibuffer — Buffers menu

- Version control

- magit — Magit with keys adopted for Hel

- git-gutter — Git gutter indicators

- IDE

- eglot + flymake — LSP client and diagnostics built-in into Emacs

- lsp-mode + flycheck — external LSP client and diagnostics packages

- xref — Go-to-definition

- snippets engine

- Org-mode

- org-node — personal knowledge management (Org-roam alternative)

- daily-notes — Daily scratchpad / Inbox

- latex — fast LaTeX-math typing in Org mode

- 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

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.el sets 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.

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.

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)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).

Important

universal-argument is rebound to M-u since C-u is used for scrolling.

Tip

Bind Caps Lock to Esc, and configure Space to tap+hold behavior: Space on

tap and Ctrl on hold. You can use any of these tools: kanata, kmonad,

keyd (Linux), Karabiner-Elements (Mac).

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).

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.