Emacs: using default minibuffer completion

Published 2024-08-21

tag(s): #emacs #programming

Content warning: some hyperbole in this post.

It isn't the first time I try Emacs without minibuffer completion, as I continue my exploration of vanilla Emacs and built-in behaviours [1].
That's what I am running since yesterday afternoon, and it started as annoying as any other time that I tried it. But something dawned on me yesterday, which prompted this post...

The idea of reducing distractions and bling came around one of the times I moved between lsp-mode and eglot. I forgot to disable the lsp-ui features. My buffer was littered with breadcrumbs, squiggly lines, code previews, and all sorts of hints. Which gives Emacs a semblance of what VS Code does by default, and I am grateful it exists, because it is the expectation of a lot of developers nowadays.[2]
That time though, after a couple days, I went back to the more minimal eglot :)

It started with Company

I dropped Company quite some time ago, which is interesting coming from someone that used Visual Studio for so many years. To think that I would want to write software without "Intellisense" at some point later in my journey as developer is...surprising?

When I removed it, my line of thinking was that I wanted a more focused typing experience. Less popups, annotations, or intrusions of any kind. Just me and the text. There is an eval/compilation step to deal with syntax errors or typos.
In addition, I can still C-M-i to get completion on the exact spelling of any variable[3], library functions, etc.

And it worked! I got used to asking for completion explicitly, and I also started typing more without waiting for confirmation that what I was writing was 100% correct.
Honestly, in many cases it was correct, and letting go of the constant reassurance from the popup was more difficult than I would like to admit.

But let's say I mixed up the name of a function, I would still go back and correct it...later. I didn't lose my train of thought over the exact name of some method, or get distracted over why the name wasn't auto-completed.

Minibuffer completions

The last minibuffer completion framework I used (am using?) is fido-mode, which promised to behave like my very first completion companion, IDO. It kinda did. Apparently it is very slow, but to be honest, I noticed this just a couple times. Usually it would Just Work.

I was about give Prot's mct.el a try, just when he announced that he wasn't developing it anymore (he eventually did go back to maintain it). Around that time too I saw an excellent post about enhancements to Emacs' default completion, some of them prompted by mct, and figured, why not give it a try?

And it was so annoying. And I did try again at least two other separate times. Switching buffers, selecting files, even picking a command is somewhat cumbersome when you don't have the list of candidates filtering as-you-type.

A different way to look at it

Now we get to the hyperbolic and esoteric part of the post :)

All these tools are part confirmation, part saving of us of extra typing. But...why? I am not the fastest typer ever, but I do get a good 65~80 wpm in most tests. Is typing really getting in the way of my productivity? The confirmation that something is correct is maybe more understandable, but saving a few keystrokes...?

What I figured yesterday, is that doing away with completions changes the order of things completely, for example, I want to switch buffers with fido/icomplete:

  1. Hit C-x b and get the list.
  2. Start typing to filter, until I see the name - unless it is "recent", then I skip this.
  3. Navigate the list, or type some more, and hit Enter.
Compare this to the flow without completion:
  1. Hit C-x b and get...an empty prompt
  2. Think about the buffer name, start typing
  3. Hit C-i to narrow down the input, if it wasn't complete, and hit Enter
  4. If I am really lost, hit C-i twice, to get the *Completions* buffer, and then I can type more and narrow it down.

Think about what I need. Rather than visually search in the list. The same applies to navigating directories, calling commands, SQL connections declared in my config, and server names. The first step is to recall something, rather than scrolling in a list.
And looking at my current (and past) annoyance with disabling minibuffer completion, I am beginning to believe it was because of this hurdle: I need to change my ways, add that little pause before I take an action. But that is not a bad thing, maybe?

Lately I've looking at some people working, my boss in particular, and noticed that he just remembers things: commands, server names, directories. I have quite good memory, as my #useless-facts tag attests[4], but I am taking a lot longer to internalize some of these - except maybe the few ones I use more regularly.

And my hypothesis of why I am not internalizing things, is that I am not giving myself a chance to do it, because the tooling is helping too much. Giving me the opportunity to visually search for an item doesn't promote a "think and recall" step, because I am quick with my fingers to get to the list.
This is equivalent to going back in shell history for a command, and realizing that you could have just typed it again instead of getting lost in a list.

Am I reading too much into my stubbornness to stick with the default completion? Am I hurting myself by not using a tool to simplify things, in search of some promised Emacs vanilla land?
There's only way one way to know. If in two days I make another post saying "Today I enabled fido again", we'll have our answer :)

Footnotes
  1. If there's one word in which I cannot let the British spelling go, it is in behaviour. To my untrained ears and thick accent, it just sounds like it should be spelled behaviour.
  2. Actually, if it wasn't for lsp-mode, I wouldn't have moved to LSP for C# when I did. Amazing project.
  3. Many times, dabbrev-expand takes care of this faster than LSP.
  4. But, of course I haven't added tag navigation to the site. Yet?

Back to top

Back to homepage