No description
  • Emacs Lisp 100%
Find a file
2026-07-06 10:56:21 +03:00
docs docs 2026-06-29 23:44:19 +03:00
user-lisp fix(terminal): ghostel installation recipe 2026-07-06 10:56:21 +03:00
.gitignore docs 2026-06-22 01:15:11 +03:00
early-init.el chore: comments 2026-06-22 01:23:37 +03:00
init.example.el docs 2026-06-29 23:44:19 +03:00
LICENSE Initial commit 2025-12-20 21:25:40 +03:00
README.org docs 2026-06-29 23:57:40 +03:00

Helheim Emacs

GNU Emacs License: GPLv3

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.

Installation

GNU Emacs 29.1 or later is required.

  1. 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.
  2. If you want just to try Helheim, clone it into any directory:

    git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/helheim-emacs

    Or clone to the standard ~/.config/emacs if you want Emacs to load it automatically.

    git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/emacs
  3. Rename init.example.el to init.el.
  4. 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.

Configuration

Package manager

Helheim supports two package managers:

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-theme or enable-theme?
  • How to customize faces for a specific theme? By default you can only use the customize interface, and all face overrides are global — if you switch themes, the overrides persist.
  • How do you switch themes on the fly? Its not easy. Loading a new theme doesnt disable the previous one, leaving multiple themes enabled simultaneously.

Helheim takes care of all of these problems:

  • Use load-theme either interactively or programmatically to load and activate the theme you want.
  • Use helheim-theme-set-faces to 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-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).

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 cant I? Thats 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 Im continuing to tune yet another editor — Emacs this time — but I would disagree. Emacs is not a text editor; its 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.