One of the reasons why I love working in Emacs is the ease to find and jump to files or specific locations in files. Whether it is reopening a recent document, jumping to a bookmark, hopping to a specific header, looking for an expression, it can all be done smoothly and with previews thanks to a powerful modern selection framework.
Another strength is the countless options to auto-complete text. The same modern framework can also be used here.
The backends
Emacs has a bookmark system, it can open files with M-x find-file, look for recently opened files with M-x recentf, search in a buffer with M-x isearch, switch to another open buffer with M-x switch-to-buffer, jump to previous positions in the mark ring, yank text from the kill ring, and countless other functionalities.
Using such functions directly works, but it doesn’t make for the best user experience. Accessing them via a frontend that expands the minibuffer, shows available options, narrows them down through incremental search, and offers previews is a huge improvement.
Multiple such frontends, increasingly powerful and/or efficient, have been developed over time. All of them are still available.
A history of completion frameworks in Emacs
In the minibuffer
A number of completions in Emacs happen in the minibuffer. Those are governed by the completing-read function.
By default, the minibuffer is a single line with no offer of available options. It is quite dry… but many packages have improved it.
First, came IDO (“Interactively DO things”), part of Emacs. It expands the minibuffer and shows options to choose from.
Then, the IDO vertical package made the list of options in the minibuffer vertical, which is a big visual improvement.
HELM came and revolutionized the Emacs world. It became so popular that replacements for many basic Emacs functions got written to work with the HELM frontend.
HELM doesn’t just expands the minibuffer, it turns it into a fully-fledged buffer for much improved functionality.
Because HELM is such a heavy duty tool, it tends to be slow. It also requires rewrites for all of the common function. Ivy came about to bring the snappiness of IDO back. Optional Counsel & Swiper make it nicer with function rewrites.
In the editing buffer
In-buffer completions, governed by completion-at-point are completions that happen in the buffer itself.
By default, the available options are displayed in a *Completions* buffer that is quite clunky to navigate. A number of packages have instead allowed them to happen in small pop-ups.
In recent years, a new set of packages came about which integrate closely Emacs internal functions. Lightweight, they are incredibly fast. Each package works on its own and you can pick and choose which functionality you want.
These packages are extremely well documented and you will find in the READMEs all the information you need to install and configure them to your liking.
As an example, I am sharing here my own configurations (menus most kbds which rely on an exotic self-made system), including those for eglot—Emacs client for Language Server Protocol servers, Abbrevs—Emacs abbreviation system, yasnippet—a template system for Emacs, and copilot, an Emacs plug-in to GitHub Copilot.
It wouldn’t make much sense to copy-paste this to your init file blindly: instead, read careful the README of the various packages, decide which you want to use, and start with a minimal configuration based on the packages’ authors suggestions.