Nifty Markdown
Markdown editing that keeps up: table of contents, section numbers, smart lists and task toggles, formatting keys, image paste, link checks and completions, and math in the preview.
Maintained. No sign-in. No telemetry. Works in VS Code, Cursor, Windsurf, VSCodium and other editors that use Open VSX, and in the browser on vscode.dev and github.dev.
Features





- Table of contents. Create or Update Table of Contents puts a TOC at the cursor between
<!-- toc --> and <!-- /toc -->, and it updates itself when you save. Pick the heading levels (2..6 by default), bullets or numbers, and override them per document in the marker: <!-- toc levels=2..3 ordered -->. Leave a heading out with <!-- omit from toc -->. The TOC's own title ("## Contents") is skipped. TOCs made by other tools (<!-- TOC -->, <!-- tocstop -->, or an unmarked list of heading links) are recognised and updated in place.
- Anchors for your Git host. Heading links follow GitHub's rules by default, or GitLab, Azure DevOps or Bitbucket (
nifty.markdown.slugStyle), including numbering of repeated headings (#usage, #usage-1). The TOC, completions and link checks all use the same rules.
- Section numbers. Add
1., 1.1., 1.2. … to headings and take them off again; a lone # title isn't numbered. The TOC follows.
- Lists that type themselves. Enter continues bullets, numbers, task lists (with a fresh
[ ]) and blockquotes, and splits an item at the cursor. Enter on an empty item ends the list (or moves a nested item out one level). Tab / Shift+Tab indent and outdent an item together with everything nested under it, lined up under the text of the item above. Backspace right after a marker removes the checkbox, then the indent, then the marker.
- Ordered lists stay numbered. Numbers are fixed after list edits and after pasting, deleting or moving lines inside a list. A list keeps its start number, nested lists count on their own, and
1. 1. 1. lists stay that way. Undo takes a renumbering back.
- No typing lag. The list keys only reach the extension on list and quote lines (the editor tracks that with a context key), and each key looks at the lines around the cursor, not the whole file.
- Formatting toggles for bold, italic, strikethrough, inline code, links and blockquotes. With nothing selected they work on the word at the cursor, and pressing again removes the markers. Toggle Link uses a URL from the clipboard when there is one, and unlinks when the cursor is in a link. Alt+C ticks and unticks task checkboxes on every selected line, and turns plain lines into tasks.
- Paste Image (Shift+Alt+V) saves the clipboard image (a screenshot, or a copied image file) into
images/ next to the Markdown file, named after the file and the time, and inserts . Folder, name pattern and alt text are settings. On vscode.dev, github.dev and in remote windows a small paste panel opens instead: press Ctrl+V there or drop an image file on it.
- Link checks. Relative links and images to files that don't exist,
#anchors that match no heading (in this file or in the linked Markdown file), and [text][label] references without a definition show up in the Problems panel as you type. Check Links in Workspace checks every Markdown file. Skip targets with globs (nifty.markdown.validate.ignore).
- Path and #heading completions in links and images, including the headings of other Markdown files (
guide.md#), using your slug style.
- Math in the preview.
```math blocks and $`…`$ (GitHub's syntax) render with KaTeX in VS Code's own Markdown preview, and so do $…$ / $$…$$ in editors without built-in math. \(…\) / \[…\] and KaTeX macros are settings.
Keyboard shortcuts
The shortcuts only apply in Markdown files with the cursor in the editor, and none of them replaces a VS Code default there. Ctrl+B (side bar) and Ctrl+I keep doing what they did.
| Windows / Linux |
macOS |
Action |
| Enter |
Enter |
Continue the list or quote (on list and quote lines only) |
| Tab / Shift+Tab |
Tab / Shift+Tab |
Indent / outdent the list item (on list lines, when no suggestion or snippet is active) |
| Backspace |
Backspace |
Remove the marker before the cursor (only right after a list marker) |
| Alt+B |
Ctrl+Alt+B |
Toggle bold |
| Alt+I |
Ctrl+Alt+I |
Toggle italic |
| Alt+X |
Ctrl+Alt+X |
Toggle strikethrough |
| Alt+M |
Ctrl+Alt+M |
Toggle inline code |
| Alt+K |
Ctrl+Alt+K |
Toggle link |
| Shift+Alt+Q |
Ctrl+Alt+Q |
Toggle blockquote |
| Alt+C |
Ctrl+Alt+C |
Toggle task checkbox (while the Find widget is open, Alt+C still switches its case-sensitive option) |
| Shift+Alt+V |
Ctrl+Alt+V |
Paste image |
Turn the list keys off with nifty.markdown.lists.keys, or change any shortcut in Preferences: Open Keyboard Shortcuts. The list keys stay out of Vim's normal mode.
Works with the rest of the family
Nifty Markdown leaves some Markdown jobs to other Nifty extensions instead of doing them twice:
- Tables: Nifty Text formats Markdown tables (padding, alignment, CJK width). Format Table here runs it when it's installed.
- Wrapping: Nifty Rewrap wraps and unwraps Markdown paragraphs (Alt+Q).
- Diagrams: Nifty Mermaid renders
```mermaid blocks in the preview.
- PDF: Nifty Print prints Markdown rendered, or saves it as PDF. Print or Save as PDF here runs it when it's installed.
It also stays out of the way of what VS Code already does well: pasting a URL over selected text makes a link, and paths are completed and links checked by VS Code itself. Nifty Markdown's completions switch on where VS Code's are off or where your Git host's anchors differ from GitHub's, and its link checks step aside if you turn on markdown.validate.enabled. Folding of headings, lists and code also comes from VS Code.
Commands
| Command |
What it does |
Nifty Markdown: Create or Update Table of Contents |
Insert a TOC at the cursor, or update the existing one |
Nifty Markdown: Update Table of Contents |
Update the existing TOC |
Nifty Markdown: Add Section Numbers / Remove Section Numbers |
Number headings (1., 1.1., …) or take the numbers off |
Nifty Markdown: Toggle Bold / Italic / Strikethrough / Inline Code / Link / Blockquote |
Add or remove the formatting |
Nifty Markdown: Toggle Task Checkbox |
Tick or untick tasks, or turn lines into tasks |
Nifty Markdown: Make Heading Bigger (Remove #) / Make Heading Smaller (Add #) |
Change the heading level of the line |
Nifty Markdown: Renumber Ordered List |
Renumber the list at the cursor |
Nifty Markdown: Paste Image |
Save the clipboard image and insert a link to it |
Nifty Markdown: Check Links in This File / Check Links in Workspace |
Check links now |
Nifty Markdown: Format Table (with Nifty Text) |
Format the table at the cursor with Nifty Text |
Nifty Markdown: Print or Save as PDF (with Nifty Print) |
Print the file with Nifty Print (desktop) |
Settings
| Setting |
Default |
What it does |
nifty.markdown.toc.levels |
2..6 |
Heading levels in the TOC |
nifty.markdown.toc.listStyle |
- |
-, *, + or 1. for TOC entries |
nifty.markdown.toc.updateOnSave |
true |
Update the TOC when saving |
nifty.markdown.slugStyle |
github |
Anchors like github, gitlab, azure or bitbucket |
nifty.markdown.sectionNumbers.levels |
(TOC levels) |
Heading levels to number |
nifty.markdown.lists.keys |
true |
Enter, Tab, Shift+Tab and Backspace in lists |
nifty.markdown.lists.renumber |
true |
Renumber ordered lists after list edits |
nifty.markdown.lists.renumberOnEdit |
true |
Also renumber after pasting, deleting or moving lines in a list |
nifty.markdown.boldMarker / italicMarker |
** / * |
Markers the toggles use (__ / _ also possible) |
nifty.markdown.image.folder |
images |
Folder for pasted images; relative to the file, or ${workspaceFolder}/… |
nifty.markdown.image.fileName |
${documentBasename}-${date}-${time} |
Name pattern for pasted images |
nifty.markdown.image.askForName |
false |
Ask for a name on each paste |
nifty.markdown.image.altText |
fileName |
Alt text from the file name, or empty |
nifty.markdown.completion.enabled |
auto |
Path and #heading completions: auto, on, off |
nifty.markdown.validate.enabled |
auto |
Link checks: auto (off only if VS Code's own are on), on, off |
nifty.markdown.validate.ignore |
[] |
Globs of link targets not to check |
nifty.markdown.validate.severity |
warning |
error, warning or information |
nifty.markdown.math.enabled |
true |
```math and $`…`$ in the preview |
nifty.markdown.math.dollars |
auto |
$…$ / $$…$$: auto (when the editor has no built-in math), on, off |
nifty.markdown.math.brackets |
false |
Also \(…\) and \[…\] |
nifty.markdown.math.macros |
{} |
KaTeX macros |
Coming from Markdown All in One
Most habits carry over. The differences: the formatting shortcuts are on Alt (Alt+B, Alt+I) so Ctrl+B keeps toggling the side bar; the TOC lives between <!-- toc --> markers (an existing unmarked TOC is still found and updated); <!-- omit from toc --> works the same; and $…$ math is left to VS Code's built-in support, with ```math blocks added.
Install
- VS Code: search for "Nifty Markdown" in the Extensions view, or install from the Visual Studio Marketplace.
- Cursor, Windsurf, VSCodium, Kiro, Antigravity: install from Open VSX.
Privacy
This extension collects no telemetry, needs no account and makes no network requests. Pasted images and math are handled on your machine.
- Nifty Mermaid: Mermaid Diagram Preview & Export: Mermaid diagrams with no account: live preview beside .mmd files and Markdown, diagrams in the Markdown preview, syntax highlighting, and export to SVG or PNG. (Open VSX)
- Nifty Rewrap: Hard-Wrap Comments & Markdown: Alt+Q rewraps the comment, docstring or Markdown paragraph at the cursor to your ruler, keeping comment markers, JSDoc tags and list indents. Optional auto-wrap while typing. (Open VSX)
- Nifty SQL: SQL Formatter for 20 Dialects: Format SQL in 20 dialects, including dbt and Jinja templates, with your team's settings. (Open VSX)
- Nifty XML: XPath, Formatter & XML to JSON: Evaluate XPath with namespaces, copy the XPath of any element, format, minify, check well-formedness and convert XML to JSON. (Open VSX)
- Nifty YAML: Formatter, Validator & Converter: Format YAML without losing comments (Kubernetes-style indents), sort keys, lint with yamllint, copy the key path, and convert to and from JSON. (Open VSX)
- Nifty Beautify: Format HTML in PHP, Blade & Twig: Format HTML inside PHP, Blade, Twig, Jinja, Handlebars, ERB and Liquid templates without breaking the template tags. (Open VSX)
See all 100+ Nifty extensions and web tools at https://getnifty.dev
| |