Universal Cursor Hotkeys

by shichishima
5
4
3
2
1
Score: 55/100

Description

Markdown table-aware cursor navigation & Chinese/Japanese word splitting — for Vim mode, for Emacs keybindings, and for Everyone.

Reviews

No reviews yet.

Stats

2
stars
2,202
downloads
0
forks
144
days
1
days
8
days
28
total PRs
0
open PRs
1
closed PRs
27
merged PRs
7
total issues
1
open issues
6
closed issues
711
commits

Latest Version

8 days ago

Changelog

[0.11.2] - 2026-09-26

Fixed

  • Editor commands (Ctrl-N/Ctrl-P and every other command in this plugin) no longer fire mid-IME-composition: previously, cycling Chinese/Japanese/Korean IME conversion candidates with e.g. Ctrl-N/Ctrl-P worked for the first couple of presses, but partway through the IME stopped consuming further presses and let them reach Obsidian's command dispatcher instead — from that point on, this plugin's own cursor movement ran and moved the real editor cursor instead of the candidate selection, even though the composition itself was still in progress. Every command now checks CM6's own composition state (including a focused Live Preview table cell's own inner editor) before running, and no-ops while it's active.
  • Vim: bare Space no longer inserts a literal space after turning Table structure and Table navigation both off, without restarting: these two features share one internal guard that stops an unmatched <Space> leader attempt from leaking through as a real keystroke, since Space's own native vim.js binding (removed the moment either feature is first turned on, to make room for the <Space>t... leader) can't be restored without an app reload. That guard was being torn down as soon as both features reported "off," even though Space's native binding was still permanently gone — so leaving it in this state (turning on just one of the two features, even briefly, was already enough) let a stray Space insert a literal space again. The guard now stays installed for the rest of the session once Space's native binding has actually been removed, matching the already-accepted "bare Space does nothing" behavior from while the features were still on, instead of regressing to the literal-space leak.
  • Kill region no longer eats the following newline when a selection starts at a Live Preview table cell's own start: previously, this silently also consumed the next sub-line's leading newline (removing the resulting blank sub-line) instead of removing exactly what was selected. Real Emacs's own kill-region never does this — it removes exactly the selection, nothing more. Kill region's Live Preview path is now a plain selection delete, matching how it already behaved outside tables and in Source Mode.
  • Word right/left and Uppercase/Lowercase/Capitalize word now respect the Cross-row navigation setting inside tables, matching LEFT/RIGHT/HOME/END: previously these commands always crossed to the next/previous table row, or exited the table entirely from the header row's left edge or the last row's right edge, even with Cross-row navigation turned off — they're now stopped at the row's own boundary in that case, just like every other table-aware command already was. Vim's own w/b/e are unaffected — this setting isn't exposed on the Vim tab, and real Vim's word motions have no notion of stopping at a row boundary to begin with.

Changed

  • No user-visible change: added an empty getSettingDefinitions() override to the settings tab. This tab's UI (3-tab layout, Key Upgrades' live hotkey-assignment side effects, per-OS recommended keys) doesn't fit the declarative settings API's simple model, so this is a placeholder only — it doesn't make any setting searchable in Obsidian's global settings search, and doesn't change anything about how the tab renders or behaves on any Obsidian version.

Compatibility

  • Verified compatible with Obsidian 1.14. One known behavioral gap found: since Obsidian 1.14, native paste (Cmd/Ctrl+V) avoids duplicating a list marker when pasting a list item onto a line that already has one — Yank (Ctrl+Y) doesn't yet replicate this and can still produce a duplicate marker. Planned for a future release.

README file from

Github

Universal Cursor Hotkeys — CJK-aware word navigation inside Obsidian's Markdown tables, with full Vim mode support

Your everyday arrow keys, Home/End, Page Up/Down, and word movement work smarter around Live Preview's Markdown tables, and handle CJK (Chinese/Japanese) text just as well. Vim mode and macOS-style (Emacs) keybindings get the same upgrade.

Overview

Your everyday arrow keys and Page Up/Down finally behave correctly around Live Preview's tables. Home adapts to Markdown. Chinese and Japanese (CJK) text is handled correctly. Vim mode gets cursor movement that actually works inside tables. macOS-style, Emacs-flavored cursor and editing hotkeys come as a full set.

This plugin raises the baseline for cursor movement in Obsidian itself.

How do you use Obsidian? Pick one of the three below

