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 mobiletogglefalse———Activate 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
Vim enabledtoggletrue———Master toggle for the plugin’s vim mode. Can be toggled at runtime via Obsidian commands without a plugin reload.
Text objectstoggletrue—vim.opt.textobjectsset textobjectsEnable Markdown-aware text objects (i*, a*, il, etc.).
Replace-with-register operatortoggletrue—vim.opt.replacewithregisterset replacewithregisterEnable the gr operator to replace text with register contents. Also available via :set rwr and vim.opt.rwr.
Structural navigationtoggletrue—vim.opt.navigationset navigationEnable heading, list, and link navigation motions (]h, [h, ]l, etc.).
Hard-wrap operator (gq)toggletrue—vim.opt.hardwrapset hardwrapEnable gq operator to reformat paragraphs with Markdown-aware line wrapping.
Smart list continuation on o/Otoggletrue—vim.opt.listcontinuationset listcontinuationAutomatically continue list markers (bullets, numbers, checkboxes) when pressing o or O.
Table navigationtoggletrue—vim.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, raw, ownedvim.opt.tablewidgetset tablewidgetControls how tables display in Live Preview. Default is native, which uses Obsidian’s built-in table editor with vim injected into cell editors. raw always shows raw markdown. owned is experimental and renders tables with the plugin’s own renderer — see tables > Owned table surface.
Yank highlightdropdownsolidoff, solid, fadevim.opt.yankhighlightmodeset yankhighlightmodeHighlight yanked text. “Solid” appears and disappears (Neovim-style). “Fade” gradually fades out.
Yank highlight durationslider2000–5000 msvim.opt.yankhighlightdurationset yankhighlightdurationHow long the yank highlight stays visible.
Yank-ring paste cyclingtoggletrue—vim.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 columntogglefalse—vim.opt.foldcolumnset foldcolumnShow fold indicators (▸/▾) in the gutter for foldable regions. Click to toggle. Default: off.
Vim keybindings in text areastogglefalse—vim.opt.vimtextareasset vimtextareasReplace focused text areas with a vim-enabled editor. Starts in insert mode. Experimental, desktop only.
Subword motionstogglefalse—vim.opt.subwordset subwordOverride w/b/e/ge to stop at camelCase, snake_case, and kebab-case boundaries.
Enhanced increment/decrementtogglefalse—vim.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 navigationtoggletrue—vim.opt.workspacenavset workspacenavEnable pane/tab/sidebar control (<C-w>h/j/k/l, gt, gT, etc.) and File Explorer h/j/k/l navigation.
Fuzzy picker for bufferstoggletrue—vim.opt.pickerset pickerUse the unified fuzzy picker for :buffers, :ls, :marks, :registers, and :grep.
Picker leader mappingstoggletrue—vim.opt.pickerleadermappingsset pickerleadermappingsEnable default <leader>f* picker mappings and which-key labels.
Picker matching enginedropdownufuzzyufuzzy, obsidianvim.opt.pickermatcherset pickermatcherFuzzy matching engine. uFuzzy is a fast pure-JS matcher with filename-aware ranking. Obsidian uses the built-in prepareFuzzySearch API.
Non-Markdown file previewsdropdownrenderedrendered, hidden, rawvim.opt.pickerpreviewset pickerpreviewHow the picker previews files that are not Markdown. Markdown files are always previewed. See Non-Markdown file previews under settings > Picker.
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 navigationtoggletrue—vim.opt.foldawarenavigationset foldawarenavigationAuto-unfold when a motion enters a folded range. Matches Neovim’s foldopen — structural motions (]h, %, /) unfold; j/k leave folds closed. Use set foldopen=… for fine-grained control.
Fold-open categories—block,hor,mark,percent,search,undo—vim.opt.foldopenset foldopen=… / set fdo=…Comma-separated list of motion categories that trigger auto-unfold. Accepts: all, block, hor, insert, jump, mark, percent, search, tag, undo. Matches Neovim’s foldopen option.
Fold persistencetogglefalse—vim.opt.foldpersistenceset foldpersistenceRemember fold state across file switches and sessions. Capped at 500 files, 30-day TTL.

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-greptogglefalse———Use 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.
Grep binary modedropdownripgrep———Which external binary backs grep and live grep: ripgrep or GNU grep.
Picker keymaplist(built-in)———Per-context key bindings for the picker modal. Editable from Lua; see ex-commands for the provider API.

Vim engine

Warning

