All features can be toggled independently in Settings → Vim Motions. Changes take effect immediately without restarting. Settings are organized into 7 pages for easier navigation:

PageSettings groups
GeneralMobile, Vim features, Picker, Vim engine
AppearanceLine numbers, Gutter, Status bar, Vim mode display prompt, Cursor shapes, Animated cursor, Yank highlight
NavigationJump navigation, Workspace navigation
KeybindingsVimrc & key bindings, Leader key bindings, Which-key hints, Which-key group labels, Which-key command labels
Snippets & filesSnippets, File explorer, Undo tree
Input methodInput method
AdvancedAdvanced

On Obsidian 1.13+, pages appear as navigable entries in the settings sidebar. On earlier versions, a tab bar at the top of the settings panel lets you switch between pages. All settings are indexed by Obsidian’s global settings search (1.13+).

Mobile

NameTypeDefaultRange/OptionsLuaVimrcDescription
Enable on mobiletogglefalseActivate the plugin on mobile devices. Disabled by default because most mobile users lack a hardware keyboard.

Tip

Changing this setting requires an Obsidian reload. You can also toggle it from the command palette: Vim Motions: Toggle enable on mobile.

Vim features

NameTypeDefaultRange/OptionsLuaVimrcDescription
Text objectstoggletruevim.opt.textobjectsset textobjectsEnable Markdown-aware text objects (i*, a*, il, etc.).
Replace-with-register operatortoggletruevim.opt.replacewithregisterset replacewithregisterEnable the gr operator to replace text with register contents. Also available via :set rwr and vim.opt.rwr.
Structural navigationtoggletruevim.opt.navigationset navigationEnable heading, list, and link navigation motions (]h, [h, ]l, etc.).
Hard-wrap operator (gq)toggletruevim.opt.hardwrapset hardwrapEnable gq operator to reformat paragraphs with Markdown-aware line wrapping.
Smart list continuation on o/Otoggletruevim.opt.listcontinuationset listcontinuationAutomatically continue list markers (bullets, numbers, checkboxes) when pressing o or O.
Table navigationtoggletruevim.opt.tablenavset tablenavEnable table-nav overlay mode and table motions (]| , [| , ]c, [c). When disabled, the native table editor still supports vim cell editing with cross-cell h/j/k/l navigation.
Table widget in live previewdropdownnativenative, rawvim.opt.tablewidgetset tablewidgetControls how tables display in Live Preview. native uses Obsidian’s built-in table editor with vim injected into cell editors. raw always shows raw markdown.
Yank highlightdropdownsolidoff, solid, fadevim.opt.yankhighlightmodeset yankhighlightmodeHighlight yanked text. “Solid” appears and disappears (Neovim-style). “Fade” gradually fades out.
Yank highlight durationslider20050–3000 msvim.opt.yankhighlightdurationset yankhighlightdurationHow long the yank highlight stays visible.
Yank-ring paste cyclingtoggletruevim.opt.yankringset yankringCycle through numbered registers after paste (<C-p>/<C-n>).
Sign columndropdownautoauto[:N], yes[:N], novim.opt.signcolumnset signcolumnShow vim mark letters in a dedicated gutter column. Auto: show when marks exist. Always: always reserve space. Off: hide. Append :N (1–4) to set character width. Clickable — clicking a mark jumps to its line. Global marks (A–Z) shown in distinct color.
Fold columntogglefalsevim.opt.foldcolumnset foldcolumnShow fold indicators (▸/▾) in the gutter for foldable regions. Click to toggle. Default: off.
Vim keybindings in text areastogglefalsevim.opt.vimtextareasset vimtextareasReplace focused text areas with a vim-enabled editor. Starts in insert mode. Experimental, desktop only.
Subword motionstogglefalsevim.opt.subwordset subwordOverride w/b/e/ge to stop at camelCase, snake_case, and kebab-case boundaries.
Enhanced increment/decrementtogglefalsevim.opt.dialset dialExtends <C-a>/<C-x> to cycle hex colors, booleans, dates, CSS values, and checkboxes.

Tip

