TaskPaper language support for Zed:
syntax highlighting, @done/@cancelled fading, and outline navigation via
a tree-sitter grammar, plus a lightweight language server (taskpaper-ls)
for due-date awareness, live task counts, and one-keystroke task workflows.
- Task — a line starting with
-. - Project — a non-task line ending with
:(trailing tags allowed). - Note — any other non-blank line.
- Tags — a trailing, whitespace-preceded run of
@name/@name(value)at the end of a line. Mid-line@words(emails, handles) are plain text. - Nesting — tab indentation nests an item under the item above.
Shortcuts below are written for macOS; on Linux and Windows use ctrl
wherever they say cmd.
- Highlighting — projects as titles, notes dimmed, tags and values distinctly colored.
@done/@cancelledfading — tagged items and their entire subtree (any depth) fade into the theme's ghost style, distinct from note dimming. The state tag stays legible:@donemuted blue,@cancelledmuted amber. Task bullets act as pseudo-checkboxes: accent colored while open, faded when closed.- Outline — projects (only) appear in the outline panel and
cmd-shift-o, nested as in the document, shown by bare name. - Folding — indentation-based folding works out of the box (a
@donesubtree folds like any other indented block).
From the language server (all passive once installed):
- Due-date diagnostics — open items with
@due/@startdates in the past get a warning ("due (3 days overdue)"); items due today, or tagged@today, get an info. The project diagnostics panel (cmd-shift-m) thereby doubles as a "what needs attention" view across all files. - Inlay hints — live task counts after every project heading
(
Home: 3 open) and countdowns after future@duetags (in 3 days). Enable inlay hints in settings:"inlay_hints": {"enabled": true}. - Hover — hover a project for its count breakdown, or a
@due/@done/@cancelledtag for relative dates. - Code actions (
cmd-.on any line):- Mark/Remove
@done(stamps today's date) and@cancelled— the toggle, operating on the buffer, unsaved changes and all. - Archive finished items — moves every finished subtree to a top-level
Archive:project (created on demand, newest at top), stamping each with a@project(Parent / Child)breadcrumb so the parent chain is preserved — the same convention as the TaskPaper 3 app. - Sort children by
@dueand task ↔ note conversion.
- Mark/Remove
- Tag completion — type
@for tag names ranked by workspace usage; inside@due(get date suggestions (today / tomorrow / next week). - Tag rename — rename a
@tagacross the whole workspace. - Project search — projects across all
.taskpaperfiles in the open-symbols picker. - Formatting —
editor: format(or format-on-save) strips trailing whitespace, converts leading spaces to tabs, and normalizes tag spacing.
In Zed: zed: extensions, search for TaskPaper, install. Open any
.taskpaper file.
The first time a .taskpaper file is opened, the extension resolves the
taskpaper-ls binary in this order:
lsp.taskpaper-ls.binary.pathfrom your Zed settings, if set;- a
taskpaper-lson the worktree's PATH; - otherwise it downloads the binary for your platform from this repo's GitHub releases and caches it. Prebuilt binaries cover macOS, Linux, and Windows on both x86-64 and arm64.
Everything except the language server features works without that download.
To run from a checkout instead — zed: extensions → Install Dev Extension → select the clone. Build the server with pixi run build-lsp
and put taskpaper-ls on your PATH (or point
lsp.taskpaper-ls.binary.path at it).
The Mark @done code action is one keystroke away via cmd-.. For a
dedicated key, bind the code-action menu (zed: open keymap):
[
{
"context": "Editor && extension == taskpaper",
"bindings": {
"alt-d": "editor::ToggleCodeActions"
}
}
]Overdue and due-today items surface automatically in the diagnostics
panel (cmd-shift-m), across every file in the project. For ad-hoc tag
filtering use buffer search (cmd-f) or project search (cmd-shift-f)
for @due, @due(2026-07, etc.
- Faded, not struck through: Zed theme syntax styles have no strikethrough.
- Tag values cannot contain
)or newlines; nested parentheses make the run plain text. - Tags are recognized only at the end of a line (stricter than TaskPaper 3, by design).
See MAINTAINER.md. MIT licensed.