Emacs: modern minibuffer packages (Vertico, Consult, etc.)
Raw link: https://www.youtube.com/watch?v=d3aaxOqwHhI
In this ~44 minute video I demonstrate packages that upgrade the experience with Emacs. They are about the minibuffer: where we interact with Emacs to call a command by its name or pick a candidate for some action.
The packages I cover are vertico
, marginalia
, consult
,
orderless
, and embark
. I also mention briefly the wgrep
package
as well as the built-in savehist-mode
, recentf-mode
.
A related video I did about search (search+replace): https://protesilaos.com/codelog/2023-06-10-emacs-search-replace-basics/.
Sample configuration
;; The `vertico' package applies a vertical layout to the minibuffer.
;; It also pops up the minibuffer eagerly so we can see the available
;; options without further interactions. This package is very fast
;; and "just works", though it also is highly customisable in case we
;; need to modify its behaviour.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:cff33514-d3ac-4c16-a889-ea39d7346dc5
(use-package vertico
:ensure t
:config
(setq vertico-cycle t)
(setq vertico-resize nil)
(vertico-mode 1))
;; The `marginalia' package provides helpful annotations next to
;; completion candidates in the minibuffer. The information on
;; display depends on the type of content. If it is about files, it
;; shows file permissions and the last modified date. If it is a
;; buffer, it shows the buffer's size, major mode, and the like.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:bd3f7a1d-a53d-4d3e-860e-25c5b35d8e7e
(use-package marginalia
:ensure t
:config
(marginalia-mode 1))
;; The `orderless' package lets the minibuffer use an out-of-order
;; pattern matching algorithm. It matches space-separated words or
;; regular expressions in any order. In its simplest form, something
;; like "ins pac" matches `package-menu-mark-install' as well as
;; `package-install'. This is a powerful tool because we no longer
;; need to remember exactly how something is named.
;;
;; Note that Emacs has lots of "completion styles" (pattern matching
;; algorithms), but let us keep things simple.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:7cc77fd0-8f98-4fc0-80be-48a758fcb6e2
(use-package orderless
:ensure t
:config
(setq completion-styles '(orderless basic)))
;; The `consult' package provides lots of commands that are enhanced
;; variants of basic, built-in functionality. One of the headline
;; features of `consult' is its preview facility, where it shows in
;; another Emacs window the context of what is currently matched in
;; the minibuffer. Here I define key bindings for some commands you
;; may find useful. The mnemonic for their prefix is "alternative
;; search" (as opposed to the basic C-s or C-r keys).
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:22e97b4c-d88d-4deb-9ab3-f80631f9ff1d
(use-package consult
:ensure t
:bind (;; A recursive grep
("M-s M-g" . consult-grep)
;; Search for files names recursively
("M-s M-f" . consult-find)
;; Search through the outline (headings) of the file
("M-s M-o" . consult-outline)
;; Search the current buffer
("M-s M-l" . consult-line)
;; Switch to another buffer, or bookmarked file, or recently
;; opened file.
("M-s M-b" . consult-buffer)))
;; The `embark' package lets you target the thing or context at point
;; and select an action to perform on it. Use the `embark-act'
;; command while over something to find relevant commands.
;;
;; When inside the minibuffer, `embark' can collect/export the
;; contents to a fully fledged Emacs buffer. The `embark-collect'
;; command retains the original behaviour of the minibuffer, meaning
;; that if you navigate over the candidate at hit RET, it will do what
;; the minibuffer would have done. In contrast, the `embark-export'
;; command reads the metadata to figure out what category this is and
;; places them in a buffer whose major mode is specialised for that
;; type of content. For example, when we are completing against
;; files, the export will take us to a `dired-mode' buffer; when we
;; preview the results of a grep, the export will put us in a
;; `grep-mode' buffer.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:61863da4-8739-42ae-a30f-6e9d686e1995
(use-package embark
:ensure t
:bind (("C-." . embark-act)
:map minibuffer-local-map
("C-c C-c" . embark-collect)
("C-c C-e" . embark-export)))
;; The `embark-consult' package is glue code to tie together `embark'
;; and `consult'.
(use-package embark-consult
:ensure t)
;; The `wgrep' packages lets us edit the results of a grep search
;; while inside a `grep-mode' buffer. All we need is to toggle the
;; editable mode, make the changes, and then type C-c C-c to confirm
;; or C-c C-k to abort.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:9a3581df-ab18-4266-815e-2edd7f7e4852
(use-package wgrep
:ensure t
:bind ( :map grep-mode-map
("e" . wgrep-change-to-wgrep-mode)
("C-x C-q" . wgrep-change-to-wgrep-mode)
("C-c C-c" . wgrep-finish-edit)))
;; The built-in `savehist-mode' saves minibuffer histories. Vertico
;; can then use that information to put recently selected options at
;; the top.
;;
;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a
(savehist-mode 1)
;; The built-in `recentf-mode' keeps track of recently visited files.
;; You can then access those through the `consult-buffer' interface or
;; with `recentf-open'/`recentf-open-files'.
;;
;; I do not use this facility, because the files I care about are
;; either in projects or are bookmarked.
(recentf-mode 1)
More links to my Emacs configuration
My personal Emacs configuration. It is comprehensive, both in terms of the [custom] code it contains as well as the documentation on what each piece of functionality does.
- Website: https://protesilaos.com/emacs/dotemacs
- Git repositories:
- Video demo: https://protesilaos.com/codelog/2023-12-18-emacs-org-advanced-literate-conf/
- Backronym: Do Observe, Transpose, Examine, or Mirror All Configurations, Stranger (dotemacs); Dotfiles Operate Transparently For the Included Linux and Emacs Setups (dotfiles).