Override the highlight color with a CSS snippet: set --vim-motions-yank-bg on .theme-dark or .theme-light (e.g., --vim-motions-yank-bg: rgba(255, 200, 0, 0.4);).

NameTypeDefaultRange/OptionsLuaVimrcDescription
Workspace navigationtoggletruevim.opt.workspacenavset workspacenavEnable pane/tab/sidebar control (<C-w>h/j/k/l, gt, gT, etc.).
Fuzzy picker for bufferstoggletrueUse the unified fuzzy picker for :buffers, :ls, :marks, :registers, and :grep.
Picker leader mappingstoggletrueEnable default <leader>f* picker mappings and which-key labels.
Picker matching enginedropdownufuzzyufuzzy, obsidianFuzzy matching engine. uFuzzy is a fast pure-JS matcher with filename-aware ranking. Obsidian uses the built-in prepareFuzzySearch API.
Workspace navigation view typestext(empty)vim.opt.workspacenavviewtypesset workspacenavviewtypesComma-separated view types where scroll and count keys are intercepted. Empty uses defaults (markdown, graph, pdf, canvas, empty, image, bases).
Fold-aware navigationtoggletruevim.opt.foldawarenavigationset foldawarenavigationAutomatically unfold sections when navigating into them (e.g., ]h into a folded heading). Matches Neovim’s default foldopen behavior.
Fold persistencetogglefalsevim.opt.foldpersistenceset foldpersistenceRemember fold state across file switches and sessions. Capped at 500 files, 30-day TTL.
Fold enable/disabletoggletruevim.opt.foldenableset foldenableEnable or disable folding. When disabled (zn), all folds are opened and fold-creating commands become no-ops. Re-enable with zN or zi.

Warning

Workspace navigation: <C-w>, Ctrl-d, Ctrl-f, and Ctrl-b may conflict with Obsidian’s default hotkeys. The plugin detects these conflicts on startup and shows a Notice. Use the Check hotkey conflicts button in this settings group to see active conflicts and unbinding instructions.

Picker

Info

Ripgrep integration is desktop-only and requires the rg binary to be installed on your system.

NameTypeDefaultRange/OptionsLuaVimrcDescription
Use ripgrep for grep/live-greptogglefalseUse a local ripgrep binary for faster vault search.
Ripgrep binary pathtext(empty)Absolute path to the rg binary.
Ripgrep extra argumentstext--smart-case --glob "*.md"Additional arguments passed to ripgrep.

Vim engine

NameTypeDefaultRange/OptionsLuaVimrcDescription
Clipboarddropdown(off)unnamed, unnamedplus, (off)vim.opt.clipboardset clipboardSync yank/delete/paste with the system clipboard. When set, p falls back to Obsidian’s native paste for non-text clipboard content (images, files), creating an attachment and inserting an image embed.
Tabstopslider41–8vim.opt.tabstopset tabstopTab display width.
Shiftwidthslider41–8vim.opt.shiftwidthset shiftwidthIndent width.
Expand tabtoggletruevim.opt.expandtabset expandtabUse spaces instead of tabs.
PCREtoggletruevim.opt.pcreset pcreUse JavaScript regular expressions in search and substitution. When off (set nopcre), uses Vim-style regex syntax.
Insert mode escapetext(off)vim.opt.insertmodeescapeset insertmodeescapeTwo-key sequence to exit insert mode (e.g., jk).
Insert mode escape timeoutnumber1000100–5000vim.opt.insertmodeescapetimeoutset insertmodeescapetimeoutTimeout in milliseconds for insert mode escape sequence.
Operator shadow timeoutnumber10000–5000vim.opt.operatorshadowtimeoutset operatorshadowtimeoutTimeout in milliseconds for operator-prefix disambiguation. When an operator is pending and the next key matches both a motion and an operator-pending action prefix (e.g. surround), waits this long before falling back to the motion. Set to 0 to disable.
Textwidthnumber800–200vim.opt.textwidthset textwidthLine wrap width for gq/gw (0 to disable).

Line numbers

