This module enhances the Emacs search and completion experience, and also provides a united interface for project search and replace, powered by ripgrep.
It does this with several modular packages focused on enhancing the built-in
completing-read
interface, rather than replacing it with a parallel ecosystem
like ivy
and helm
do. The primary packages are:
- Vertico, which provides the vertical completion user interface
- Consult, which provides a suite of useful commands using
completing-read
- Embark, which provides a set of minibuffer actions
- Marginalia, which provides annotations to completion candidates
- Orderless, which provides better filtering methods
- @iyefrat
+icons
Adds icons tofile
andbuffer
category completion selections.
- vertico
- consult
- embark
- embark-consult
- marginalia
- orderless
- wgrep
- consult-flycheck (
:checkers syntax
) - all-the-icons-completion (
+icons
)
This module has no prerequisites.
The packages in this module modify and use the built-in completing-read
function, which is used by any function that requires completion. Due to this
the full scope of these packages is too large to cover here and you are
encouraged to go and read their excellent documentation. We will detail
Doom-specific additions:
When in an active Vertico completion session, the following doom added keybindings are available:
Keybind | Description |
---|---|
C-p | Go to previous candidate |
C-n | Go to next candidate |
C-k | (evil) Go to previous candidate |
C-j | (evil) Go to next candidate |
C-; or <leader> a | Open an embark-act menu to chose a useful action |
C-c C-; | export the current candidate list to a buffer |
C-SPC | Preview the current candidate |
C-M-k | (evil) Go to previous candidate and preview. |
C-M-j | (evil) Go to next candidate and preview. |
embark-act
will prompt you with a which-key
menu with useful commands on the
selected candidate or candidate list, depending on the completion category. Note
that you can press C-h
instead of choosing a command to filter through the
options with a Vertico buffer, that also has slightly more detailed descriptions
due to Marginalia annotations.
This module provides an interface to navigate within a project using
projectile
:
https://assets.doomemacs.org/completion/vertico/projectile.png
Keybind | Description |
---|---|
SPC p f , SPC SPC | Jump to file in project |
SPC f f , SPC . | Jump to file from current directory |
SPC s i | Jump to symbol in file |
This module provides interactive text search and replace using ripgrep.
Keybind | Description |
---|---|
SPC s p | Search project |
SPC s P | Search another project |
SPC s d | Search this directory |
SPC s D | Search another directory |
https://assets.doomemacs.org/completion/vertico/search.png
Prefixing these keys with the universal argument (SPC u
for evil users; C-u
otherwise) changes the behavior of these commands, instructing the underlying
search engine to include ignored files.
This module also provides Ex Commands for evil users:
Ex command | Description |
---|---|
:pg[rep][!] [QUERY] | Search project (if ! , include hidden files) |
:pg[rep]d[!] [QUERY] | Search from current directory (if ! , don’t search recursively) |
The optional `!` is equivalent to the universal argument for the previous commands.
On top of the usual Vertico keybindings, search commands also offer support for
exporting the current candidate list to an editable buffer C-c C-e
. After
editing the changes can be committed with C-c C-c
and aborted with C-c C-k
(alternatively ZZ
and ZQ
, for evil users). It uses wgrep
for grep
searches, wdired
for file searches, and occur
for buffer searches.
https://assets.doomemacs.org/completion/vertico/search-replace.png
This module provides some in buffer searching bindings:
SPC s s
(isearch
)SPC s S
(+vertico/search-symbol-at-point
viaconsult-line
)SPC s b
(consult-line
)
https://assets.doomemacs.org/completion/vertico/buffer-search.png
An occur-edit
buffer can be opened from consult-line
with C-c C-e
.
Keybind | Description |
---|---|
M-x , SPC : | Enhanced M-x |
SPC ' | Resume last Vertico session |
Keybind | Description |
---|---|
SPC RET | Find bookmark |
SPC f f , SPC . | Browse from current directory |
SPC p f , SPC SPC | Find file in project |
SPC f r | Find recently opened file |
SPC p p | Open another project |
SPC b b , SPC , | Switch to buffer in current workspace |
SPC b B , SPC < | Switch to buffer |
SPC b b
and SPC ,
support changing the workspace you’re selecting a buffer from
via Consult narrowing, e.g. if you’re on the first workspace, you can switch to
selecting a buffer from the third workspace by typing 3 SPC
into the prompt,
or the last workspace by typing 0 SPC
.
SPC f f
and SPC .
support exporting to a wdired
buffer using C-c C-e
.
Keybind | Description |
---|---|
SPC p t | List all TODO/FIXMEs in project |
SPC s b | Search the current buffer |
SPC s d | Search this directory |
SPC s D | Search another directory |
SPC s i | Search for symbol in current buffer |
SPC s p | Search project |
SPC s P | Search another project |
SPC s s | Search the current buffer (incrementally) |
This module modifies the default keybindings used in
consult-completing-read-multiple
:
Keybind | Description |
---|---|
TAB | Select or deselect current candidate |
RET | Enters selected candidates (also toggles current candidate) |
Keybind | Description |
---|---|
M-A | Cycle between annotation levels |
When using orderless to filter through candidates, the default behaviour is for each space separated input to match the candidate as a regular expression or literally.
Note that due to this style of matching, pressing tab does not expand the input
to the longest matching prefix (like shell completion), but rather uses the
first matched candidate as input. Filtering further is instead achieved by
pressing space and entering another input. In essence, when trying to match
foobar.org
, instead of option 1., use option 2.:
- (BAD) Enter
foo TAB
, completes tofoobar.
, enterorg RET
- (GOOD) Enter
foo SPC org RET
Doom has some builtin style dispatchers for more finegrained filtering, which you can use to further specify each space separated input in the following ways:
Input | Description |
---|---|
!foo | match without literal input foo |
`bar or bar` | match input bar as an initialism |
==baz= or baz= | match only with literal input baz |
~qux or qux~ | match input qux with fuzzy/flex matching |
If you want to further configure this module, here are some good places to start:
- Vertico provides several extentions that can be used to extend it’s interface
- You can add more Marginalia annotation levels and change the existing ones by
editing
marginalia-annotator-registry
- You can change the available commands in Embark for category
$cat
by editingembark-$cat-map
, and even add new categories. Note that you add categories by defining them through marginalia, and embark picks up on them.