First, For everyone — upgrades the cursor keys and Home/End you already use, as they are. Chinese/Japanese word-splitting support lives here too.

A Vim mode user? This makes Obsidian's built-in Vim mode handle Markdown tables naturally. Chinese/Japanese word-splitting support for Vim mode lives here too.

Want macOS-style shortcuts on Windows too? Or want more Emacs keybindings?

Read whichever section below fits you.


For everyone

You don't need Vim mode or Emacs-style keybindings to benefit from this plugin.

Getting started: Open Settings → Universal Cursor Hotkeys → For everyone and click Apply all.

What it does:

  • ↑ / ↓ — column-aware: keeps your column position across table rows instead of snapping to a cell's start.
  • Home — Smart home skips past Markdown syntax (lists, headings, blockquotes, and more) to land on the real content.
  • Page Up / Page Down — previously couldn't land inside a table at all. Turn this on and it scrolls a full screen at a time, keeping the cursor in view, table cells included.
  • Ctrl+←/→, Ctrl+Backspace/Delete (macOS: Option+←/→, Option+Delete) — move and delete by word, Chinese/Japanese included (dictionary-based word segmentation).
  • Double-click (mouse) — also Chinese/Japanese-aware: selects just the word under the cursor, not the whole unbroken run.

Every key here is purely additive — turning one on adds that key to the target command's hotkeys, without removing any it already has. You can always check what's assigned — and turn it off — in Settings → Hotkeys.

📖 Full documentation → For everyone


Vim mode

If you use Obsidian's built-in Vim mode, you already know the quirks of Live Preview tables. This plugin fixes them.

Getting started: Turn on Obsidian's built-in Vim key bindings (Settings → Editor) — that's it. All the motion upgrades are on by default, no setup needed. If you also want the leader-key Table structure/Table navigation commands (off by default), open Settings → Universal Cursor Hotkeys → Vim mode and click Apply both.

What it does:

  • h/j/k/l (and gj/gk) all work correctly inside table cells: j/k/gj/gk cross table rows, while h/l correctly stop at the cell's own edge instead (w/b/e below are the ones that cross cells).
  • w/b/e cross table cells and rows too, with CJK-aware (Chinese/Japanese) word segmentation.
  • gg/G reach the note's real first/last line, even from inside a table.
  • Leader-key commands (Space t...) insert, delete, move, duplicate, and align table rows/columns, plus jump straight cell-to-cell (<leader>tj/tk/th/tl) — all without leaving Vim's own keys.

Everything above is scoped to table cells — outside a table, Vim mode behaves exactly as it always has. Each fix is a plain on/off toggle, so turning one off restores Obsidian's Vim mode to its native behavior immediately.

📖 Full documentation → Vim mode


macOS-style (Emacs keybindings)

On macOS, Ctrl+P/N/B/F move the cursor everywhere in your notes — except inside tables. Once bound to hotkeys, this plugin's commands make that movement work inside tables too.

Kill & Yank and a full set of Emacs-style cursor and editing commands bring the complete workflow to macOS and Windows alike.

There's also Markdown-aware smart behavior built in — give Smart home and Smart join a try.

Getting started: Open Settings → Universal Cursor Hotkeys → macOS (Emacs) style and click Apply recommended for each of the three command groups — three clicks and you're done. (Manual setup via Settings → Hotkeys works too.)

Also worth a look: turn on Smart home (advanced) to cleanly skip past Markdown headings, or Smart join if you often use Kill line on list items.

What it does:

  • Ctrl+P/N/B/F/A/E move like physical cursor keys, even inside tables.
  • Kill & Yank (Ctrl+K/Y) — consecutive kills accumulate; Kill Region (Ctrl+W) handles table cell newlines and pipe characters automatically too.
  • Case conversion (dwim-style upcase/downcase/capitalize), Transpose chars, Recenter-top-bottom, and more round out the full Emacs editing workflow.

Like For everyone, these are ordinary Obsidian Commands bound to real hotkeys — visible and reassignable any time in Settings → Hotkeys.

📖 Full documentation → macOS-style (Emacs) keybindings


Obsidian's Live Preview is genuinely great, I think, and it renders and edits Markdown tables well. It just falls a little short in this one specific way — and that one thing seems to weigh on its reputation more than it should. This plugin exists to close that gap and make Obsidian's Live Preview that much better. If it helps your everyday note-taking in Obsidian, that's exactly what it's here for.

Acknowledgments

  • The code and documentation for this plugin were developed with the assistance of AI.