Repository navigation
Massive updates and improvements since 0.1.3 (August 2023). The plugin has been rewritten and expanded to integrate with Obsidian's new native footnote features, and provide a comprehensive footnote-editing featureset.
Requires Obsidian 1.13 or newer. Your hotkeys and settings migrate over.
Highlights
- Popup editor. Creating or visiting a footnote opens its text in a small editor right at your cursor. The same hotkey closes it, so you never scroll to the bottom of the note (issue #42). Turn off Edit footnotes in a popup for the classic jump.
- Selection to footnote. Select text and press a footnote key: the numbered key moves it into a new definition, the named key asks for a name, the inline key wraps it in place. Multi-paragraph selections, code blocks, callouts, math, and whole tables travel intact (issue #35).
- Rename footnote. Every reference and the definition take the new name in one step, from the command or the right-click menu, like renaming a variable in a code editor (issue #36).
- A built-in linter. The Lint footnotes command moves references after punctuation, gathers definitions under your footnotes heading or at the bottom, fixes definitions hidden by a missing blank line, alerts on or deletes orphans, alerts on or merges duplicate definitions, and renumbers everything in order of appearance. Every rule is a toggle, and it can run on save or on every footnote creation.
- Per-note footnote prefix. Give each chapter note its own prefix (
[^2-1],[^2-2], …) so footnotes stay unique when the chapters are merged with Longform or Easy Bake (issue #31). The Set footnote prefix command writes it as a note property. - Inline footnotes. Insert inline footnote types
^[]and hops the cursor out on the second press; Insert inline footnote from clipboard wraps what you copied, flattened and escaped (issue #19). - Multiple cursors. Every footnote key works at several carets at once: the same numbered reference everywhere with one definition, or a skeleton at each caret so you type the name or text once.
- Tables. Footnotes from inside a table cell work with the 1.5+ table editor: the reference lands in the cell, the definition below the table (issue #28).
- Mobile. Every command sits on the mobile toolbar with its own icon, the dialogs are Obsidian's own kind of bottom sheet and stay above the keyboard, and the popup works on the phone.
Added
- Insert footnote reference at end of word (on by default): a press mid-word places the reference after the word, past any closing quotes, brackets, or emphasis and the punctuation after them, the placement every major style guide recommends (issue #23; PR #52 by @chrisgrieser).
- Expand selections to whole words (on by default): a sloppy drag still converts cleanly.
- Footnote section heading improvements: any heading level or multi-line markdown, with an optional divider, reused when it already exists in the note (issues #27 and #57; PRs #32 by @cwlls and #47 by @Mase3206).
- New definitions land after the last existing definition or under the section heading wherever it sits, with a blank line separating them from prose (issues #55).
- Trim blank lines toggle: keep or trim the stray blank lines at the end of the note when the first footnote is added (PR #37 by @HyperEpsilon).
- Navigation jumps set a vim jump point (PR #53 by @chrisgrieser) and land the cursor centered in the viewport.
- Consecutive footnotes: pressing the numbered key right after an existing reference inserts the next footnote instead of navigating (issue #49).
- Lint alerts that name every footnote involved: unnamed
[^]references, orphans, hidden definitions, duplicates, names Obsidian can't render or find, and nested footnotes. - A notice when undoing a table-cell footnote has only removed the definition, and whether a second undo removes the reference.
- Hand-drawn icons for every command, a funding link, and an MIT license (issue #58).
Changed
- The numbered command is Insert / navigate numbered footnote (was "Auto-Numbered"); the ids are unchanged.
- Footnote names are case-insensitive, matching Obsidian, and can't contain spaces, backticks, brackets, or
#; the plugin refuses those and tells you why. - Footnotes are never created inside code, math, comments, frontmatter, or another footnote's definition, where they would be invalid (issue #41). A key pressed inside a definition jumps back to the reference instead.
- A
[^x]:line directly under a paragraph is plain text to Obsidian, and the plugin agrees: the linter inserts the blank line it needs. %%comments are read the way Obsidian reads them: a reference inside one is real but hidden, a definition inside a%%block is not.- Linting writes back only the characters that changed, so your cursor and folds stay where they were.
- Any footnote key pressed on a half-built footnote (a named reference without its definition, an inline
^[]still being typed) continues that footnote instead of nesting a new one. - The text-editing commands are inert in Reading view instead of editing the hidden buffer.
- The autosuggest feature is gone: Obsidian has offered footnote suggestions natively since 1.6.
- Settings use Obsidian's declarative settings API (issue #57), with the linter on its own page and the Linter-plugin warning for users of both.
Fixed
- Table corruption when inserting from a cell (issue #28); a crash when the editor had no data (issue #39); the Android load failure (issue #46).
- Dozens of scanner edge cases found by property-based testing and adversarial bug hunts: CRLF notes, fences inside callouts and lists, unclosed fences and comments, escaped and backticked openers, indented and blockquoted definitions, math delimiters, mixed line endings.
For contributors
- Vitest unit suite (1600+ tests) with fast-check property tests and a micromark differential oracle, a live smoke suite driven through the Obsidian CLI, ESLint with the Obsidian guidelines, knip, and Stryker mutation testing. See CONTRIBUTING.md and TESTING.md.
Thanks to everyone who opened issues and sent pull requests since 2023, and to the BRAT testers of the sixteen betas.