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.
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)
All table operations are also available from the editor's right-click menu when the cursor is inside a table.
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
| 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.
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.
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.
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/htmlclipboard payload is parsed;colspan/rowspanare 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.
git clone <repo> obsidian-table-master
cd obsidian-table-master
npm install
npm run buildCopy main.js, manifest.json, and styles.css into <vault>/.obsidian/plugins/table-master/, then enable the plugin in Obsidian.
npm run devesbuild watches src/ and rebuilds main.js on change. Combine with the hot-reload plugin for an instant feedback loop.
Every action is exposed as a command and can be bound to a hotkey from Settings → Hotkeys.
| ID | Description |
|---|---|
insert-row-above |
Insert row above |
insert-row-below |
Insert row below |
insert-col-left |
Insert column to the left |
insert-col-right |
Insert column to the right |
delete-row |
Delete row |
delete-col |
Delete column |
move-row-up |
Move row up |
move-row-down |
Move row down |
move-col-left |
Move column left |
move-col-right |
Move column right |
align-left/center/right/none |
Align column |
merge-up |
Merge with cell above |
merge-down |
Merge with cell below |
merge-left |
Merge with cell to the left |
split-cell |
Split merged cell |
format-table |
Re-pad table cells |
sort-asc / sort-desc |
Sort by column |
open-grid-editor |
Open the visual grid editor on the table at the cursor |
design-new-table |
Open the grid editor with a fresh empty table and insert on apply |
toggle-floating-toolbar |
Show/hide the floating toolbar |
new-table |
Insert a new empty table |
import-table-from-clipboard |
Paste an Excel / web table from the clipboard |
- Merged-cell output format — Extended (
^^for rowspan, trailing||for colspan; same as Table Extended) or raw HTML (colspan/rowspanattributes on a<table>) - Show floating toolbar
- Floating toolbar position — three modes (all use
position: fixedso 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 / 中文
npm test # run unit tests for parser / serializer / ops
npm run build # type-check and bundle for productionArchitecture 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
Inspired by:
- Advanced Tables by Tony Grosinger
- Markdown Table Editor by Ivan Tikhonov
- Table Extended by Zhou Hua
All three are MIT-licensed; this plugin is also MIT.