Operate on Markdown structures with standard Vim operators (d, c, y, v).
The Neovim RPC backend supports the tree-backed objects below in operator-pending and visual modes. i= / a= remains fork-only because Neovim’s bundled Markdown grammar has no highlight node.
Keybinding
Description
i* / a*
Inside/around bold (**...**) or italic (*...*)
i_ / a_
Inside/around italic (_..._)
i` / a`
Inside/around inline code
i$ / a$
Inside/around math ($...$ or $$...$$), with smart disambiguation
i~ / a~
Inside/around strikethrough (~~...~~)
i= / a=
Inside/around highlight (==...==)
il / al
Inside/around links ([[wikilink]] or [text](url))
iC / aC
Inside/around fenced code blocks
iB / aB
Inside/around blockquotes (>)
io / ao
Inside/around callouts (> [!type])
it / at
Inside/around HTML/XML tags
ir / ar
Inside/around table row (raw markdown only)
i| / a|
Inside/around table cell (between | pipes)
iS / aS
Subword
in / an
Number
iq / aq
Any quote
iD / aD
Double brackets
gL
URL
i, / a,
Argument
ii / ai
Indentation
Structural navigation
Jump between document structures. Works with counts (e.g., 3]h jumps 3 headings) and operators (e.g., d]h deletes to the next heading).
Navigate Markdown table cells without leaving Vim mode.
Keybinding
Description
]| or ]c
Move to the next table cell
[| or [c
Move to the previous table cell
]r
Move to same column in next row
[r
Move to same column in previous row
Table text objects
Operate on table cells with standard Vim operators.
Keybinding
Description
i|
Inside table cell (content between pipes)
a|
Around table cell (content plus trailing pipe)
Table manipulation
Manage table structure using the <leader>t prefix.
Keybinding
Description
<leader>tm
Insert table
<leader>to
Add row below
<leader>tO
Add row above
<leader>tJ
Move row down
<leader>tK
Move row up
<leader>tdd
Delete row
<leader>tiL
Add column to the right
<leader>tiH
Add column to the left
<leader>tL
Move column right
<leader>tH
Move column left
<leader>tdc
Delete column
<leader>tr
Realign table columns
Embedded table navigation
Available when the table widget is set to “Embedded” and the cursor enters a table. These keybindings are active in the table navigation layer (before entering a cell).
Keybinding
Description
h / l
Move cell highlight left / right
j / k
Move cell highlight down / up
i / a / c / s / Enter
Enter cell editing
Escape
Exit table
o / O
Add row below / above
dd
Delete row
dc
Delete column
J / K
Move row down / up
H / L
Move column left / right
I / A
Add column left / right
=
Realign table
Tab / Shift-Tab
Next / previous cell (wraps across rows)
Owned table surface
Available when set tablewidget=owned and the cursor is inside a table in Live Preview. The plugin renders the table itself and a nested editor hosts the caret, while the parent editor’s vim owns every command — one vim state, one undo history, one document.
Keybinding
Description
Any normal-mode command
Routed to the parent’s vim (dd, D, u, ., zz, counts)
h / l
Move by one character within the table
j / k
Move one table row; at the first or last row, leaves the table
v / V
Charwise / linewise visual mode, rendered inside the table
i / a / o and friends
Enter insert mode; typed text goes into the document
Escape
Leave insert or visual mode
Desktop, Live Preview and the bundled engine only. See tables > Owned table surface for what is not supported yet.
Picker shortcuts
Open picker sources with the <leader>f prefix.
Keybinding
Description
<leader>ff
Find files
<leader>fg
Live grep (vault search)
<leader>fb
Switch buffers
<leader>fh
Search headings
<leader>fo
Document outline
<leader>fk
Backlinks
<leader>ft
Search tags
<leader>fr
Recent files
<leader>fm
Jump to mark
<leader>fR
Registers
<leader>fp
Resume last picker
Harpoon
Pin files to numbered slots for instant switching. See harpoon for details.
Keybinding
Description
<leader>ha
Pin current file
<leader>hr
Remove current file
<leader>ht
Toggle pin
<leader>hp
Open harpoon picker
<leader>1–<leader>9
Jump to slot 1–9
<leader>hn
Next pin
<leader>hN
Previous pin
Keyboard shortcuts inside picker
Key
Action
<C-n> / <C-p>
Navigate down/up
<C-j> / <C-k>
Navigate down/up
<Up> / <Down>
Navigate down/up
<Enter>
Select item
<Escape> / <C-c>
Close picker
<C-x>
Open in horizontal split
<C-v>
Open in vertical split
<C-t>
Open in new tab
<C-d> / <C-u>
Scroll preview down/up
Hard-wrap operators
Reformat paragraphs with Markdown-aware line wrapping.
Keybinding
Description
gqq / gwq
Reformat current line at textwidth (default 80)
gqj / gwj
Reformat current and next line
gqip / gwip
Reformat paragraph
Visual gq / gw
Reformat selected lines
Undo tree navigation
Key
Action
g-
Navigate to chronologically older undo state
g+
Navigate to chronologically newer undo state
:earlier N
Go back N changes
:later N
Go forward N changes
:earlier Ns/Nm/Nh/Nd
Go back by time
:earlier Nf
Go to Nth previous save point
:undolist
Show undo tree modal
:UndoTreeToggle
Toggle undo tree sidebar
:UndoTreeShow
Open undo tree sidebar
:UndoTreeHide
Close undo tree sidebar
Custom operators
Keybinding
Description
g@{motion}
Call the function stored in operatorfunc over the range of {motion}.
Replace-with-register operator
Replace text covered by a motion with the contents of a register, discarding
the replaced text (not written back to any register). The register supplying the
replacement is preserved, so you can paste the same text repeatedly without
re-yanking.
Blockwise visual selections (<C-V>) are supported.
Keybinding
Description
gr{motion}
Replace {motion} text with unnamed register (")
grr
Replace current line with unnamed register (linewise)
"a gr{motion}
Replace {motion} text with register a
Visual gr
Replace selection with unnamed register
Example usage:
yiw " yank inner wordgriw " replace next inner word (register preserved — repeat!)grr " replace current linegrap " replace a paragraph"agr$ " replace to end of line using register a
Info
gr{motion} is not a Neovim built-in — it originates from the vim-ReplaceWithRegister plugin. In Neovim 0.10+, the gr prefix is used
for LSP actions (grn rename, grr references, gra code action). Since
Obsidian has no LSP, this plugin repurposes gr for replace-with-register
and exposes the former grn/grr/gra workspace actions as leader
bindings (<leader>rn, <leader>rb, <leader>ra) and ex commands
(:renamenote, :showbacklinks, :contextactions).
Flash motions
Enhanced character search — when multiple matches are visible, labels appear for direct jumping.
Keybinding
Description
f{char}
Find {char} forward — autojump on single match, labels on 2+
F{char}
Find {char} backward
t{char}
Till before {char} forward
T{char}
Till after {char} backward
Flash works with operators (df, cf, yf) and visual mode (vf). Repeat with ; and ,.
Flash jump mode
Bidirectional character search (disabled by default, enable with set flashjump).
Keybinding
Description
s{char}
Search {char} bidirectionally — labels on all matches
The trigger key is configurable via set flashjumpkey=<key>.
Flash search labels
After committing a / or ? search, labels appear on all visible matches for direct jumping.
EasyMotion find motions
Jump to specific characters forward, backward, or in both directions.
Keybinding
Description
<leader><leader>f{char}
Find {char} forward
<leader><leader>F{char}
Find {char} backward
<leader><leader>s{char}
Find {char} in both directions
<leader><leader>t{char}
Till before {char} forward
<leader><leader>T{char}
Till after {char} backward
EasyMotion word motions
Jump to word starts or ends across the visible editor.
Keybinding
Description
<leader><leader>w
Word start forward
<leader><leader>b
Word start backward
<leader><leader>e
End of word forward
<leader><leader>ge
End of word backward
<leader><leader>W
WORD start forward
<leader><leader>B
WORD start backward
<leader><leader>E
End of WORD forward
<leader><leader>gE
End of WORD backward
EasyMotion line motions
Jump directly to lines above or below the cursor.
Keybinding
Description
<leader><leader>j
Line down
<leader><leader>k
Line up
EasyMotion search motions
Jump to search matches forward or backward.
Keybinding
Description
<leader><leader>n
Next search match forward
<leader><leader>N
Next search match backward
EasyMotion repeat
Keybinding
Description
<leader><leader>.
Repeat last EasyMotion motion
Repeats the most recent EasyMotion motion with a fresh label overlay. Works in operator-pending mode (d<leader><leader>. deletes to the repeated target) and inherits motionArgs from the original motion (linewise, inclusive, forward flags are preserved).
Surround
Add, change, or delete surrounding delimiters like brackets, quotes, and tags.
Keybinding
Description
ds{target}
Delete surrounding (ds" on "hello" → hello)
dst
Delete surrounding tag
cs{target}{replacement}
Change surrounding (cs"' → 'hello')
cst{replacement}
Change surrounding tag
ys{motion}{replacement}
Add surround (ysiw) on hello → (hello))
ys{motion}<tag>
Surround with HTML tag (ysiw<em> → <em>hello</em>)
ysiwf + name + Enter
Surround with function call (print(hello))
ysiwF + name + Enter
Surround with spaced function call (print( hello ))
dsf
Delete surrounding function call (print(hello) → hello)
csf + name + Enter
Change surrounding function name (foo(bar) → baz(bar))
yss{replacement}
Surround entire line (yss" → "line content")
cS / yS / ySS
Newline surround variants (delimiters on separate lines)
Insert mode: inserts both delimiters, type inside them
Workspace navigation
Navigate Obsidian panes, tabs, and history following Neovim conventions.
Keybinding
Description
Global
h / j / k / l
Native File Explorer: parent/next/previous/child; counts work
Yes
<C-w>h/j/k/l
Focus pane left/down/up/right
Yes
<C-w>v
Split vertical
Yes
<C-w>s
Split horizontal
Yes
<C-w>n
New horizontal split (alias for <C-w>s)
Yes
<C-w>c / <C-w>q
Close current tab
Yes
<C-w>o
Close all other tabs
Yes
gt / gT
Next/previous tab
Yes
Ngt
Go to Nth tab (e.g., 3gt goes to tab 3)
Yes
g<C-t>
Go to tab by number (e.g., 3g<C-t> goes to tab 3)
—
H / L
Previous/next tab (non-editor views only)
Yes
<C-w>w
Cycle to next pane
Yes
<C-w>W
Cycle to previous pane
Yes
<C-w>p
Focus previously accessed pane
Yes
<C-w>T
Move current pane to a new tab
—
<C-w>^
Split + open alternate file
—
g<Tab>
Go to last accessed tab (alias for <C-w>p)
—
Ctrl-o / Ctrl-i
Jump backward / forward through jump history (supports count)
Yes
<C-^> / <C-6>
Switch to alternate (previously edited) file
Yes
<C-]>
Follow link under cursor (alias for gd)
—
<C-t>
Pop from link follow (jump list backward)
—
gd
Go to definition — open the link under the cursor
—
gD
Open link under cursor in a new tab
—
<C-w>gd
Open link under cursor in a horizontal split
—
<C-w>gD
Open link under cursor in a vertical split
—
gx
Open URL under cursor in browser
—
K
Keyword lookup — hover preview on links, char info on text
—
gf
Open file switcher (quick open)
—
]f / [f
Alias for gf (go to file)
—
gO
Open document outline (searchable heading list)
—
g<C-g>
Show document statistics (words, lines, characters)
—
gp / gP
Paste and move cursor past pasted text
—
ga
Show character info under cursor (codepoint, hex)
—
gm
Go to middle of screen line
—
go
Go to character offset (byte N in buffer, with count)
—
g8
Show UTF-8 byte sequence for character under cursor
—
gF
Go to file with optional line number (file.md:42)
—
<C-g>
Show file info (name, lines, position, percentage)
—
<leader>rn
Rename current note
—
<leader>rb
Show backlinks to current note
—
<leader>ra
Show context actions for current note
—
Fold commands
Keybinding
Description
zo
Open fold at cursor
zO
Open fold at cursor recursively
zc
Close fold at cursor
zC
Close fold at cursor recursively
za
Toggle fold at cursor
zA
Toggle fold at cursor recursively
zd
Delete fold at cursor
zD
Delete fold at cursor recursively
zf{motion}
Create fold for {motion} text
zF
Create fold for [count] lines
zE
Eliminate all folds
zm
Fold more (increment fold level)
zM
Close all folds
zr
Fold less (decrement fold level)
zR
Open all folds
zn
Fold none — disable folding, open all folds
zN
Fold normal — re-enable folding
zi
Toggle fold enable
zv
Open enough folds to view cursor line
zx
Reapply fold level and reveal cursor
zX
Reapply fold level
zj
Move to start of next fold
zk
Move to end of previous fold
[z
Move to start of current fold
]z
Move to end of current fold
Vertical scroll
Keybinding
Description
zz
Centre the cursor line in the viewport
z.
Centre the cursor line, cursor to first non-blank
zt
Scroll the cursor line to the top of the viewport
z<CR>
Cursor line to the top, cursor to first non-blank
zb
Scroll the cursor line to the bottom of the viewport
z-
Cursor line to the bottom, cursor to first non-blank
Info
On a wrapped line these commands position the whole logical line, not
the cursor’s display row — Vim’s scroll_cursor_halfway works in whole-line
heights, so zz with the cursor at the start, middle, or end of one wrapped
line produces the same scroll position. When the line is taller than the
viewport, Vim scrolls inside the line (skipcol) by just enough to keep the
cursor visible, which puts a cursor at the end of the line on the last
visible row. Both behaviours match Neovim.
Tip
zt and zb leave scrolloff rows of margin above and below
the cursor line, and stop at the centred position once that margin no longer
fits — so with set scrolloff=999, zt, zb and zz all centre the line. zz itself is unaffected by scrolloff on a line that fits the viewport.
Inside a line taller than the viewport the margin applies to the cursor’s own
display row instead, and is unreachable at the line’s first and last rows.
Horizontal scroll
Keybinding
Description
zs
Scroll text so cursor column is at the left edge
ze
Scroll text so cursor column is at the right edge
zH
Scroll half a screen width to the left
zL
Scroll half a screen width to the right
Select mode
Keybinding
Description
gh
Enter select mode (charwise)
gH
Enter select mode (linewise)
g<C-h>
Enter select mode (blockwise)
<C-g>
Toggle between visual and select mode (in visual/select)
gV
Prevent select mode reselection after mapping
Virtual replace mode
Keybinding
Description
gR
Enter virtual replace mode (replace by screen column)
Non-editor view bindings
Navigate and interact with non-editor views like PDFs, graphs, and canvases.
Keybinding
Description
f
Show hint labels, activate target (click/focus/navigate)
F
Show hint labels, open target in new pane
yf
Show hint labels, yank target URL or text to clipboard
df
Show hint labels, close target tab or pane
gf
Show hint labels, open context menu on target
Nf
Activate N targets sequentially (e.g., 3f activates 3)
j / k
Scroll down/up one line
Nj / Nk
Scroll N lines (e.g., 5j scrolls 5 lines down)
gg
Scroll to top
G
Scroll to bottom
Ctrl-d / Ctrl-u
Scroll half page down/up
Ctrl-f / Ctrl-b
Scroll full page down/up
All non-editor bindings can be customized via gmap, gnoremap, and gunmap in your .obsidian.vimrc. Use :gmap to list all active global bindings. See vimrc > Global key mappings for syntax.
Ex commands
Execute commands via the : command line, grouped by function.
Remove current file (or :HarpoonRemove N for slot N)
:Harpoon
Open harpoon picker
:HarpoonSelect N
:HarpoonS
Jump to pin slot N
:HarpoonNext
:HarpoonN
Next pin
:HarpoonPrev
:HarpoonP
Previous pin
Input method
Command
Short
Description
:IMToggle
:IMT
Toggle input method switching on/off
:IMStatus
:IMS
Show current input method identifier
Utility
Command
Description
:ob {command-id}
Execute any Obsidian command by ID
:ob
List all available command IDs
:commands
Search and execute Obsidian commands
:sidebar left / :sidebar right
Toggle left/right sidebar
:reg / :registers
Browse vim registers (paste on select)
:delmarks {marks}
Delete specified marks
:version / :ve
Show plugin version
:violations / :viol
Show runtime invariant violations
:violations! / :viol!
Clear invariant violation log
:gmap
List all active global bindings
Obsidian commands
The following commands are available in the Obsidian command palette (Ctrl+P or Cmd+P).
Command
Description
Vim Motions: Toggle Vim mode
Toggle the plugin’s vim mode on/off
Vim Motions: Enable Vim mode
Enable the plugin’s vim mode
Vim Motions: Disable Vim mode
Disable the plugin’s vim mode
Vim Motions: Toggle mobile
Toggle plugin activation on mobile
Vim Motions: Check conflicts
Open the hotkey conflict resolution modal
Vim Motions: Reload configuration
Reload both vimrc and Lua config files
Vim Motions: Open configuration in default editor
Open config files in external editor (desktop only)
Vim Motions: Open configuration directory in system explorer
Reveal the folder holding your config files (desktop only)
Snippets
Snippet keybindings are active during snippet expansion (after a snippet has been triggered).
Keybinding
Description
Tab
Move to next tabstop / expand snippet at prefix
Shift+Tab
Move to previous tabstop
Escape
Exit snippet mode
Ctrl+N
Cycle to next choice (on choice fields)
Ctrl+P
Cycle to previous choice (on choice fields)
Oil explorer
Oil keybindings are only active when an oil buffer is focused. All keybindings are user-remappable via Lua or vimrc — see oil-explorer > Remapping keybindings for details. Oil ex commands (:oilopen, :oilparent, etc.) are always registered — invoking them outside an Oil buffer shows a notice instead of an error.
Keybinding
Ex command
Description
<CR>
:oilopen
Open file under cursor / navigate into directory
<C-t>
:oilopentab
Open file under cursor in new tab
<C-s>
:oilopensv
Open file under cursor in vertical split
<C-h>
:oilopensh
Open file under cursor in horizontal split
-
:oilparent
Navigate to parent directory
~
:oilroot
Navigate to vault root
q
:oilclose
Close oil buffer
<C-c>
:oilclose
Close oil buffer
<C-l>
:oilrefresh
Refresh directory listing
g.
:oiltogglehidden
Toggle hidden files (dotfiles)
gs
:oilcyclesort
Cycle sort order (name → modified time → size)
y.
:oilyankpath
Yank vault-relative file path to clipboard
gf
:oilreveal
Reveal file under cursor in Obsidian file explorer
gx
:oilopenexternal
Open file under cursor in default system app
g?
:oilhelp
Show keybinding help modal
<C-p>
:oilpreview
Toggle preview split (shows file under cursor, auto-updates on cursor move)
dd
Stage file deletion (commit with :w)
o
Stage file creation — type filename, commit with :w
cw
Stage file rename — edit filename, commit with :w
:w
Commit all staged changes (create/rename/delete)
:Oil
Open oil explorer (no arg: current dir, .//: vault root, path: specific dir)
Quality of life
Enhanced Vim behavior and Obsidian-specific improvements.
Keybinding
Description
o / O
Smart list continuation (bullets, numbers, checkboxes, blockquotes)
Y
Yank to end of line (y$)
Q
Replay last recorded macro (@@)
@:
Repeat last ex command
&
Repeat last :s substitution on current line
g&
Repeat last :s substitution on all lines
gM
Go to middle character of text line
K
Keyword lookup (hover preview on links, char info)
]<Space>
Add N blank lines below cursor
[<Space>
Add N blank lines above cursor
ZZ
Write current file and close tab (:wq)
ZQ
Close tab without saving (:q)
g;
Older change
g,
Newer change
g-
Older undo state
g+
Newer undo state
<C-p>
Cycle paste previous register (or k if not cycling)
<C-n>
Cycle paste next register (or j if not cycling)
Insert mode
Keybinding
Description
<C-u>
Delete back to insert-start position (or line start)
<C-a>
Re-insert previously inserted text
<C-e>
Copy character from line below (same column)
<C-y>
Copy character from line above (same column)
<C-G>s
Insert-mode surround (inserts both delimiters, type inside)
<C-G>u
Insert undo break
<C-G>U
Suppress undo break on next cursor movement
<C-G>j / k
Navigate lines while preserving insert-start column
Visual mode: decrements numbers across selection (-1, -2, -3…)
Remapping
All keybindings above are user-remappable. See remapping for instructions and examples covering editor, oil explorer, picker, and global workspace navigation contexts.