Disable built-in Vim mode
For the best experience, disable Obsidian’s built-in Vim mode:
Settings → Editor → Vim key bindings → off
When built-in vim is off, Vim Motions provides its own enhanced vim engine — a fork of codemirror-vim — with significant improvements over the default.
What the fork adds
The bundled fork provides:
- Neovim-correct behavior —
ddcursor positioning,Jjoin whitespace,di{multiline brackets,dj/dkat document boundaries,:scursor,%string-awareness,db/d2wcross-line whitespace,<</>>shiftwidth/expandtab support, block visual insert (I/A/c/C) - Correct cursor positioning in Live Preview — prevents the cursor from snapping to delimiter boundaries when navigating into formatted content (
*,**,`,~~,==) - Async motion support — enables native operator-pending EasyMotion (
d+ easymotion,c+ easymotion,y+ easymotion) - Improved vim state reliability — default keymaps protected from accidental removal, partial key prefixes reset on focus loss, async motion races guarded by generation tracking, stale jumpList markers safely clamped
- Theme-aligned styling — cursor and selection colors use Obsidian’s CSS variables (
--interactive-accent,--text-selection) - Live Preview compatible visual-line mode —
Vselection keeps collapsed markup collapsed instead of expanding hidden content
Using built-in vim mode
The plugin also works with built-in vim mode enabled — it extends whatever vim engine is active. You get all the plugin features (text objects, navigation, EasyMotion, workspace control, etc.) but without the fork’s Neovim-correct behavior and async motion support.
Fork-only features
These features require the bundled fork (built-in vim disabled):
- Operator-pending EasyMotion (
d+ easymotion)- Surround (vim-surround)
- Per-mode cursor shapes
- Neovim-correct cursor positioning
- Visual-line mode Live Preview fixes
Ecosystem compatibility
When the bundled fork is active, the plugin installs a bridge at window.CodeMirrorAdapter.Vim so ecosystem plugins can discover the Vim API at its canonical location. Any plugin that uses this standard discovery path — the same path Obsidian’s own code uses — automatically works with the fork. See ecosystem-compatibility for details.
<C-w>hotkey conflictObsidian’s default “Close current tab” hotkey is Ctrl+W, which conflicts with the
<C-w>window prefix. To use<C-w>bindings, go to Settings → Hotkeys, search for “Close current tab”, and remove or rebind the Ctrl+W hotkey. Close-tab remains available via:qor:quit.