The optional Neovim backend is desktop only and runs the binary and configuration you supply as arbitrary code. That code may load native libraries through LuaJIT FFI and read or write files outside the vault. No sandbox is provided. Vim Motions never downloads or installs Neovim itself; it can install or update the Neovim plugins it generates configuration for, on an explicit confirmed request. It delegates editor keys and active-editor text to Neovim, renders visible persistent extmarks and floating windows, and bridges host-owned picker, workspace, Harpoon, marks, jumplist, and undo-tree actions back to Obsidian. A cursor-positioned input outside CM6 owns IME composition; only committed text enters Neovim through nvim_input, preserving undo and dot-repeat. Float content, borders, extmarks, and z-index are preserved; terminal rows and columns are mapped approximately with CM6’s measured character and line metrics because Obsidian uses proportional Markdown typography. Lowercase bridged commands use start-only abbreviations and do not expand inside substitutions. Both Settings → Editor → Properties in document modes work: Source frontmatter remains navigable, while rendered frontmatter is key-inaccessible through a local Neovim fold. The mirror uses buftype=acwrite: :w routes through Obsidian’s active-editor save command, and :e/:e! re-seed from Obsidian instead of reading the vault file directly. Multi-leaf buffers, ephemeral extmarks, and legacy non-extmark highlights are not yet implemented. Features that were ports of Neovim plugins are not reimplemented; Set up Neovim offers to install and configure the originals. See neovim-backend > What changes in RPC mode.

NameTypeDefaultRange/OptionsLuaVimrcDescription
Use Neovim backendtogglefalse———Desktop only. Spawn and attach to the configured Neovim 0.12+ binary. Neovim owns committed editor input, text, cursor, mode, persistent extmarks, and floats; a separate cursor-positioned input owns IME preedit and forwards commits through nvim_input. CM6 mirrors line events and renders visible extmarks and approximate cell-mapped floating overlays without processing keys. Both Properties in document modes are supported.
Neovim binary pathtext(empty)Absolute path or empty——Absolute path to the Neovim executable itself, not its folder. Requires Neovim 0.12 or newer. Empty uses nvim from the system path. See neovim-backend > Troubleshooting the connection.
Neovim configuration pathtext(empty)Absolute path or empty——Optional Obsidian-specific init.lua. Empty loads your normal Neovim config. A configured path loads under --clean, avoiding terminal-only LSP, dashboard, and statusline plugins and reducing measured startup from 106 ms to about 20 ms.
Set up Neovimbutton————Desktop only, requires a connected backend. Previews the Neovim plugins that will be installed or updated and the configuration that will be written to lua/vim_motions.lua, then applies both on confirmation. The file is inert until you add require('vim_motions') to your init.lua. A Copy button puts the same configuration on the clipboard instead.
Regenerate automaticallytogglefalse———Desktop only. Rewrite the generated configuration whenever a setting it covers changes. Off by default, because it writes into your Neovim configuration directory. A refused or failed rewrite is reported once rather than retried silently.
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 tabtoggletrue—vim.opt.expandtabset expandtabUse spaces instead of tabs.
PCREtoggletrue—vim.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 and mapping-prefix disambiguation. When an operator is pending and the next key matches both a motion and an operator-pending action prefix (e.g. surround), or when a mapping is an exact match but also a prefix of a longer mapping, waits this long before executing. Equivalent to Neovim’s timeoutlen. Set to 0 to disable. Aliases: ost, timeoutlen, tm.
Textwidthnumber800–200vim.opt.textwidthset textwidthLine wrap width for gq/gw (0 to disable).

Line numbers

NameTypeDefaultRange/OptionsLuaVimrcDescription
Line numberstogglefalse—vim.opt.numberset numberShow absolute line numbers in the gutter. Default: off.
Relative line numberstogglefalse—vim.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 highlighttoggletrue—vim.opt.cursorlineset cursorlineHighlight the current cursor line. Default: on.
Cursor line highlight modedropdownbothnumber, line, screenline, both, screenline,numbervim.opt.cursorlineoptset cursorlineoptWhat to highlight on the cursor line. number is the line number only, line the whole logical line, screenline only the cursor’s display row of a wrapped line, both is line,number. Matches Neovim, including its both default. Existing vaults keep 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/Ttoggletrue—vim.opt.flashset flashShow labels on all visible matches for f/F/t/T motions.
Flash multi-linetoggletrue—vim.opt.flashmultilineset flashmultilineSearch beyond the current line for f/F/t/T matches.
Flash jump mode (s)togglefalse—vim.opt.flashjumpset flashjumpBidirectional character jump in normal mode.
Flash jump keytexts—vim.opt.flashjumpkeyset flashjumpkeyKey to trigger flash jump mode.
Flash clever-ftogglefalse—vim.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 labelstoggletrue—vim.opt.flashsearchset flashsearchShow labels on search matches after / or ?.
EasyMotiontoggletrue—vim.opt.easymotionset easymotionEnable easymotion/hop navigation (<leader><leader>w, etc.).
EasyMotion dimmingtoggletrue—vim.opt.easymotiondimmingset easymotiondimmingDim non-target text when EasyMotion or flash is active.
EasyMotion label characterstextasdghklqwertyuiopzxcvbnmfj—vim.opt.easymotionlabelsset easymotionlabelsCharacters used for EasyMotion and flash labels.
Hint modetoggletrue—vim.opt.hintmodeset hintmodeEnable vimium-style link hints to click UI elements.
Hint mode label characterstextasdfghjkl—vim.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, flash, and hint mode labels.
Scale labels to line heighttogglefalse—vim.opt.labelmatchfontsizeset labelmatchfontsizeScale label font to match the target line’s font size.
Harpoon file pinningtoggletrue—vim.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 listtoggletrue—vim.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.
Fold enabletoggletrue—vim.opt.foldenableset foldenableEnable or disable folding. When disabled (zn), all folds are opened. Re-enable with zN or zi.

