Eerie is a hard fork of Meow and
ships a Vim-style modal experience by default under the eerie-* Lisp
surface.
On Emacs 30+, use-package can install Eerie directly through the
built-in :vc support:
(use-package eerie
:vc (:url "https://github.com/JNSFilipe/eerie.git"
:rev :newest)
:config
(eerie-global-mode 1))(require 'eerie)
(eerie-global-mode 1)No setup function is required for the default layout.
eerie-global-mode enables native which-key-mode when it is not
already active, so prefix maps such as SPC and the multicursor help
map are described by Emacs’s built-in which-key UI.
h j k lmovehandlstay on the current line instead of wrapping across linesj,k,C-n, andC-pfollow wrapped screen lines when a line is visually wrapped, and keep the original buffer column when they move to a different logical lineg gjumps to the start of the bufferGjumps to the end of the buffer$jumps to the end of the current lineC-n,C-p,C-b, andC-fmirror Emacs-style next-line, previous-line, backward-char, and forward-char movement in normal modeg dusesxrefto jump to definition%jumps to the matching delimiter for(),[],{},", and'xdeletes the current characterfjumps to a visible character with numbered hints; press;during the hint loop to reverse direction, andC-o/C-ican jump back and forward through itWmoves to the next space on the current line, or to line end when no later space remainsuundoes with Emacs’s native undo commandwselects the current word and jumps between its visible occurrences with numbered hints; when you stop jumping, the result stays in charwise visual selection with point at the word end so movement keys,d,c, andywork on itmenters the canonical multicursor session and keeps a persistent multicursor help popup visible until you leave ity y,d d, andc care linewise operator forms- motion-based operators support
w,W,b,B,h,l,0,$,f<char>, andt<char> /and?search forward and backward with Emacs regexesnandNrepeat the last search in the same or opposite directiond i ...,d a ...,c i ...,c a ...,y i ..., andy a ...work for([{"and'ppastesi,I,a, andAenter insert mode at Vim-like positionsC-xandC-cexpose the regular Emacs prefix maps in normal modeSPCopens Eerie’s dedicated leader map directly; it no longer piggybacks on Emacs’sC-cprefix map, and native which-key shows the available leader entriesC-oandC-imove backward and forward through the fork’s window-local jumplist
vstarts charwise visual modeVstarts linewise visual mode anchored on the current line and shows numbered visible-line hints;;reverses direction during the hint loop- Linewise visual
Vfollows logical buffer lines even when display wrapping is active, so repeated line hints advance by real lines instead of wrapped screen rows C-vstarts block selection withrectangle-mark-modeand immediately selects the current character column so block actions likeC-v j doperate on a real rectangle instead of a zero-width region- In block visual mode,
Ienters insert at the left edge of the selected block on every selected line, andAappends at the right edge of the selected block on every selected line handlstay on the current line while extending the selectionfextends the active visual selection to a visible character with numbered hints;;reverses direction during the hint loopg g,G,/,?,n, andNkeep extending the active visual selection$extends the active visual selection to the end of the current line%extends the active visual selection to the matching delimiterd,c, andyoperate on the active visual selectioniandaretarget the visual selection to inner/around text objectsmenters the canonical multicursor session from the current charwise visual selection and uses that selection as the frozen exact-match seedESCexits visual mode
- Normal
mstarts the canonical multicursor session and shows a persistent native which-key help popup while the session is active - Visual
mstarts that same canonical multicursor session from the current charwise visual selection instead of making you restart from normal mode - Inside multicursor visual mode, the first charwise selection becomes the immutable exact-match seed for the builder
- Multicursor visual
.adds the next exact match of that seed - Multicursor visual
,removes the newest marked match - Multicursor visual
-skips the next exact match without adding it - The same builder state survives the real
m w .key sequence, sowcan seed the builder, both matches stay highlighted, and a follow-updorcstill acts on the full marked set - Multicursor visual
vpromotes the current marked target set into multicursor normal mode instead of clearing the session - After that promotion, the marked targets stay highlighted until you consume them with a direct marked-target edit or replace them with another multicursor action
- Multi-cursor normal mode inherits the normal keymap and applies the same deterministic command flow across all secondary cursors
- While those marked targets are still active in multicursor normal
mode, bare
d,c,i, andaconsume the whole marked set instead of falling back to operator-pending on only the primary cursor - Multi-cursor visual mode inherits the visual keymap, so selections and visual actions can keep extending and acting across the full cursor set
- Commands that enter or retarget visual selections now stay in the
multi-cursor visual state, so live keypress flows such as
v,V,C-v,vi(, andva"keep applying across the whole cursor set instead of dropping back to the primary cursor - Nested-input commands such as normal
f<char>1,d i (,c a ", and visualv i (reuse the same recorded follow-up inputs across all cursors Wkeeps the same next-space and line-end fallback semantics as normal mode, but applies to every cursor- When a normal or multicursor cursor is sitting on the
w-style end-of-word boundary just before a space,Wnow skips that immediate separator and advances to the following space or line end instead of appearing stuck - Insert-like commands such as
i,a,I,A, andcreplay the primary insert session to the secondary cursors when you pressESC ESCcancels the full multi-cursor session and returns to normal mode
- Insert mode keeps standard Emacs bindings
ESCreturns to normal mode
eerie-normal-define-keyeerie-visual-define-keyeerie-leader-define-keyeerie-register-jump-command
- Operator-pending currently covers doubled linewise operators, motion
targets
w/W/b/B/h/l/0/$/f/t, and the requestedi/atext objects. - Doubled linewise operators like
dd,yy, andccdo not trigger Eerie’s numeric expand hints. - Vim-style yank operators restore the original cursor position after copying.
%handles nested delimiters and still works when point is sitting after a closing delimiter at end of line or end of buffer.fandwuse an Eerie-native visible-jump loop with digits1through9; no externalavy.elruntime dependency is required.wnow promotes its target into Eerie’s actual visual state, keeps point at the end of the selected word, never numbers the current occurrence as a jump target, and letsESCand visual movement/action keys keep working normally.- Because
wends in real visual state, visualfcan keep extending that selection instead of replacing it. - Charwise selections created inside multicursor mode, including
selections created by
w, become exact, case-sensitive, current-buffer match seeds for the multicursor builder. - Multicursor visual
./,/-replace the old visualm/;/sbuilder flow. - The marked target set still uses the original selected text as an
immutable seed, matches non-overlapping current-buffer occurrences,
and stays highlighted through the initial multicursor-normal
promotion with
v. - Multicursor visual
ddeletes all current targets, and multicursor visualcdeletes all current targets then replays the primary insert session to the rest onESC. - Multicursor visual
ienters INSERT at the beginning of every current target, and multicursor visualaenters INSERT after every current target. - In multicursor normal mode, direct marked-target
ystill yanks only the primary active target; full multi-target yank is still deferred. - Multi-edit
ystill yanks only the primary active target; full multi-target yank is still deferred. - Multi-edit text-object retargeting is deferred until it gets a dedicated binding that does not conflict with Vim-style insert/append.
- Plain visual
nis back to plain visual search repeat. - Multi-cursor mode now mirrors the normal and visual keymaps,
including selection entry and visual text-object flows like
vi(. - Multi-cursor commands that switch into visual-like behavior now stay in the multi-cursor visual state instead of temporarily falling back to plain visual mode, so destructive follow-up keys still apply across every active cursor.
- Multi-cursor replay records nested
read-key,read-char, andread-from-minibufferinputs so follow-up prompts can be replayed across secondary cursors for supported commands. - Multi-cursor replay still focuses on deterministic command flows; broader arbitrary interactive sessions beyond the covered normal/visual command set may still need follow-up work.
- Normal
Wshares the same next-space and line-end fallback semantics as multi-cursorW, but applies only to the primary cursor. Wnow also skips the immediate separator when point comes from aw-style end-of-word boundary, sow -> m -> n -> Wvisibly advances instead of looking inert.- Native which-key is used for the
SPCleader prefix and the persistent multicursor help popup; the old Eerie keypad state is no longer shipped. Vreuses the same visible-jump loop for lines, so digits jump the active linewise selection to visible lines,;reverses direction, andESCexits the selection.- When
Vhas fewer than 9 visible line hints in the active direction but the buffer still has more lines there, it recenters the window to expose up to 9 numbered line targets. C-vnow starts from a one-character-wide rectangle at point, so blockwisedandcact on the visible column immediately instead of needing an extra horizontal motion first.- Block visual
IandAreplay the primary insert session to every selected line at the rectangle’s left or right edge. - Reverse visual
fskips the character currently under the visual cursor, sof<char> ; 1goes to the previous match instead of staying on the current one. - Reverse visual
falso refreshes its numbered candidates after each jump inside the same hint loop, so the overlay labels and numeric choices stay in sync after;. - Jump history is window-local and records explicit relocations such as
gg,G,gd,eerie-goto-line,/?nN, Eerie’s mark/global-mark jump helpers, and registered third-party navigation commands. - Registered command capture ships with a default list for built-in
jumps like
beginning-of-buffer,end-of-buffer,goto-line,imenu, andxref, plus common third-party commands such asconsult-*when those symbols are present. - Counts like
2dw, search-repeat operator targets, and word text-object aliases likeiw/aware still deferred. - Block
cstill uses Emacs rectangle deletion and then enters insert mode at point; it is not full Vim-style block-change semantics yet. - The living implementation tracker is in
.plan/PLAN.md. tests/eerie-interactive-demo.elis the manual smoke buffer for interactive testing, includingf,w, and the normal-~m~ multicursor flow.
