It was a cold winter back in December 2014. If memory serves me well, it was time spent at tinkering with old hardware and obscure window managers, reading my first books on functional programming, and dealing with something about text editors I can’t quite put my finger on.

I was also reading about Helm and the praises everywhere in the Emacs community for this package: it can do this, it improves that, it will take you closer to Emacs Nirvana. So yeah, I believed the hype, because it came from trusted sources, especially the Nirvana-guy. Soon Helm took over my configuration and I was using it for everything: switching buffers, selecting bookmarks, in-buffer and per-project searches. Anything involving candidate completion was in the wise hands of Helm.

After a while Ivy came along, and the rest is history. I have been using Ivy/Counsel for such a long a time I might as well say they have become the central drivers of my Emacs setup. Along with the likes of counsel-projectile, these are the packages I use the most during the day.

Lately I’ve been following some conversations about completion-styles, and when I learned that Thierry Volpiatto was working on leveraging Helm for this I just could not resist. Note that Thierry is still devising the implementation, so there is no need to rush at opening issues and scream at him. Anyway, Helm was back in my radar now, and so I took the chance to see if I could come up with a setup which would mirror my everyday workflow with Ivy/Counsel.

I immediately noticed that the theme I use lacked proper support for some Helm faces, but nothing stopped me to do something about it. Much like Ivy/Counsel, Helm provides its own version for common operations such as helm-M-x, helm-find-files, helm-mini, helm-recentf, helm-bookmarks, helm-show-kill-ring, and helm-resume. These are the core features for me, and they work as expected. I also enabled helm-adaptive-mode and helm-autoresize-mode, fixing the Helm window height to my preferences.

As I did with Ivy/Counsel, I made buffer switching (i.e., helm-mini) ignore some files:

(require 'helm-buffers)
(setq helm-ff-skip-boring-files t)
(dolist (regexp '("\\`\\*direnv" "\\`\\*straight" "\\`\\*xref"))
  (cl-pushnew regexp helm-boring-buffer-regexp-list))

My projects are all Git-versioned, hence I installed helm-ls-git, which superseded Projectile and the related helm-projectile in an instant. In order to make per-project lookups with Helm as easy as they were with Ivy/Counsel, I went with helm-ag and helm-xref. To make it even better, I added psession and configured it to persist the things I need from my Emacs sessions. The only goodies I put on top of this setup are helm-bibtex and helm-tramp.

Back in the day, Helm felt heavier and more bloated than Ivy/Counsel, but that is nonsense and was probably due to me being still young and inexperienced at Emacs tweaking. In fact, it still takes less than one second for my Emacs to boot, and so far there is nothing in terms of functionalities I have been missing from my previous configuration. We could argue about UI minimalism and design choices as long as we want, or we could simply try what the Emacs ecosystem offers and decide for ourselves what suits our text editor best.