f1d046fad1
Six new executeCommand entries — the cheap surgical edits that account for the bulk of vimwiki users' daily keymap traffic. Heavier commands (table.align/moveColumn/insert, list.changeSymbol/changeLevel/renumber/ removeDone, link.normalize, colorize) are deferred for a follow-up since each needs its own structural rewriter. CommandOutcome split: - `Edit(WorkspaceEdit)` — server applies via apply_edit. - `Value(Value)` — returned verbatim to the client (used by read-only queries like nextTask). - execute_command handler in lib.rs dispatches both cases. New commands: - nuwiki.list.toggleCheckbox — [ ] ↔ [X]; mid-states snap to [X]; rejected reverts to [ ]. - nuwiki.list.cycleCheckbox — [ ] → [.] → [o] → [O] → [X] → [ ]; rejected resets to [ ]. - nuwiki.list.rejectCheckbox — toggle the [-] rejected marker. - nuwiki.list.nextTask — returns Location of the first unfinished task after the cursor; wraps to the start of the doc when none found below. Only items with checkboxes count. - nuwiki.heading.addLevel — = → ==; clamps at 6. - nuwiki.heading.removeLevel — == → =; clamps at 1 (no-op on h1). Pure ops: - ops::toggle_state / cycle_state / reject_state — checkbox state transitions. - ops::checkbox_edit / next_task / heading_change_level — end-to-end edit producers. Tests drive these directly without spinning up a Backend. - ops::rewrite_heading_with_level — text-level rewrite preserving the leading whitespace that marks a centered heading (lives outside the heading span, so the edit doesn't touch it). - ops::find_list_item_at / find_checkbox_span / item_in_list — AST + source-text helpers, pub for downstream tooling. Tests (21 new): - State transitions: round-trip, progression, dash toggle. - checkbox_edit: empty → done, partial → cycle, reject path, no-op on plain item, no-op off list, nested-sublist resolution. - heading_change_level: h2→h3, level-6 cap, h3→h2, h1 no-op, off-heading no-op, span boundary semantics. - next_task: first-unfinished, wrap-around, all-done returns None, plain items ignored. - COMMANDS list ↔ handler match. All 211 prior tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
85 lines
2.7 KiB
Markdown
85 lines
2.7 KiB
Markdown
# nuwiki
|
||
|
||
A Vim/Neovim plugin providing full vimwiki syntax support, implemented as a
|
||
Rust-based language server (LSP).
|
||
|
||
> **Status:** v1.0 (Phases 0–10) shipped — parsing, highlighting, navigation,
|
||
> editor glue, and release pipeline are all live. v1.1 (Phases 11–19) in
|
||
> progress, closing the gap to a full vimwiki replacement: tags, diary,
|
||
> server-side edit commands, link health, HTML export commands, multi-wiki,
|
||
> and the `:Vimwiki*` keymap layer.
|
||
|
||
See [`SPEC.md`](./SPEC.md) for the full project specification.
|
||
|
||
## Implementation status
|
||
|
||
### v1.0 — foundation
|
||
|
||
| Phase | Name | Status |
|
||
|---|---|---|
|
||
| 0 | Scaffolding | ✅ done |
|
||
| 1 | Core AST | ✅ done |
|
||
| 2 | Syntax Plugin Interface | ✅ done |
|
||
| 3 | Vimwiki Lexer | ✅ done |
|
||
| 4 | Vimwiki Parser | ✅ done |
|
||
| 5 | Renderer | ✅ done |
|
||
| 6 | LSP Foundation | ✅ done |
|
||
| 7 | Semantic Tokens | ✅ done |
|
||
| 8 | Navigation | ✅ done |
|
||
| 9 | Editor Glue | ✅ done |
|
||
| 10 | CI/CD release pipeline | ✅ done |
|
||
|
||
### v1.1 — full vimwiki replacement
|
||
|
||
| Phase | Name | Status |
|
||
|---|---|---|
|
||
| 11 | Plumbing prerequisites | ✅ done |
|
||
| 12 | Tags | ✅ done |
|
||
| 13 | Workspace edits + executeCommand | ✅ done |
|
||
| 14 | List & table edit commands | ✅ done (focused subset; table/list-renumber/colorize deferred) |
|
||
| 15 | Link health + TOC/index generation | ⏳ |
|
||
| 16 | Diary | ⏳ |
|
||
| 17 | HTML export commands | ⏳ |
|
||
| 18 | Multi-wiki | ⏳ |
|
||
| 19 | Editor glue v2 (`:Vimwiki*` compat, keymaps, text objects, folding) | ⏳ |
|
||
|
||
## Repository layout
|
||
|
||
```
|
||
nuwiki/
|
||
├── Cargo.toml workspace root
|
||
├── crates/
|
||
│ ├── nuwiki-core/ parser, AST, renderer (no editor deps)
|
||
│ ├── nuwiki-lsp/ LSP protocol bridge
|
||
│ └── nuwiki-ls/ binary that speaks LSP over stdio
|
||
├── plugin/ universal Vim/Neovim entry point
|
||
├── lua/nuwiki/ Neovim Lua glue
|
||
├── autoload/nuwiki/ Vim VimL glue
|
||
├── ftdetect/ filetype detection for .wiki
|
||
├── ftplugin/ per-buffer filetype settings
|
||
├── syntax/ static fallback highlighting
|
||
├── doc/ `:h nuwiki`
|
||
├── scripts/ build-time helpers
|
||
└── .gitea/workflows/ CI / release pipelines
|
||
```
|
||
|
||
## Building
|
||
|
||
```sh
|
||
cargo build --workspace
|
||
cargo test --workspace
|
||
```
|
||
|
||
MSRV: Rust 1.83.
|
||
|
||
## License
|
||
|
||
Dual-licensed under either of:
|
||
|
||
- Apache License, Version 2.0 ([`LICENSE-APACHE`](./LICENSE-APACHE))
|
||
- MIT license ([`LICENSE-MIT`](./LICENSE-MIT))
|
||
|
||
at your option. Unless you explicitly state otherwise, any contribution
|
||
intentionally submitted for inclusion in this work shall be dual licensed as
|
||
above, without any additional terms or conditions.
|