:feature was a "catch-all" category. Many of its modules fit better in other categories, so they've been moved: - feature/debugger -> tools/debugger - feature/evil -> editor/evil - feature/eval -> tools/eval - feature/lookup -> tools/lookup - feature/snippets -> editor/snippets - feature/file-templates -> editor/file-templates - feature/workspaces -> ui/workspaces More potential changes in the future: - A new :term category for terminal emulation modules (eshell, term and vterm). - A new :os category for modules dedicated to os-specific functionality. The :tools macos module would fit here, but so would modules for nixos and arch. - A new :services category for web-service integration, like wakatime, twitter, elfeed, gist and pastebin services.
9.7 KiB
feature/evil
Description
This holy module brings the vim experience to Emacs.
Module Flags
+everywhere
Enables evilified keybinds everywhere possible. Uses the evil-collection plugin as a foundation.
Plugins
Hacks
- When a window is split, the new window will be focused.
- The o/O keys will respect and continue commented lines (can be disabled by
setting
+evil-want-o/O-to-continue-comments
tonil
). - In visual mode,
*
and#
will search for the current selection instead of the word-at-point. - The
:g[lobal]
ex command has been modified to highlight matches. - More of vim's filename modifiers are supported in ex commands (like
:p
,:p:h
or:t
) than vanilla evil-mode offers. - A custom filename modifier is available in Doom:
:P
, which expands to the project root (throws an error if not in a project).
Prerequisites
This module has no external prerequisites.
Features
Ported vim plugins
The following vim plugins have been ported to evil:
Vim Plugin | Emacs Plugin | Keybind(s) |
---|---|---|
vim-commentary | evil-commentary | omap gc |
vim-easymotion | evil-easymotion | omap gs |
vim-seek or vim-sneak | evil-snipe | mmap s=/=S , omap z=/=Z & x=/=x |
vim-surround | evil-embrace and evil-surround | vmap S , omap ys |
In other modules:
- The tools/neotree & tools/treemacs modules provide a
NERDTree
equivalent. -
The editor/multiple-cursors module contains functionality equal to the following vim plugins:
- evil-multiedit => vim-multiedit
- evil-mc => vim-multiple-cursors
Custom Text Objects
This module provides a couple extra text objects, along with the built-in ones. For posterity, here are the built-in ones:
w W
wordss
sentencesp
paragraphsb
parenthesized blocks- ) { } [ ] < >= braces, parentheses and brackets
' " `
quotest
tagso
symbols
And these are text objects added by this module:
a
C-style fucntion arguments (provided byevil-args
)B
any block delimited by braces, parentheses or backets (provided byevil-textobj-anyblock
)i j k
By indentation (k
includes on line above andj
includes one line below) (provided byevil-indent-plus
)x
XML attributes (provided byexato
)
Custom Ex Commands
Ex Command | Description |
---|---|
:@ |
Apply macro on selected lines |
:ag[!] REGEXP |
Perform a project search with ag |
:agcwd[!] REGEXP |
Perform a project search with ag from the current directory |
:al[ign][!] REGEXP |
Align text to the first match of REGEXP. If BANG, align all matches on each line |
:cp[!] NEWPATH |
Copy the current file to NEWPATH |
:dash QUERY |
Look up QUERY (or the symbol at point) in dash docsets |
:dehtml [INPUT] |
HTML decode selected text / inserts result if INPUT is given |
:enhtml [INPUT] |
HTML encode selected text / inserts result if INPUT is given |
:grep[!] |
Perform a project search with git-grep |
:grepcwd[!] |
Perform a project search with git-grep from the current directory |
:iedit REGEXP |
Invoke iedit on all matches for REGEXP |
:k[ill]all[!] |
Kill all buffers (if BANG, affect buffer across workspaces) |
:k[ill]b |
Kill all buried buffers |
:k[ill]m[!] REGEXP |
Kill buffers whose name matches REGEXP (if BANG, affect buffers across workspaces) |
:k[ill]o |
Kill all other buffers besides the selected one |
:k[ill] |
Kill the current buffer |
:lo[okup] QUERY |
Look up QUERY on an online search engine |
:mc REGEXP |
Invoke multiple cursors on all matches for REGEXP |
:mv[!] NEWPATH |
Move the current file to NEWPATH |
:na[rrow] |
Narrow the buffer to the selection |
:pad |
Open a scratch pad for running code quickly |
:pt[!] |
Perform a project search with pt |
:ptcwd[!] |
Perform a project search with pt from the current directory |
:ral[ign][!] REGEXP |
Right-Align text that matches REGEXP. If BANG, align all matches on each line |
:repl |
Open a REPL and/or copy the current selection to it |
:retab |
Convert indentation to the default within the selection |
:rev[erse] |
Reverse the selected lines |
:rg[!] |
Perform a project search with ripgrep |
:rgcwd[!] |
Perform a project search with rigprep from the current directory |
:rm[!] [PATH] |
Delete the current buffer's file and buffer |
:tcd[!] |
Send cd X to tmux. X = the project root if BANG, X = default-directory otherwise |
Configuration
Removing evil-mode
You must do two things to remove Evil:
- Remove
:editor evil
from~/.doom.d/init.el
, - Run
doom refresh
to clean up lingering dependencies and refresh yuor autoloads files. - [OPTIONAL] You may want to assign new values to
doom-leader-alt-key
anddoom-localleader-alt-key
. These are bound toC-c
andC-c l
by default.
Ignore
doom-leader-key
anddoom-localleader-key
, they don't apply to non-evil sessions.
Evil-specific configuration and keybindings (defined with map!
) will be
ignored without :editor evil
present (and omitted when byte-compiling).
Keep in mind that, at the time of this writing, Doom was designed by a vimmer, for vimmers. Little consideration has been put into designing a keybind scheme for vanilla Emacs users (though it's being worked on!).
That means that much of Doom's functionality will be orphaned in an evil-less setup. You'll have to set your own keybinds.
I suggest studying config/default/+emacs-bindings.el to see what keybinds are available for non-evil users. Otherwise, you may find inspiration on the example Doom configurations page.
Restoring old substitution behavior on s/S
Doom replaces the s
and S
keys with the evil-snipe
package (a port of
vim-seek/vim-sneak for 2-character versions of f/F/t/T).
To disable evil-snipe on s/S, you can either:
- Disable
evil-snipe-mode
by adding(after! evil-snipe (evil-snipe-mode -1))
to$DOOMDIR/config.el
, - Or disable
evil-snipe
completely with(package! evil-snipe :disable t)
added to$DOOMDIR/packages.el
, but this will also disable incremental highlighting for the f/F/t/T motions keys. - Or use
cl
andcc
, respectively; they do the same thing.