docs: describe the six-plugin layout after the split

README: replace the single-deft.so install instructions with the per-feature
plugin table (palette, switch, radial, acme, sam, plumb), a glob install loop,
and a note that the plugins cooperate by resolving each other's actions by
object name; refresh the layout tree (plugin/ gone, switch/ added, palette/ and
radial/ now hold their plugins) and mark milestones 5 and 6 DONE.

PLAN.md: add an architecture note at the top flagging the split and that the
design prose below refers to the former monolith as historical.
This commit is contained in:
Levi Neely 2026-10-08 19:56:11 +02:00
parent d8f0225178
commit ed3bd4249b
2 changed files with 77 additions and 23 deletions

View File

@ -51,23 +51,41 @@ QT_QPA_PLATFORM=offscreen ./build/bin/test_fuzzyranker # run the matcher tests
ctest --test-dir build # or via ctest
```
## Install the plugin into Kate
## Install the plugins into Kate
The plugin builds to `build/bin/kf6/ktexteditor/deft.so`. Drop it where
Kate scans for KTextEditor plugins (a user path on `QT_PLUGIN_PATH`):
Deft is **one `.so` per feature**, not a monolith. The build produces six
KTextEditor plugins under `build/bin/kf6/ktexteditor/`:
| Plugin file | Display name | Feature |
|------------------|-----------------------|---------|
| `deft_palette.so`| `[deft:util] palette` | Command palette (`Alt+X` / M-x) over every window action + the `:`-verbs + the switchers, frecency-ranked |
| `deft_switch.so` | `[deft:util] switch` | Project **Go to File** (`Alt+P`) and **Go to Symbol** (`Alt+G`) |
| `deft_radial.so` | `[deft:util] radial` | Radial caret menu (`Alt+R` / right-mouse) |
| `deft_acme.so` | `[deft:nineify] acme` | Acme editing gestures (line keys, pair selection, mouse chords) |
| `deft_sam.so` | `[deft:nineify] sam` | `sam`-style structural regular expressions |
| `deft_plumb.so` | `[deft:nineify] plumb`| Plan 9 plumber (open under cursor) |
Drop whichever features you want where Kate scans for KTextEditor plugins (a
user path on `QT_PLUGIN_PATH`):
```sh
install -D build/bin/kf6/ktexteditor/deft.so \
~/.local/lib/x86_64-linux-gnu/qt6/plugins/kf6/ktexteditor/deft.so
for so in build/bin/kf6/ktexteditor/deft_*.so; do
install -D "$so" ~/.local/lib/x86_64-linux-gnu/qt6/plugins/kf6/ktexteditor/"$(basename "$so")"
done
```
Then in Kate: Settings → Configure Kate → Plugins → enable
**Deft**. Press **Alt+X** (M-x) to open the command palette;
type to filter, Enter or click to run. Open the editing **radial menu** either
by pressing **Alt+R** (opens at the caret) or by **pressing the right mouse
button** in the editor (opens at the pointer; the normal context menu is
suppressed while this is enabled). Move toward a slice and release — or click;
a branch slice (marked ▸) opens a submenu, the centre hub goes back/cancels.
Then in Kate: Settings → Configure Kate → Plugins → enable each **`[deft:…]`**
plugin you installed. Press **Alt+X** (M-x) to open the command palette; type to
filter, Enter or click to run. Open the editing **radial menu** either by
pressing **Alt+R** (opens at the caret) or by **pressing the right mouse button**
in the editor (opens at the pointer; the normal context menu is suppressed while
this is enabled). Move toward a slice and release — or click; a branch slice
(marked ▸) opens a submenu, the centre hub goes back/cancels.
The plugins cooperate but do not depend on one another: palette's "Go to
File/Symbol" entries and radial's launcher slices resolve `switch`'s actions by
object name at runtime, so each `.so` works on its own and simply gains those
entry points when its sibling is also enabled.
## Status
@ -79,16 +97,26 @@ See [docs/PLAN.md](docs/PLAN.md) for the full roadmap.
- **Milestone 2 — custom palette widget: DONE.** `PaletteModel` +
`PaletteWidget` (frameless popup, live filtering, highlighted matches,
keyboard + mouse activation). 10 model unit tests, all green.
- Milestone 3 — KTextEditor plugin + M-x: **DONE.** Loadable `deft.so`;
`Alt+X` opens the palette over every action in the window's GUI clients.
- Milestone 3 — KTextEditor plugin + M-x: **DONE.** `Alt+X` opens the palette
over every action in the window's GUI clients.
- Milestone 4 — radial caret menu: **DONE (first increment).** Multi-level
radial menu at the caret (`Alt+R`) or at the pointer via a **right-mouse
gesture**, mouse-driven selection, config tree with per-radial key + mouse
triggers. Free-form stroke gestures next.
- Milestone 5 — command vocabulary + project-as-directory + switchers: next.
- Milestone 5 — command vocabulary + project-as-directory + switchers: **DONE.**
`:`-verb pack, project file (`Alt+P`) and symbol (`Alt+G`) switchers over an
async, cached index.
- Milestone 6 — one `.so` per feature: **DONE.** The monolithic plugin is split
into six independent KTextEditor plugins (`palette`, `switch`, `radial`,
`acme`, `sam`, `plumb`), tagged `[deft:util]` / `[deft:nineify]`, cooperating
by resolving each other's actions by object name at runtime.
## Layout
Shared building blocks are static libraries (`fuzzy`, `palette`, `project`,
`commands`, …); each feature is a self-contained KTextEditor plugin that links
the libraries it needs.
```
CMakeLists.txt top-level KF6/Qt6/ECM project
src/
@ -98,20 +126,33 @@ src/
palette/
palettemodel.{h,cpp} ranked, filterable list model (headless)
palettewidget.{h,cpp} frameless command-palette popup
test_palettemodel.cpp QTest suite
frecencystore.{h,cpp} persisted frecency ranking
paletteplugin.{h,cpp} [deft:util] palette — M-x, :-verbs, switcher doors
paletteplugin.json plugin metadata
test_*.cpp QTest suites
switch/
switchplugin.{h,cpp} [deft:util] switch — Go to File (Alt+P) / Symbol (Alt+G)
switchplugin.json plugin metadata
radial/
radialmodel.{h,cpp} radial tree + hit-test geometry (headless)
radialmenu.{h,cpp} frameless multi-level radial widget
radialconfig.{h,cpp} JSON → radial tree + built-in default
test_radialmodel.cpp QTest suite
test_radialconfig.cpp QTest suite
radialplugin.{h,cpp} [deft:util] radial — caret menu plugin
radialplugin.json plugin metadata
test_*.cpp QTest suites
commands/
texttransforms.{h,cpp} pure text transforms (headless)
olliecommands.{h,cpp} ":"-verb KTextEditor::Command pack
test_texttransforms.cpp QTest suite
plugin/
ollieplugin.{h,cpp} KTextEditor::Plugin + M-x + radial wiring
ollieplugin.json plugin metadata
olliecommands.{h,cpp} ":"-verb KTextEditor::Command pack (used by palette)
test_*.cpp QTest suites
project/
projectindex / symbolindex / projectindexer / kateprojectbridge
async, cached file & symbol index (used by switch)
acme/
acmeplugin.{h,cpp,json} [deft:nineify] acme — editing gestures
sam/
sam* + samplugin.{h,cpp,json} [deft:nineify] sam — structural regexps
plumb/
plumb* + plumbplugin [deft:nineify] plumb — Plan 9 plumber
docs/
PLAN.md goal, constraints, roadmap
```

View File

@ -1,5 +1,18 @@
# Plan — kate-custom
> **Architecture note (current):** The suite has been split into **one `.so` per
> feature** — `deft_palette`, `deft_switch`, `deft_radial`, `deft_acme`,
> `deft_sam`, `deft_plumb` — each a standalone `KTextEditor::Plugin` tagged
> `[deft:util]` / `[deft:nineify]`. See the README's plugin table for the
> current layout. The design prose below predates that split and still refers to
> the former monolith (`OlliePlugin` / `OllieView`, a single `olliepalette.so`,
> and the `olliepalette/` config dir); read those names as historical. In the
> split suite the palette plugin owns the M-x launcher and the `:`-verbs, the
> switch plugin owns the file/symbol switchers and the project index, each plugin
> keeps its own `FrecencyStore` file under `deft/`, and the doors cooperate by
> resolving each other's actions by object name at runtime rather than by direct
> calls or link dependencies.
## Goal
Build a suite of Kate plugins that make the editor usable without menus, tuned