NameTypeDefaultRange/OptionsLuaVimrcDescription
Line numberstogglefalsevim.opt.numberset numberShow absolute line numbers in the gutter. Default: off.
Relative line numberstogglefalsevim.opt.relativenumberset relativenumberShow relative line numbers (distance from cursor). When both are enabled, shows hybrid mode (absolute on current line, relative on others). Default: off.
Number widthslider21–20vim.opt.numberwidthset numberwidthMinimum width of the line number column in characters (1–20). Default: 2.
Line number displaydropdownhybridhybrid, dual, dual-rel-absvim.opt.linenumbermodeset linenumbermodeDeprecated — use statuscolumn. Dual maps to statuscolumn="%l %r".
Cursor line highlighttoggletruevim.opt.cursorlineset cursorlineHighlight the current cursor line. Default: on.
Cursor line highlight modedropdownnumbernumber, line, bothvim.opt.cursorlineoptset cursorlineoptWhat to highlight — Number, Line, or Both. Default: Number.

Custom gutter layout with statuscolumn

Use vim.opt.statuscolumn in Lua or set statuscolumn in vimrc to fully customize the gutter area. Supported tokens: %l (line number), %r (relative number), %s (signs), %C (fold indicators), %= (separator).

-- Signs + absolute + relative + fold column
vim.opt.statuscolumn = "%s %l %r %C"
 
-- Just dual line numbers
vim.opt.statuscolumn = "%l %r"
 
-- Clear (restore plugin-managed gutters)
vim.opt.statuscolumn = ""

Gutter layout

When all gutter columns are active, the layout from left to right is: sign column → line numbers → fold column → content. This matches Neovim’s default arrangement.

Example with hybrid line numbers (number + relativenumber), sign column, and fold column enabled — cursor on line 8:

 a   3  ▸  ## Introduction
     2     Some text here.
     1     More context.
     8     ← cursor line (absolute number)
     1     Additional notes.
 b   2     Another paragraph.
     3     Final thoughts.

Jump navigation

NameTypeDefaultRange/OptionsLuaVimrcDescription
Flash-style f/F/t/Ttoggletruevim.opt.flashset flashShow labels on all visible matches for f/F/t/T motions.
Flash multi-linetoggletruevim.opt.flashmultilineset flashmultilineSearch beyond the current line for f/F/t/T matches.
Flash jump mode (s)togglefalsevim.opt.flashjumpset flashjumpBidirectional character jump in normal mode.
Flash jump keytextsvim.opt.flashjumpkeyset flashjumpkeyKey to trigger flash jump mode.
Flash clever-ftogglefalsevim.opt.flashcleverfset flashcleverfRepeating f{same-char} falls through to stock f.
Flash min pattern lengthnumber10–10vim.opt.flashminpatternlengthset flashminpatternlengthMinimum chars before labels appear in jump mode.
Flash search labelstoggletruevim.opt.flashsearchset flashsearchShow labels on search matches after / or ?.
EasyMotiontoggletruevim.opt.easymotionset easymotionEnable easymotion/hop navigation (<leader><leader>w, etc.).
EasyMotion dimmingtoggletruevim.opt.easymotiondimmingset easymotiondimmingDim non-target text when EasyMotion or flash is active.
EasyMotion label characterstextasdghklqwertyuiopzxcvbnmfjvim.opt.easymotionlabelsset easymotionlabelsCharacters used for EasyMotion and flash labels.
Hint modetoggletruevim.opt.hintmodeset hintmodeEnable vimium-style link hints to click UI elements.
Hint mode label characterstextasdfghjklvim.opt.hintlabelsset hintlabelsCharacters used for hint labels.
Hint mode global hotkeyhotkey(off)Key combination to trigger hint mode from anywhere.
Label font sizeslider1410–20vim.opt.labelfontsizeset labelfontsizeFont size for EasyMotion and hint mode labels.
Scale labels to line heighttogglefalsevim.opt.labelmatchfontsizeset labelmatchfontsizeScale label font to match the target line’s font size.
Harpoon file pinningtoggletruevim.opt.harpoonset harpoonPin files to numbered slots for instant switching.

Vimrc / Lua only

