helheim-emacs/helheim

Helheim to Helix is what Spacemacs and Doom are to Vim

Emacs Lisp

55

368 commits

updated Sep 21, 2026

See the code

See what people are saying

README

* Helheim Emacs

#+html: <a href="https://www.gnu.org/software/emacs/"><img alt="GNU Emacs" src="https://img.shields.io/badge/GNU%20Emacs-29.1%2B-7F5AB6?logo=gnuemacs&logoColor=white"></a>
#+html: <a href="LICENSE"><img alt="License: GPLv3" src="https://img.shields.io/badge/license-GPLv3-blue"></a>

https://github.com/user-attachments/assets/09d1a77d-2a3e-4cae-a005-e69ae03e5a7e

#+begin_quote
*This is the realm of Hel*
#+end_quote

Helheim is an Emacs configuration framework built around [[https://github.com/anuvyklack/hel][Hel]] — a [[https://helix-editor.com/][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.

- [[file:user-lisp/helheim/05-lsp/xref/README.org][Xref]] is patched to try all registered backends in sequence until one
  succeeds, with [[https://github.com/jacktasia/dumb-jump][Dumb Jump]] as a universal fallback.

- [[file:user-lisp/helheim/org-mode/README.org][Org-mode]] fully preconfigured as personal knowledge management system
  with [[file:user-lisp/helheim/org-mode/helheim-org-node/README.org][bidirectional links]] and [[file:user-lisp/helheim/org-mode/helheim-daily-notes/README.org][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.

#+html: <img src="https://github.com/user-attachments/assets/9a74b442-c1ae-4e64-b1fa-3fc3b323998f" width="60%" align="right">
#+html: <br clear="both">

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

#+begin_quote
[!NOTE]
This is an Emacs 31 feature backported to Helheim.
#+end_quote

*** Modules

Every entry in ~user-lisp/helheim/~ is a self-contained module, ~require~ only
what you need.

- UI
  - [[file:user-lisp/helheim/modeline/README.org][modeline]] — status-line
  - [[file:user-lisp/helheim/tab-bar/README.org][tab-bar]] — Each tab is a window layout, like in Vim

- Essentials
  - [[file:user-lisp/helheim/01-minibuffer/README.org][minibuffer]] — [[https://github.com/minad/vertico][Vertico]] + [[https://github.com/minad/marginalia][Marginalia]]
  - [[file:user-lisp/helheim/02-completion/README.org][completion]] — [[https://github.com/oantolin/orderless][Orderless]] + [[https://github.com/minad/corfu][Corfu]] + [[https://github.com/minad/cape][Cape]]
  - [[file:user-lisp/helheim/03-search/README.org][search]] — [[https://github.com/minad/consult][Consult]] + [[https://github.com/Wilfred/deadgrep][Deadgrep]]
  - [[file:user-lisp/helheim/embark/README.org][embark]] — A keyboard-driven analogue of a right-click context menu.
  - [[file:user-lisp/helheim/dired/README.org][dired]] — File manager
  - [[file:user-lisp/helheim/ibuffer/README.org][ibuffer]] — Buffers menu

- Version control
  - [[file:user-lisp/helheim/04-version-control/magit/README.org][magit]] — Magit with keys adopted for Hel
  - [[file:user-lisp/helheim/04-version-control/git-gutter/README.org][git-gutter]] — Git gutter indicators

- IDE
  - [[file:user-lisp/helheim/05-lsp/eglot/README.org][eglot + flymake]] — LSP client and diagnostics  built-in into Emacs 
  - [[file:user-lisp/helheim/05-lsp/lsp-mode/README.org][lsp-mode + flycheck]] — external LSP client and diagnostics packages
  - [[file:user-lisp/helheim/05-lsp/xref/README.org][xref]] — Go-to-definition
  - [[file:user-lisp/helheim/snippets/README.org][snippets engine]]

- [[file:user-lisp/helheim/org-mode/helheim-org/README.org][Org-mode]]
  - [[file:user-lisp/helheim/org-mode/helheim-org-node/README.org][org-node]] — personal knowledge management (Org-roam alternative)
  - [[file:user-lisp/helheim/org-mode/helheim-daily-notes/README.org][daily-notes]] — Daily scratchpad / Inbox
  - [[file:user-lisp/helheim/latex/README.org][latex]] — fast LaTeX-math typing in Org mode

- Terminal emulators
  - [[file:user-lisp/helheim/07-terminal/ghostel/README.org][ghostel]] — based on =libghostty= same as used in Ghostty
  - [[file:user-lisp/helheim/07-terminal/vterm/README.org][vterm]] — based on libvterm same as in Neovim

- LLM
  - [[file:user-lisp/helheim/08-llm/agent-shell/README.org][agent-shell]] — Shell for coding agents inside Emacs
  - [[file:user-lisp/helheim/08-llm/mcp-server/README.org][mcp-server]] — MCP server exposing Emacs to LLMs

- Misc
  - [[file:user-lisp/helheim/email/notmuch/README.org][notmuch]] — Notmuch email client
  - [[file:user-lisp/helheim/browser-integration/README.org][browser-integration]] — Edit browser text fields in Emacs (GhostText)
  - [[file:user-lisp/helheim/speech-to-text/README.org][speech-to-text]] — speech-to-text conversion with whisper.el

** Installation

GNU Emacs 29.1 or later is required.

1. Install *Symbols Nerd Font* from [[https://www.nerdfonts.com/][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:
   #+begin_src sh
   git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/helheim-emacs
   #+end_src

   Or clone to the standard =~/.config/emacs= if you want Emacs to load it automatically.
   #+begin_src sh
   git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/emacs
   #+end_src

3. Rename ~init.example.el~ to ~init.el~.

4. Run Emacs. Passing the path to config explicitly if it is not standard:
   #+begin_src emacs-lisp
   emacs --maximize --init-dir ~/.config/helheim-emacs &
   #+end_src

#+begin_quote
[!IMPORTANT]
~init.example.el~ sets the default font to [[https://github.com/microsoft/cascadia-code][Cascadia Code]]. Install it or swap
to a font you prefer.
#+end_quote

#+begin_quote
[!IMPORTANT]
Hel uses =U+2000= (EN QUAD) for secondary cursors by default. It should be bound
to a variable-pitch font.
#+end_quote

** Configuration
*** Package manager

Helheim supports two package managers:
  - [[https://github.com/radian-software/straight.el][straight]] — (default) mature, stable, lock-file support.
  - [[https://github.com/progfolio/elpaca][elpaca]] — younger, asynchronous, much faster,
    [[https://github.com/progfolio/elpaca/issues/447][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 [[https://github.com/anuvyklack/hel-leader][hel-leader]] package (see its
README because it also emulates =C-x=, =C-c C-…=, =M-…= and =C-M-…=).

#+begin_quote
[!IMPORTANT]
If you want to create a keybinding under the leader prefix, bind under =C-c=.
#+end_quote

Example:
#+begin_src emacs-lisp
(keymap-global-set "C-c RET" 'dired-jump)
#+end_src

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

#+begin_src emacs-lisp
(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))
#+end_src

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

#+begin_quote
[!IMPORTANT]
~universal-argument~ is rebound to =M-u= since =C-u= is used for scrolling.
#+end_quote

#+begin_quote
[!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: [[https://github.com/pqrs-org/Karabiner-Elements][kanata]], [[https://github.com/pqrs-org/Karabiner-Elements][kmonad]],
[[https://github.com/pqrs-org/Karabiner-Elements][keyd]] (Linux), [[https://github.com/pqrs-org/Karabiner-Elements][Karabiner-Elements]] (Mac).
#+end_quote

** 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 [[https://github.com/torvalds/uemacs][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 [[https://andreyor.st/posts/2023-07-11-emacs-gui-library/][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 [[https://www.paypal.me/anuvyklack][PayPal]]. Every bit is appreciated.

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Significant stargazers

Bastian Köcher

842 followers · starred Jul 2026

Jorge Gomez

233 followers · starred Jul 2026

helheim-emacs/helheim

Helheim to Helix is what Spacemacs and Doom are to Vim

Emacs Lisp

55

368 commits

updated Sep 21, 2026

See the code

See what people are saying

README

* Helheim Emacs

#+html: <a href="https://www.gnu.org/software/emacs/"><img alt="GNU Emacs" src="https://img.shields.io/badge/GNU%20Emacs-29.1%2B-7F5AB6?logo=gnuemacs&logoColor=white"></a>
#+html: <a href="LICENSE"><img alt="License: GPLv3" src="https://img.shields.io/badge/license-GPLv3-blue"></a>

https://github.com/user-attachments/assets/09d1a77d-2a3e-4cae-a005-e69ae03e5a7e

#+begin_quote
*This is the realm of Hel*
#+end_quote

Helheim is an Emacs configuration framework built around [[https://github.com/anuvyklack/hel][Hel]] — a [[https://helix-editor.com/][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.

- [[file:user-lisp/helheim/05-lsp/xref/README.org][Xref]] is patched to try all registered backends in sequence until one
  succeeds, with [[https://github.com/jacktasia/dumb-jump][Dumb Jump]] as a universal fallback.

- [[file:user-lisp/helheim/org-mode/README.org][Org-mode]] fully preconfigured as personal knowledge management system
  with [[file:user-lisp/helheim/org-mode/helheim-org-node/README.org][bidirectional links]] and [[file:user-lisp/helheim/org-mode/helheim-daily-notes/README.org][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.

#+html: <img src="https://github.com/user-attachments/assets/9a74b442-c1ae-4e64-b1fa-3fc3b323998f" width="60%" align="right">
#+html: <br clear="both">

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

#+begin_quote
[!NOTE]
This is an Emacs 31 feature backported to Helheim.
#+end_quote

*** Modules

Every entry in ~user-lisp/helheim/~ is a self-contained module, ~require~ only
what you need.

- UI
  - [[file:user-lisp/helheim/modeline/README.org][modeline]] — status-line
  - [[file:user-lisp/helheim/tab-bar/README.org][tab-bar]] — Each tab is a window layout, like in Vim

- Essentials
  - [[file:user-lisp/helheim/01-minibuffer/README.org][minibuffer]] — [[https://github.com/minad/vertico][Vertico]] + [[https://github.com/minad/marginalia][Marginalia]]
  - [[file:user-lisp/helheim/02-completion/README.org][completion]] — [[https://github.com/oantolin/orderless][Orderless]] + [[https://github.com/minad/corfu][Corfu]] + [[https://github.com/minad/cape][Cape]]
  - [[file:user-lisp/helheim/03-search/README.org][search]] — [[https://github.com/minad/consult][Consult]] + [[https://github.com/Wilfred/deadgrep][Deadgrep]]
  - [[file:user-lisp/helheim/embark/README.org][embark]] — A keyboard-driven analogue of a right-click context menu.
  - [[file:user-lisp/helheim/dired/README.org][dired]] — File manager
  - [[file:user-lisp/helheim/ibuffer/README.org][ibuffer]] — Buffers menu

- Version control
  - [[file:user-lisp/helheim/04-version-control/magit/README.org][magit]] — Magit with keys adopted for Hel
  - [[file:user-lisp/helheim/04-version-control/git-gutter/README.org][git-gutter]] — Git gutter indicators

- IDE
  - [[file:user-lisp/helheim/05-lsp/eglot/README.org][eglot + flymake]] — LSP client and diagnostics  built-in into Emacs 
  - [[file:user-lisp/helheim/05-lsp/lsp-mode/README.org][lsp-mode + flycheck]] — external LSP client and diagnostics packages
  - [[file:user-lisp/helheim/05-lsp/xref/README.org][xref]] — Go-to-definition
  - [[file:user-lisp/helheim/snippets/README.org][snippets engine]]

- [[file:user-lisp/helheim/org-mode/helheim-org/README.org][Org-mode]]
  - [[file:user-lisp/helheim/org-mode/helheim-org-node/README.org][org-node]] — personal knowledge management (Org-roam alternative)
  - [[file:user-lisp/helheim/org-mode/helheim-daily-notes/README.org][daily-notes]] — Daily scratchpad / Inbox
  - [[file:user-lisp/helheim/latex/README.org][latex]] — fast LaTeX-math typing in Org mode

- Terminal emulators
  - [[file:user-lisp/helheim/07-terminal/ghostel/README.org][ghostel]] — based on =libghostty= same as used in Ghostty
  - [[file:user-lisp/helheim/07-terminal/vterm/README.org][vterm]] — based on libvterm same as in Neovim

- LLM
  - [[file:user-lisp/helheim/08-llm/agent-shell/README.org][agent-shell]] — Shell for coding agents inside Emacs
  - [[file:user-lisp/helheim/08-llm/mcp-server/README.org][mcp-server]] — MCP server exposing Emacs to LLMs

- Misc
  - [[file:user-lisp/helheim/email/notmuch/README.org][notmuch]] — Notmuch email client
  - [[file:user-lisp/helheim/browser-integration/README.org][browser-integration]] — Edit browser text fields in Emacs (GhostText)
  - [[file:user-lisp/helheim/speech-to-text/README.org][speech-to-text]] — speech-to-text conversion with whisper.el

** Installation

GNU Emacs 29.1 or later is required.

1. Install *Symbols Nerd Font* from [[https://www.nerdfonts.com/][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:
   #+begin_src sh
   git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/helheim-emacs
   #+end_src

   Or clone to the standard =~/.config/emacs= if you want Emacs to load it automatically.
   #+begin_src sh
   git clone https://github.com/anuvyklack/helheim-emacs.git ~/.config/emacs
   #+end_src

3. Rename ~init.example.el~ to ~init.el~.

4. Run Emacs. Passing the path to config explicitly if it is not standard:
   #+begin_src emacs-lisp
   emacs --maximize --init-dir ~/.config/helheim-emacs &
   #+end_src

#+begin_quote
[!IMPORTANT]
~init.example.el~ sets the default font to [[https://github.com/microsoft/cascadia-code][Cascadia Code]]. Install it or swap
to a font you prefer.
#+end_quote

#+begin_quote
[!IMPORTANT]
Hel uses =U+2000= (EN QUAD) for secondary cursors by default. It should be bound
to a variable-pitch font.
#+end_quote

** Configuration
*** Package manager

Helheim supports two package managers:
  - [[https://github.com/radian-software/straight.el][straight]] — (default) mature, stable, lock-file support.
  - [[https://github.com/progfolio/elpaca][elpaca]] — younger, asynchronous, much faster,
    [[https://github.com/progfolio/elpaca/issues/447][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 [[https://github.com/anuvyklack/hel-leader][hel-leader]] package (see its
README because it also emulates =C-x=, =C-c C-…=, =M-…= and =C-M-…=).

#+begin_quote
[!IMPORTANT]
If you want to create a keybinding under the leader prefix, bind under =C-c=.
#+end_quote

Example:
#+begin_src emacs-lisp
(keymap-global-set "C-c RET" 'dired-jump)
#+end_src

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

#+begin_src emacs-lisp
(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))
#+end_src

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

#+begin_quote
[!IMPORTANT]
~universal-argument~ is rebound to =M-u= since =C-u= is used for scrolling.
#+end_quote

#+begin_quote
[!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: [[https://github.com/pqrs-org/Karabiner-Elements][kanata]], [[https://github.com/pqrs-org/Karabiner-Elements][kmonad]],
[[https://github.com/pqrs-org/Karabiner-Elements][keyd]] (Linux), [[https://github.com/pqrs-org/Karabiner-Elements][Karabiner-Elements]] (Mac).
#+end_quote

** 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 [[https://github.com/torvalds/uemacs][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 [[https://andreyor.st/posts/2023-07-11-emacs-gui-library/][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 [[https://www.paypal.me/anuvyklack][PayPal]]. Every bit is appreciated.

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Significant stargazers

Bastian Köcher

842 followers · starred Jul 2026

Jorge Gomez

233 followers · starred Jul 2026

Languages

Emacs Lisp

100.0%