Table Master

approved

by moranrs

This plugin has not been manually reviewed by Obsidian staff. All-in-one Markdown table workflow: floating toolbar, visual grid editor, and merged-cell support with MultiMarkdown ^^ / || syntax.

1 stars159 downloadsUpdated 23d agoMIT

Table Master for Obsidian

English简体中文

All-in-one Markdown table workflow for Obsidian. Combines the most useful pieces of three popular table plugins into a single, modern UI:

  • GUI shortcuts (insert / delete / move row & column, alignment) — replaces Advanced Tables
  • Visual grid editor with drag-to-select and merged-cell support — replaces Markdown Table Editor
  • Merged cells rendered in both Reading view and Live Preview, fully compatible with Table Extended / MultiMarkdown syntax — replaces Table Extended

Table Extended uses the same parser hook for source rendering. Running both plugins together is not supported: Table Master will warn you on load and you should disable the others.

Features

1. Floating toolbar

When the cursor enters a GFM table the floating toolbar appears above the first row:

  • Insert / delete row & column
  • Move row up / down, column left / right
  • Align column left / center / right
  • Merge ↑ / Merge ↓ / Merge ← / Split cell
  • Open the grid editor
  • Format / re-pad table
  • Paste a table copied from Excel / a web page (HTML or TSV is detected automatically)

2. Right-click menu

All table operations are also available from the editor's right-click menu when the cursor is inside a table.

3. Visual grid editor

Run the command Open grid editor (or click the grid button on the toolbar) to launch a Modal that displays the table as an Excel-like grid.

  • Click a cell to edit it inline
  • Click and drag, or Shift-click, to select a rectangular range
  • Use the Merge button to merge the selected range
  • Use the Split button to split the cell at the active selection
  • Add / delete rows and columns
  • Click Apply to write the changes back to the markdown source

4. Merged cells (MultiMarkdown / Table Extended syntax)

| Stage              | Direct Products | ATP Yields |
| ------------------ | --------------- | ---------- |
| Glycolysis         | 2 ATP           ||
| ^^                 | 2 NADH          | 3-5 ATP    |
| Pyruvate oxidation | 2 NADH          | 5 ATP      |
| **30-32** ATP                                  |||
  • ^^ — the cell merges with the row directly above (rowspan)
  • A trailing || extends the previous cell by one column; ||| by two, and so on (colspan)

The parser also accepts every other Table Extended construct:

  • Headerless tables (block starts with the separator row)
  • Table caption[Caption text] or [Caption text][label] immediately above or below
  • Multiple header rows (any rows above the separator row)
  • Multiple <tbody> sections by inserting a single blank line inside the body
  • Multi-line cells continued from the next row with a trailing \
  • Inline Markdown (lists, code, links, embeds) is rendered inside cells in Reading view; Live Preview keeps Obsidian's native widget rendering and only applies merges.

If you prefer maximum portability, set Merged-cell output format to HTML and Table Master will write a regular <table> with colspan / rowspan attributes instead.

Live Preview applies merges by toggling rowspan / colspan attributes and hiding placeholder cells in Obsidian's existing table widget — cell text is left untouched, so the widget remains compatible with normal Obsidian editing. Multi-line cells, captions, and inline markdown re-rendering remain Reading View only.

5. Cell navigation

Tab / Shift-Tab move between cells and Enter jumps to the next row (creating one if needed). Disable in settings if it interferes with your workflow.

6. Design-from-scratch flow

Run Design new table in grid editor… to be asked for rows / columns / header presence first, then drop straight into the grid editor. Hit Apply to insert the finished table at the cursor — no need to be inside an existing table beforehand.

7. Paste tables from Excel / web

Copy a range from Excel, Google Sheets, Numbers, or any web page that contains an HTML <table>, then run Paste table from clipboard (also available as a button on the floating toolbar when the cursor is in a table):

  • Excel / web pages: the rich text/html clipboard payload is parsed; colspan / rowspan are preserved and translated to MultiMarkdown placeholders.
  • Plain TSV: tab-separated text is parsed as a fallback (Excel always provides this).
  • If the cursor is currently inside a table, the import replaces that table; otherwise the new table is inserted at the cursor.
  • Pipes inside imported cells are escaped automatically so the markdown round-trips cleanly.
  • Multi-line cells (Excel Alt+Enter, <br> in HTML, <p>/<div>/<li> blocks) are emitted as a single GFM row with <br> between segments. Reading view + Live Preview both upgrade those <br> tokens to real line breaks, so a multi-line cell still wraps visually while merge structure (rowspan/colspan) stays intact.

Installation

From source

git clone <repo> obsidian-table-master
cd obsidian-table-master
npm install
npm run build

Copy main.js, manifest.json, and styles.css into <vault>/.obsidian/plugins/table-master/, then enable the plugin in Obsidian.

Hot-reload during development

npm run dev

esbuild watches src/ and rebuilds main.js on change. Combine with the hot-reload plugin for an instant feedback loop.

Commands

Every action is exposed as a command and can be bound to a hotkey from Settings → Hotkeys.

IDDescription
insert-row-aboveInsert row above
insert-row-belowInsert row below
insert-col-leftInsert column to the left
insert-col-rightInsert column to the right
delete-rowDelete row
delete-colDelete column
move-row-upMove row up
move-row-downMove row down
move-col-leftMove column left
move-col-rightMove column right
align-left/center/right/noneAlign column
merge-upMerge with cell above
merge-downMerge with cell below
merge-leftMerge with cell to the left
split-cellSplit merged cell
format-tableRe-pad table cells
sort-asc / sort-descSort by column
open-grid-editorOpen the visual grid editor on the table at the cursor
design-new-tableOpen the grid editor with a fresh empty table and insert on apply
toggle-floating-toolbarShow/hide the floating toolbar
new-tableInsert a new empty table
import-table-from-clipboardPaste an Excel / web table from the clipboard

Settings

  • Merged-cell output format — Extended (^^ for rowspan, trailing || for colspan; same as Table Extended) or raw HTML (colspan / rowspan attributes on a <table>)
  • Show floating toolbar
  • Floating toolbar position — three modes (all use position: fixed so a custom theme can't hide them; non-focused tabs auto-hide their own toolbar):
    • Pop up at click position when clicking a table (default): the toolbar stays hidden until you click inside a table, then springs up at the click point and stays there until you click outside any table.
    • Follow mouse inside table; top-left otherwise: always visible while the editor is focused. Trails the mouse pointer whenever it's hovering a table; falls back to the top-left of the editor when not.
    • Always at the editor's top-left: pinned at the top-left of the editor pane regardless of where you click.
  • Enable Tab navigation
  • Default column alignment
  • Interface language — Auto / English / 中文

Development

npm test            # run unit tests for parser / serializer / ops
npm run build       # type-check and bundle for production

Architecture is layered so logic is decoupled from Obsidian:

src/
  table/      pure model + parser + serializer + ops (no Obsidian deps)
  editor/     editor mutations driven from the cursor
  ui/         floating toolbar, context menu, modal grid editor
  render/     reading-view post-processor + live-preview view plugin
  i18n/       en / zh dictionaries
  settings.ts settings tab
  main.ts     plugin entry

Credits

Inspired by:

All three are MIT-licensed; this plugin is also MIT.

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.