The following options are available via vimrc and Lua but do not appear in the Settings UI:

NameTypeDefaultRange/OptionsLuaVimrcDescription
Jump listtoggletruevim.opt.jumplistset jumplistUse vim-style jump list for <C-o>/<C-i>.
Jump list sizenumber2001–1000vim.opt.jumplistsizeset jumplistsizeMaximum number of entries in the jump list.
Update timenumber4000msvim.opt.updatetimeset updatetimeMilliseconds before CursorHold fires. Matches Neovim’s updatetime.

Snippets

NameTypeDefaultRange/OptionsLuaVimrcDescription
Enable snippetstoggletruevim.opt.snippetsset snippetsMaster toggle for snippet expansion.
Bundled snippetstoggletruevim.opt.snippetbundledset snippetbundledInclude built-in Obsidian markdown snippets.
Snippet directorytext(off)vim.opt.snippetdirset snippetdirPath to a directory with user snippet JSON files.
Trigger modedropdownbothcompletion, tab, bothvim.opt.snippettriggerset snippettriggerHow snippets are triggered: completion menu, Tab, or both.

File explorer

NameTypeDefaultRange/OptionsLuaVimrcDescription
Oil explorertoggletruevim.opt.oilexplorerset oilexplorerEnable the oil-style file explorer (:Oil command).
Show hidden filestogglefalsevim.opt.oilshowhiddenfilesset oilshowhiddenfilesShow dotfiles and hidden folders in oil views.
Confirm delete thresholdslider11–20vim.opt.oilconfirmdeletethresholdset oilconfirmdeletethresholdShow confirmation when deleting this many files or more.
Default sort orderdropdownnamename, mtime, sizevim.opt.oildefaultsortset oildefaultsortDefault sort order for oil directory listings.

Undo tree

NameTypeDefaultRange/OptionsLuaVimrcDescription
Undo treetoggletruevim.opt.undotreeset undotreeTrack branching undo history for g+/g- navigation, :earlier/:later, and :undolist output.
Persist undo historytogglefalsevim.opt.undofileset undofileSave per-file undo history to plugin data so it survives across sessions (like set undofile).
Maximum undo tree nodesslider1000100–5000vim.opt.undotreemaxnodesset undotreemaxnodesMaximum number of undo states to keep per editor. Oldest leaf branches are pruned when exceeded.
Sidebar positiondropdownrightleft, rightWhich sidebar to open the undo tree view in.
Auto-open on branchtogglefalseAutomatically open the undo tree sidebar when a branch is created (undo + new edit).

Animated cursor

SettingKeyTypeDefaultDescription
Enable animated cursoranimatedCursorToggleOffMaster toggle for canvas-based cursor rendering
Smooth cursor movementsmoothCursorToggleOnCursor glides between positions instead of teleporting
Cursor smoothnesscursorSmoothnessSlider 0–10.5How lazy the cursor movement feels (0 = snap, 1 = very slow)
Enable smear trailsmearTrailToggleOnSpring-damper trail stretching between old and new position
Trail stiffnesssmearStiffnessSlider 0.1–10.6Head corner spring strength
Trail trailing stiffnesssmearTrailingStiffnessSlider 0.1–10.3Tail corner spring strength
Trail dampingsmearDampingSlider 0.1–0.990.85Velocity decay (lower = bouncier)
Trail max lengthsmearMaxLengthSlider 50–800400Maximum trail length in pixels

Status bar

NameTypeDefaultRange/OptionsLuaVimrcDescription
Vim mode status bartoggletruevim.opt.statusbarset statusbarShow current Vim mode in the status bar.
Vim chord displaytoggletruevim.opt.chorddisplayset chorddisplayShow pending keystrokes in the status bar.
Powerline-style status bartogglefalsevim.opt.powerlineset powerlineColor the Vim mode indicator with per-mode background colors.

Vim mode display prompt

