Skip to main content

My 10 Years with Emacs

Because life is too short for bad software

Today, 10 years ago, I had my first encounter with Emacs, and that day definitely changed the way I work with computers—if not my entire life.

I remember that day so clearly because it was the day after the very first meeting of the "Warpzonista Coding Club." At that time, the Warpzone was my local hackerspace, and its focus was mainly on hardware tinkering. I wanted to meet more people who, like me, were into programming, and while enjoying the most beautiful sunshine and some light Son Cubano music, the idea of founding the Coding Club came to me. The first meeting took place on February 27, 2015. After a brief introduction, the conversation naturally turned to a topic every programmer eventually has to decide for themselves: their choice of text editor.

Since I was mainly coding professionally at the time, I used the integrated development environment that Microsoft shipped with Visual Basic 6. However, I wanted to program in Python on Linux and was looking for a good editor. I had already tried Vim before, but something about it didn't sit right with me. That evening, I met Christian Kruse, and we talked about how my mind works—I naturally think in hierarchies. Trees are my thing; I approach problems by backtracking through different solutions, and I break down projects into tasks and sub-tasks.

He then said: "Then Org mode will be your thing," and gave me a quick overview on his laptop. The next day, I installed Emacs and tried to get a feel for it myself. To cut a long story short: Org mode was amazing, but I absolutely couldn’t get used to the way Emacs worked. Christian had already warned me, and I knew I needed something called CUA mode. A bit of Googling led me to my first configuration files, which others had shared on the internet.

The First Configs

I spent a few weeks putting together a usable configuration. I gathered some snippets from various places online. CUA mode was included, YASnippet as well, and I discovered that I could create my own keybindings. At the time, I didn't know I could set keybindings per mode, so I made them all global, which, of course, didn’t take long before my first "config bankruptcy," a term I wasn’t familiar with back then. The main reason was that the configuration snippets I copied often came with their own namespaces, which I didn’t recognize at first.

My second approach to configuring Emacs was much closer to what I still use today. I had read a lot in the Emacs manual, understood keybinding layers, and also realized that when copying other people's configurations, it was crucial to adapt them to my package manager. My second config was therefore much more structured.

I set up a minimal ini.cfg that did nothing except loading three other configuration files:

  • A base configuration where I defined my preferred settings for each installed package (except for keybindings).
  • A keybinding configuration that contained all keybindings in one place—this way, I thought, I wouldn’t accidentally create conflicts.
  • A custom adjustments file where any changes made through Emacs' built-in configuration tools would go.

This setup worked well for about 1–2 years. Over time, I became more familiar with Emacs, learning how CTRL-X and CTRL-C serve as entry points into the entire keyboard system. I began to appreciate how well-thought-out and sensible Emacs' defaults were, but they still didn’t work with my brain. A big step forward was discovering the Hydra package. But first, Ledger

Ledger

One of the first packages that had a real impact on my daily life was Ledger mode. Ledger is a plain-text double-entry bookkeeping system. I quickly started writing my bank transactions into a file. With a bit of thought, I even managed to implement my grandmother’s envelope budgeting system. This ended up saving my finances by giving me complete clarity over my money.

Hydra

Up until that point, I had two ways to call functions: either through a keybinding or by looking up the function name online and calling it via M-X. With Hydra, I could now group important functions together, making them available only in relevant modes. I became a huge Hydra fan and eventually consolidated all my Hydras into a single file, which evolved into my Project Medusa, now the fourth file in my Emacs configuration.

Helm

The next big improvement was Helm. Choosing from multiple options in the minibuffer, especially for M-x, was a pain. Helm provided a much more comfortable interface. I could even display results in a separate buffer within the same window or in a neighboring window.

Although things were already much better, a Video by Prot made me rethink my approach to window management. Since then, I have replaced Helm with what I call the VOCEM stack.

VOCEM

VOCEM stands for Vertico, Orderless, Consult, Embark, and Marginalia. Many Emacs users have adopted this combination, though each package can also be used separately:

Vertico
provides a fast and minimalistic vertical completion UI.
Orderless
allows for flexible, out-of-order completion.
Consult
offers enhanced search and navigation tools.
Embark
acts like a context menu, making it easy to take actions on items near the cursor.
Marginalia
adds helpful annotations to minibuffer completions.

Denote

Denote had just as much of an impact on me as Orgmode. Long before Emacs, I had been trying to organize all the loose thoughts, ideas, and sources that I otherwise carried around in my head on my computer. Similar to how Luhmann, here in the region, worked with his legendary Zettelkasten. Either the approaches didn't work for me at all, or the filing system (which always maintained some kind of external index of the knowledge) eventually lost sync between the knowledge and the index. Denote attaches all metadata directly to the file, and so, even when sharing across all my devices, I have never managed to throw my mental exoskeleton out of sync. A great, well-thought-out piece of software.

Things I Intentionally Avoid

  • For example, I do not use a package tool that keeps the entire configuration for a package in one place. I deliberately want all keybindings for all packages in one location, and the same goes for my Hydras. These build on each other, and it is practical to have them all in a single file without other distractions.
  • Zettelkasten. I don't know the software, but I have a strongly negative opinion about the digitization of Luhmann's concept. It's the year 2025, and the hyperlink has been invented.

Conclusion

The path I have taken over these 10 years is just one of thousands of possible ways. Everyone uses Emacs for different things, and every mind works differently. I can definitely recommend carefully considering your own requirements for the Emacs environment:

  1. Take a short note whenever something feels "wrong" to you. Eliminate these things from time to time.
  2. Try to figure out what kinds of things you want to work with in Emacs: Configs? Novels? Accounting files? Addresses? Emails? Websites? Quotes? Places? This list could go on indefinitely.
  3. For each of these things, make a list of the actions you commonly perform on them. For example, web links: Open in browser, open in external browser, save, publish in blog, sync across all devices, etc.
  4. Gradually build your personal workflow from these elements.
  5. Don’t do this directly on the computer, write these thoughts down on paper and keep this workflow as a battle plan for yourself.

Thanks

Of course, I want to start by thanking Christian Kruse, who nudged me in the right direction 10 years ago. But also a few other people (and I’ll surely forget some in the end). As a bonus, you’ll get to know how I refer to these people in my mind.

  • Sacha Chua, the "Mother of the Company," for her tireless work in keeping the Emacs community connected through her Emacs News and the annual Emacs Conference. She also regularly documents the real-world problems she solves and the methods she uses, explaining why they work.
  • Protesilaos "Prot" Stavrou, "The Philosopher," for Denote and especially for openly sharing his thoughts on designing Emacs packages in his blog. This makes it easy to understand whether his packages align with one’s personal workflow.
  • Karl Voit, "Mr. PIM," for his fantastic Org-mode talk and the idea of rethinking how one manages personal information from the ground up. I came to different conclusions than he did, but through this, I learned how my brain works and that it makes sense to embrace its differences.
  • David Wilson, "The Explainer-in-Chief", for his countless System Crafters videos, which are always helpful when you need something explained in great detail.

Many others, whose ideas I’ve read here and there, have also grown close to my heart.

Here’s to the next 10 years with all of you.

2025-02-28