Snippets

NameTypeDefaultRange/OptionsLuaVimrcDescription
Enable snippetstoggletrue—vim.opt.snippetsset snippetsMaster toggle for snippet expansion.
Bundled snippetstoggletrue—vim.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 explorertoggletrue—vim.opt.oilset oilEnable the oil-style file explorer (:Oil command).
Show hidden filestogglefalse—vim.opt.oilhiddenfilesset oilhiddenfilesShow dotfiles and hidden folders in oil views.
Confirm delete thresholdslider10–100vim.opt.oilconfirmdeletethresholdset oilconfirmdeletethresholdShow confirmation when deleting this many files or more.
Default sort orderdropdownnamename, mtime, sizevim.opt.oilsortset oilsortDefault sort order for oil directory listings.

Undo tree

NameTypeDefaultRange/OptionsLuaVimrcDescription
Undo treetoggletrue—vim.opt.undotreeset undotreeTrack branching undo history for g+/g- navigation, :earlier/:later, and :undolist output.
Persist undo historytogglefalse—vim.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, right——Which sidebar to open the undo tree view in.
Auto-open on branchtogglefalse———Automatically 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 bartoggletrue—vim.opt.statusbarset statusbarShow current Vim mode in the status bar.
Vim chord displaytoggletrue—vim.opt.chorddisplayset chorddisplayShow pending keystrokes in the status bar.
Powerline-style status bartogglefalse—vim.opt.powerlineset powerlineColor the Vim mode indicator with per-mode background colors.

Vim mode display prompt

NameTypeDefaultRange/OptionsLuaVimrcDescription
Normal mode prompttextNORMAL—vim.g.mode_prompt_normallet g:mode_prompt_normalStatus bar text for normal mode.
Insert mode prompttextINSERT—vim.g.mode_prompt_insertlet g:mode_prompt_insertStatus bar text for insert mode.
Visual mode prompttextVISUAL—vim.g.mode_prompt_visuallet g:mode_prompt_visualStatus bar text for visual mode.
V-Line mode prompttextV-LINE—vim.g.mode_prompt_visual_linelet g:mode_prompt_visual_lineStatus bar text for visual line mode.
V-Block mode prompttextV-BLOCK—vim.g.mode_prompt_visual_blocklet g:mode_prompt_visual_blockStatus bar text for visual block mode.
Replace mode prompttextREPLACE—vim.g.mode_prompt_replacelet g:mode_prompt_replaceStatus bar text for replace mode.
Select mode prompttextSELECT—vim.g.mode_prompt_selectlet g:mode_prompt_selectStatus bar text for select mode.
Virtual replace mode prompttextV-REPLACE—vim.g.mode_prompt_vreplacelet g:mode_prompt_vreplaceStatus bar text for virtual replace mode.
Command mode prompttextCOMMAND—vim.g.mode_prompt_commandlet g:mode_prompt_commandStatus bar text for command-line mode.
Search mode prompttextSEARCH—vim.g.mode_prompt_searchlet g:mode_prompt_searchStatus bar text for search mode.
Insert-normal mode prompttextNORMAL—vim.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 the bundled fork engine or the Neovim backend. Disable Obsidian’s built-in Vim key bindings to enable these options.

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

Vimrc & key bindings

NameTypeDefaultRange/OptionsLuaVimrcDescription
Configuration modedropdownlua-vimrclua-vimrc, lua, vimrc, settings——How 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.
Search global config directorytogglefalse———After searching the vault root, also look for config files in the Obsidian user data folder (e.g. ~/.config/obsidian/ on Linux). Desktop only.
Show config load notificationstoggleon———Show 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 iconstoggletrue—vim.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.
Auto-fetch pluginstogglefalse———Automatically download Neovim plugins from GitHub when registered via vim.plugins.add().

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.

Non-Markdown file previews

Settings → Vim Motions → General → Picker → Non-Markdown file previews (set pickerpreview) controls how the preview pane handles files that are not Markdown. Markdown files are always previewed as rendered Markdown and are unaffected by this setting.

ModeBehaviour
renderedDefault. Images, svg and canvas are shown as a native Obsidian embed. PDFs, video and audio show a summary card with the file name, type, and size. Other files show their text.
hiddenNon-Markdown files show No preview and are never read from disk.
rawNon-Markdown files are shown as plain text.

In every mode, a file larger than 50 KB is never read from disk — its size is checked from file metadata first, so scrolling past large attachments costs nothing.

Info

PDFs and media deliberately show a summary card rather than a native embed, even in rendered mode. Obsidian instantiates a PDF.js viewer per embed, and creating one for every selection while scrolling retains memory.

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.