NameTypeDefaultRange/OptionsLuaVimrcDescription
Normal mode prompttextNORMALvim.g.mode_prompt_normallet g:mode_prompt_normalStatus bar text for normal mode.
Insert mode prompttextINSERTvim.g.mode_prompt_insertlet g:mode_prompt_insertStatus bar text for insert mode.
Visual mode prompttextVISUALvim.g.mode_prompt_visuallet g:mode_prompt_visualStatus bar text for visual mode.
V-Line mode prompttextV-LINEvim.g.mode_prompt_visual_linelet g:mode_prompt_visual_lineStatus bar text for visual line mode.
V-Block mode prompttextV-BLOCKvim.g.mode_prompt_visual_blocklet g:mode_prompt_visual_blockStatus bar text for visual block mode.
Replace mode prompttextREPLACEvim.g.mode_prompt_replacelet g:mode_prompt_replaceStatus bar text for replace mode.
Select mode prompttextSELECTvim.g.mode_prompt_selectlet g:mode_prompt_selectStatus bar text for select mode.
Virtual replace mode prompttextV-REPLACEvim.g.mode_prompt_vreplacelet g:mode_prompt_vreplaceStatus bar text for virtual replace mode.
Command mode prompttextCOMMANDvim.g.mode_prompt_commandlet g:mode_prompt_commandStatus bar text for command-line mode.
Search mode prompttextSEARCHvim.g.mode_prompt_searchlet g:mode_prompt_searchStatus bar text for search mode.
Insert-normal mode prompttextNORMALvim.g.mode_prompt_insert_normallet g:mode_prompt_insert_normalStatus bar text when in normal mode via Ctrl-O from insert.

Cursor shapes

Info

Cursor shapes require bundled fork mode. Disable Obsidian’s built-in Vim key bindings to enable these options.

NameTypeDefaultRange/OptionsLuaVimrcDescription
Normal modedropdownblockblock, bar, underline, hollowset guicursorCursor shape for normal mode.
Insert modedropdownbarblock, bar, underline, hollowset guicursorCursor shape for insert mode.
Visual modedropdownblockblock, bar, underline, hollowset guicursorCursor shape for visual mode.
Replace modedropdownunderlineblock, bar, underline, hollowset guicursorCursor shape for replace mode.
Operator-pendingdropdownunderlineblock, bar, underline, hollowset guicursorCursor shape for operator-pending mode.

Vimrc & key bindings

NameTypeDefaultRange/OptionsLuaVimrcDescription
Configuration modedropdownlua-vimrclua-vimrc, lua, vimrc, settingsHow the plugin loads config files. Lua + Vimrc loads both with Lua priority.
Custom vimrc pathtext(empty)Override path to a vimrc file. Vault-relative or absolute (desktop only, e.g. ~/.config/obsidian/vimrc). Leave empty to search: vimrc, .vimrc, init.vim, .init.vim, obsidian.vimrc, obsidian.vim, .obsidian.vimrc, .obsidian.vim.
Custom init.lua pathtext(empty)Override path to an init.lua file. Vault-relative or absolute (desktop only, e.g. ~/.config/obsidian/init.lua). Leave empty to search: init.lua, .init.lua, obsidian.init.lua, .obsidian.init.lua, obsidian.lua.
Show config load notificationstoggleonShow a notification when vimrc or init.lua is loaded on startup. Error notifications are always shown regardless of this setting.

Leader key bindings

Map leader key sequences to Obsidian commands. This UI allows you to add new bindings by specifying a key sequence and picking an Obsidian command from a searchable list. Existing bindings can be removed via the trash icon. These are applied in addition to any bindings defined in your vimrc.

Which-key hints

NameTypeDefaultRange/OptionsLuaVimrcDescription
Which-key modedropdownoffoff, leader, allvim.opt.whichkeyset whichkeyShow available key continuations in a popup.
Which-key leader groupingdropdowngroupedgrouped, flatvim.opt.whichkeygroupingset whichkeygroupingHow leader key bindings are displayed.
Which-key sort orderdropdownwhich-keywhich-key, groups-firstvim.opt.whichkeysortset whichkeysortHow entries are sorted. which-key matches which-key.nvim (keys first, groups last, alphanumeric before special). groups-first shows groups before keys, alphabetically.
Which-key iconstoggletruevim.opt.whichkeyiconsset whichkeyiconsShow icons next to entries in the which-key popup. Built-in groups show default Lucide icons.
Which-key popup delaynumber5000–2000vim.opt.whichkeydelayset whichkeydelayDelay in milliseconds before the popup appears. Subsequent keystrokes update the popup instantly.

