Highlight text with custom search terms, regular expressions and badges in the editor, reading view and PDF export, and highlight all matches of the selected word.
Highlight text in your notes with your own search terms and regular expressions, turn placeholders such as =TODO= into badges, and see every occurrence of the word under the cursor.
Highlighters work in the editor, and optionally in reading view and exported PDFs.
=(TODO)= renders as a TODO badge without the equals signs. In live preview the equals signs reappear while the cursor is inside.Code blocks, inline code, math and front matter are never highlighted.
Open Settings → Dynamic Text Highlighting and add a highlighter with the plus button. Each highlighter has these options:
| Option | Description |
|---|---|
| Name | Shown in the list of highlighters. |
| Enabled | Turn a single highlighter on or off. |
| Search | Text to find, or a regular expression. |
| Regular expression | Treat the search as a JavaScript regular expression. |
| Case sensitive | Match upper and lower case exactly. |
| Style | Background, badge, text color, wavy underline, or none (CSS class only). |
| Color | Color of the highlight. Text on backgrounds and badges switches between dark and light automatically. |
| Show only the first capture group | Regular expressions only. Hide the rest of the match. |
| Named groups as CSS classes | Regular expressions only. In the editor, a named group (?<name>...) gets its name as CSS class. |
| Highlight whole line | Tint the entire line of a match in the editor. |
| Reading view and PDF export | Also highlight in rendered notes. |
| CSS class | Extra class on every match, for styling with a CSS snippet. |
Drag highlighters to reorder them. When matches overlap in reading view, the highlighter higher in the list wins.
New installations start with three badge highlighters as an example:
| Name | Search | Style | Color |
|---|---|---|---|
| TODO badge | =(TODO)= |
Badge | Yellow |
| FIXME badge | =(FIXME)= |
Badge | Orange |
| DONE badge | =(DONE)= |
Badge | Green |
Chapter 3 =TODO= add sources
The formula is not correct yet =FIXME=
| Purpose | Search | Settings |
|---|---|---|
| Priority badges | =(P[1-3])= |
Regex, badge, first capture group, reading view |
| Filler words | \b(basically|actually|very)\b |
Regex, wavy underline |
| Repeated spaces | {2,} |
Regex, background |
| Dates in ISO format | \d{4}-\d{2}-\d{2} |
Regex, text color |
| A name you want to spot | Jane Doe |
Background |
Regular expressions with lookbehind, such as (?<=x), do not work on iOS versions older than 16.4.
Every match has the classes dth-match and dth-style-<style> and, if set, the highlighter's CSS class. Set --dth-background and --dth-foreground to override the colors, for example with a gradient badge:
.priority-high {
--dth-background: linear-gradient(135deg, #ff2d87 0%, #7b2ff7 100%);
--dth-foreground: #ffffff;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.35);
}
With Highlight whole line, the line gets dth-line and <css class>-line. Selection matches use dth-selection-match and, for the occurrence at the cursor, dth-selection-match-main.
dynamic-highlights-import. Enable it under Settings → Appearance → CSS snippets.Selection settings are not imported. Dynamic Highlights applied the highlighter color through generated CSS; the imported highlighters use the style Background with the same color instead.
a b does not match a **b**.The plugin works entirely offline. It makes no network requests and collects no data. It only reads files inside your vault configuration folder when you import from Dynamic Highlights, and only writes a CSS snippet there during that import.
main.js, manifest.json and styles.css from the latest release.<your vault>/.obsidian/plugins/dynamic-text-highlighting/.Requires Obsidian 1.13.0 or later.
Inspired by Dynamic Highlights by NothingIsLost, which is no longer listed in the community plugins directory. This plugin is a separate implementation and does not contain its code.