PlainTasks
Todo list management with syntax highlighting, interactive code actions to toggle task states, automatic timestamps, and tag completion.
How to install
With Forge Super installed, the button above opens the app on this extension, where you press Install. Nothing is installed until you do.
You can also open the Extensions panel in the app and search for PlainTasks. The extension's id is plaintasks.
Don't have Forge Super yet? Download it here.
README
From the extension's repository, written by its authors and not by Mentenaz. See the source.
PlainTasks for Zed
A Zed extension for managing todo lists with syntax highlighting and interactive task management. Inspired by Todo+ for VSCode and PlainTasks for Sublime Text.
Features
- ✅ Syntax highlighting for
.todo,.tasks, and.taskpaperfiles - ✅ Interactive task management via Language Server Protocol
- ✅ Code actions to toggle task states (Done/Cancelled/Pending)
- ✅ Automatic timestamps when marking tasks complete
- ✅ Tag completion - type
@to see suggestions - ✅ Project outline - navigate between projects via symbol picker
- ✅ Priority tags with special colors (
@critical,@high,@today,@low)
Quick Start
1. Install the Extension
Search for "PlainTasks" in the Zed extensions panel (Cmd+Shift+X).
2. Set Up Keybindings (Required!)
Zed extensions cannot automatically add keybindings - you need to configure them manually.
Open your keymap (Cmd+K, Cmd+S or Zed → Settings → Open Keymap) and add:
Standard Keybindings
[
{
"context": "Editor && language == Todo",
"bindings": {
"alt-d": "editor::ToggleCodeActions",
"alt-c": "editor::ToggleCodeActions"
}
}
]
- Alt+D: Toggle task (Done/Pending)
- Alt+C: Toggle task or Mark as Cancelled
Vim Mode Keybindings
[
{
"context": "Editor && language == Todo && VimControl && !VimWaiting && !menu",
"bindings": {
"+": ["workspace::SendKeystrokes", "o ☐ escape"],
"=": "editor::ToggleCodeActions",
"ctrl-m": "editor::ToggleCodeActions"
}
}
]
+(normal mode): Create new task=(normal mode): Toggle Done/PendingCtrl+M(normal mode): Mark as Cancelled
💡 Tip: The LSP automatically applies the most relevant action based on context, so pressing
=directly toggles tasks without showing a menu!
For more keybinding options, see KEYBINDINGS.md.
Usage
Task Management
Put your cursor on a task and use code actions (or your configured keybindings):
| Current State | Action | Result |
|---|---|---|
☐ Task | Mark as Done | ✔ Task @done(25-12-31 00:30) |
☐ Task | Mark as Cancelled | ✘ Task @cancelled(25-12-31 00:30) |
✔ Task @done(...) | Revert to Pending | ☐ Task |
✘ Task @cancelled(...) | Revert to Pending | ☐ Task |
Tag Completion
Type @ and you'll see suggestions for:
- Common tags:
@today,@high,@medium,@low,@critical - Time tags:
@done,@cancelled,@started,@est,@lasted - Any tags you've already used in the document
File Format
Project Name:
☐ Pending task @today
✔ Completed task @done(25-01-18 14:30)
✘ Cancelled task @cancelled(25-01-18 15:00)
Notes and comments without a symbol
Sub Project:
☐ Nested task @high @est(2h)
Archive:
✔ Old completed task @done(25-01-17 09:00)
Screenshot

Supported File Extensions
.todo,.todos.task,.tasks.taskpaper
How It Works
PlainTasks uses two components:
- Tree-sitter Grammar: Provides syntax highlighting and project outline
- Language Server (LSP): Provides interactive features like code actions and tag completion
The LSP server (plaintasks-lsp) runs automatically when you open a .todo file.
Development
Prerequisites
- Rust installed via rustup (required by Zed for extension development)
- The
wasm32-wasip1target for building the extension
Quick Start
# 1. Setup (one-time)
make setup
# 2. Build and install LSP server
make install-lsp
# 3. Build extension for development
make dev-extension
# 4. Install in Zed
# Open Zed → Extensions (Cmd+Shift+X) → Install Dev Extension → Select this directory
Build Commands
make help # Show all available commands
make setup # Install Rust targets and check dependencies
make build # Build extension (debug) + LSP server
make build-release # Build extension (release) + LSP server
make install-lsp # Build and install LSP to ~/.cargo/bin/
make dev-extension # Build everything for dev extension use
make clean # Remove all build artifacts
Manual Building
If you prefer not to use the Makefile:
# Install the wasm32-wasip1 target
rustup target add wasm32-wasip1
# Build the extension
cargo build --release --target wasm32-wasip1
ln -sf target/wasm32-wasip1/release/plaintasks.wasm extension.wasm
# Build and install the LSP server
cd lsp
cargo build --release
cp target/release/plaintasks-lsp ~/.cargo/bin/
Project Structure
src/extension.rs- Zed extension (WASM component)lsp/- Language Server Protocol implementation (native binary)grammars/todo/- Tree-sitter grammar (separate repo: tree-sitter-todo)languages/todo/- Language configuration
Troubleshooting
Code actions not working?
- Make sure you've added keybindings to your
keymap.json - Check that the file has a
.todoextension - Try restarting Zed (
Cmd+Qand reopen)
Tag completion not showing?
- Type
@and wait a moment - Check if Copilot or other completion providers are overriding it
- Try pressing
Ctrl+Spaceto manually trigger completion
LSP not starting?
- Check Zed's logs:
tail -f ~/Library/Logs/Zed/Zed.log | grep plaintasks - Reinstall the extension
Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
Roadmap
- Tree-sitter grammar with syntax highlighting
- Language Server Protocol implementation
- Code actions for task state management
- Tag completion
- Project outline support
- Archive functionality (move completed tasks)
- Create new task command
- Statistics view (task counts, time tracking)
License
MIT
Acknowledgments
- Inspired by PlainTasks for Sublime Text
- Based on Todo+ for VSCode