Which-key group labels

Name groups by their full key prefix. Use the leader character + prefix for leader groups (e.g., \t for table), or a raw prefix for non-leader groups (e.g., cs for surround changes). The UI provides a list of existing labels with the ability to add new ones or delete custom entries. Built-in features register default labels that your entries can override.

Which-key command labels

Describe individual bindings in the which-key popup. The UI shows a list of all active bindings (including those from vimrc) and allows you to provide a custom label for each. Entries set in vimrc appear as read-only rows.

Advanced

NameTypeDefaultRange/OptionsLuaVimrcDescription
Scrolloff linesnumber50–9999vim.opt.scrolloffset scrolloffNumber of lines to keep visible above and below when scrolling.
Multi-line text object scan rangeslider205–200vim.opt.scanlimitset scanlimitMaximum lines to scan in each direction for multi-line text objects.

Tip

Set Scrolloff lines to 9999 to keep the cursor vertically centered.

Picker

Fuzzy picker configuration, external grep, and bundled picker sources for popular community plugins. Sources register automatically when the target plugin is detected and unregister when it is disabled.

NameTypeDefaultDescription
OmnisearchtoggletrueRegister Omnisearch as a picker source for full-text vault search.
Obsidian TaskstoggletrueRegister Obsidian Tasks as a picker source for navigating tasks.
DataviewtoggletrueRegister Dataview as a picker source for browsing indexed pages.

Input method

NameTypeDefaultRange/OptionsDescription
Enable input method switchingtogglefalseAutomatically switch input methods when entering/leaving insert mode. Per-view state across all editor views (split panes, popovers, canvas cards). Desktop only.
IM presetdropdowncustomCustom, macism (macOS), im-select (Windows), fcitx5-remote (Linux), ibus (Linux)Auto-fill binary path and arguments for common IM tools. Values are editable after selection.
IM binary pathtextAbsolute path to the IM switching binary (e.g., /opt/homebrew/bin/macism, /usr/bin/fcitx5-remote). Supports ~.
Obtain IM argumentstextArguments to query the current IM. Empty for macism/im-select. -n for fcitx5-remote.
Switch IM argumentstext{im}Arguments to switch IM. Use {im} as placeholder. -s {im} for fcitx5-remote. engine {im} for ibus.
Normal mode IMtextIM identifier to switch to in normal mode (e.g., com.apple.keylayout.ABC, keyboard-us, 1033).
Insert mode IM behaviordropdownrestoreRestore previous IM, Use fixed default IMRestore: switch back to the IM before leaving insert. Default: always switch to a fixed IM.
Default insert mode IMtextIM identifier for insert mode (only when behavior is “Use fixed default IM”).

Tip

The Lua API vim.obsidian.im provides programmatic control. Set vim.obsidian.im.auto = false in your init.lua to disable auto-wiring and handle switching entirely via autocmds.

Settings not available via vimrc

  • Configuration mode (configMode): Cannot be set via vimrc or init.lua because it controls which config files are loaded (circular dependency).
  • Hint mode global hotkey (hintModeHotkey): Requires a specialized recording UI to capture modifier keys and cannot be easily represented as a simple string in a vimrc file.
  • Leader key bindings (leaderBindings): While the plugin provides a UI for this, the same functionality is already achievable via standard nmap <leader>... commands in your vimrc.
  • Fuzzy picker for buffers (picker): Currently only configurable in settings.
  • Picker leader mappings (pickerLeaderMappings): Currently only configurable in settings.
  • Picker matching engine (pickerMatcherEngine): Currently only configurable in settings. Default is ufuzzy (fast pure-JS matcher with filename-aware ranking). obsidian uses Obsidian’s built-in prepareFuzzySearch API (zero bundle cost, maintained by Obsidian).