Emile Bangma1k downloadsEnhances Obsidian's Vim mode with Markdown-aware text objects, structural navigation, workspace keyboard control, and a polished Neovim-native experience.
A polished, Neovim-native experience inside Obsidian. Vim Motions adds what's missing from Obsidian's built-in Vim mode: Markdown-aware text objects, structural navigation, hard-wrap formatting, workspace keyboard control, EasyMotion, Lua configuration with vim.keymap.set / vim.opt / vim.fn / vim.api / vim.tbl_* / autocommands / timers / highlight groups, and a built-in .obsidian.vimrc loader.
d, c, y, v]h, ]l, ]n, ]b.obsidian.init.lua with conditional logic, function keymaps, vim.fn.*, vim.api.* (buffer APIs, nvim_set_hl), vim.tbl_*, vim.snippet.*, vim.json, vim.inspect, vim.regex (ECMAScript RegExp), vim.schedule/vim.defer_fn/vim.uv timers, autocommands (19 events), vim.obsidian namespace (including vim.obsidian.im for input method control), buffer-local keymaps, async file reading (vim.ob.fs.read), multi-file configs via require(), collectgarbage() support, __gc userdata finalization, and Neovim-compatible syntax.obsidian.vimrc loader with 75+ configurable settings and which-key support with Lucide iconsf/F/t/T with labels on all visible matches (flash.nvim-inspired). Auto-jumps on single match. Operator-pending (df, cf, yf), visual mode, multi-line search. Incremental s jump mode (type multiple chars to narrow, labels update live), post-commit //? search labels, clever-f repetition, label conflict skipping, [3/15] search match counter<C-w>, gt/gT, :sp/:vs)dsf/csf for function calls, dot-repeat for ys with text objects)gq/gw operators with prefix preservationgr{motion} replaces text with register contents without clobbering the register (vim-ReplaceWithRegister parity)o, dd, J/K, H/L, =)f()/d() nodes:sp, :vs, :e, :grep, :ob, :Oil, :sidebar, navigation/action aliases, and moref, F, yf, df)statuscolumn API for custom gutter layouts (vim.opt.statuscolumn = "%s %l %r %C"). Cursor line highlight (cursorline/cursorlineopt), configurable number width, mobile-responsive gutter, and Obsidian's native line numbers suppressed when activesigncolumn (auto/always/off), consistent font size regardless of content, gutter layout matching Neovim (sign column → line numbers → fold column), global mark persistence across files and sessions (A–Z), and a grouped marks picker with cross-file navigation<leader>1–<leader>9), cursor position tracking, persistence across sessions, auto-updating on file rename/deletezf (create), zd (delete), zE (eliminate all), zm/zr (incremental level), custom fold providers for frontmatter and callouts, descriptive fold placeholder text, fold-aware navigation (auto-unfold on ]h), cross-session fold persistence, and optional fold column gutter (set foldcolumn) with click-to-fold:IMToggle/:IMStatus ex commands, Lua API (vim.obsidian.im). Desktop only.<textarea> elements in modals and plugin UIs are replaced with a vim-enabled editor overlay. Starts in insert mode for transparent typing; press Escape for normal mode, second Escape returns to modal. Experimental, disabled by default. Desktop only.<C-o> and <C-i> navigate backward/forward through jump history across notes. Jumps recorded on gd, picker selection, harpoon, oil, EasyMotion, and 100+ other navigation paths. Persists across sessions. :jumps displays the list. set jumplist/set jumplistsize for configurationg-/g+ navigate chronologically across all branches with buffer content restoration. :earlier/:later by count, time, or save point. :undolist modal. Sidebar view (:UndoTreeToggle) with tree rendering, keyboard nav, collapse/expand, diff preview. vim.fn.undotree() Lua API. Optional persistence (set undofile). 5 settings: enableUndoTree, undoTreeMaxNodes, undoTreePosition, undoTreeAutoOpen, undoFilew/b/e/ge override stopping at camelCase, snake_case, and kebab-case boundaries. Opt-in setting.<C-a>/<C-x> cycling hex colors, booleans, dates, CSS values, and checkboxesvim.textobject.add() + vim.gen_spec.pair()Y/Q), yank highlight, smart list continuation, scrolloff, insert escape sequences, chord display, powerline status bar, and settings hot-reloadSearch for "Vim Motions" in Settings → Community plugins → Browse.
main.js, manifest.json, and styles.css from the latest release.vim-motions in <your-vault>/.obsidian/plugins/.Disable Obsidian's built-in Vim mode (Settings → Editor → Vim key bindings → off). Vim Motions provides its own enhanced vim engine — a fork of codemirror-vim — with Neovim-correct behavior, async motion support, correct cursor positioning in Live Preview, and theme-aligned styling.
The plugin also works with built-in vim mode enabled, but the fork provides a more accurate Vim experience. See the recommended setup guide for details.
Full documentation: https://saberzero1.github.io/motions
npm install # Install dependencies
npm run dev # Development build (watch mode)
npm run build # Production build
npm run lint # Lint
npm run test:e2e # E2E tests (requires nix develop)
See CONTRIBUTING.md for the full development guide, testing strategy, and contribution guidelines.
MIT — Emile Bangma