vlwkaos16 downloadsMove, indent, fold and edit list items with their children, also across multi-item selections and multiple cursors. Outliner-style list editing with one undo step per action.
Outliner-style list editing for Obsidian. Move, indent, fold and edit list items together with their children, also when several items are selected or several cursors are active. Every action is one undo step.
If you outline in Markdown lists and miss the item handling of an outliner such as Workflowy, Dynalist or Logseq, Listwise makes Obsidian's lists behave that way, without leaving plain Markdown. Your notes stay ordinary lists that any editor can read.
| Key or action | Behavior |
|---|---|
| Tab / Shift+Tab | Indent or outdent every selected item (or the item at every cursor) with its children. Shift+Tab keeps the item on its line; the siblings below it become its children. Shift+Tab on a top-level item turns it into a plain line (with a blank line above it when needed) and moves its children up to the top level |
| Move commands | Move the selected items with their children; at the edge of a parent they move into the neighbouring parent |
| Fold commands | Fold or unfold the selected items (Obsidian's own folds; needs "Fold indent") |
| Enter | Split the item; an empty nested item outdents; an empty top item leaves the list; at the end of an open parent, adds a first child; carries [ ] |
Backspace right after [ ] |
Remove the checkbox, keep a plain item |
| Backspace at content start | Merge into the previous visible line (blank lines between are removed). Children move to the item above. Never a dead key |
| Delete at line end | Join the next visible line, same rules |
| Backspace/Delete on a multi-line selection | Delete, then move orphaned children up to a valid depth and renumber |
| Cmd+Backspace (macOS), word delete | Stop at the content start, never eat the bullet or checkbox |
| ArrowLeft / word-left at content start | Go to the end of the previous visible line (Shift extends) |
| Mod+A | Item, then item with children, then each parent, then the list, then the note |
| Drag a bullet | Move the item (or every selected item) before, after or inside another item. Escape cancels. Desktop only |
Vim o / O |
Insert an item below (after the item's own note lines) or above |
Also:
3. stays 3.) and renumber after every change; 1) lists work too.Following Obsidian's plugin guidelines, Listwise sets no default hotkeys for its commands. Tab, Shift+Tab, Enter, Backspace, Delete and Mod+A work at once; bind the commands in Settings → Hotkeys (search "Listwise"). Suggested keys:
| Command | Suggested key |
|---|---|
| Move list and sublists up / down | Mod+Shift+Up / Mod+Shift+Down |
| Fold / Unfold the list | Mod+Up / Mod+Down |
| Indent / Outdent the list and sublists | (Tab / Shift+Tab already do this) |
| Delete the selected items with their sublists | your choice |
Listwise follows the behavior and conventions of Outliner by Viacheslav Slinko, which many Obsidian users already know. Command ids and setting names match, so hotkeys you bound to Outliner's commands keep their meaning. Disable Outliner before enabling Listwise: both plugins handle the same keys.
Where Listwise behaves differently:
1) lists are supported.Outliner is mature and widely used; Listwise is new. If Outliner already does what you need, there is no reason to switch.
Listwise makes no network requests, collects no telemetry, and reads or writes nothing outside the note you are editing and its own settings.
main.js, manifest.json and styles.css from the latest
release into
<vault>/.obsidian/plugins/listwise/, then enable Listwise.npm install
npm run setup -- <vault> # type-check, build, link into the vault
npm run scenario -- <vault> # real key and mouse scenarios in the running app
scripts/scenario.mjs drives the running Obsidian with the obsidian CLI. Keys and mouse go
through CDP input events. It edits only its own scratch note (Listwise Scenarios.md, or the path
in LISTWISE_SCENARIO_NOTE) and checks that this note is active before every step. The move and
fold scenarios expect the suggested hotkeys above. Scenarios live in scripts/scenarios.mjs.
Set LISTWISE_CAPTURE_DIR to save screenshots from capture steps.
| Path | Role |
|---|---|
src/core/model.ts |
Parse a list block into an item tree, render it back, indent and renumber rules. Pure |
src/core/ops.ts |
List operations on the tree, selection mapping. Pure |
src/editor/context.ts |
Read blocks and folds from CodeMirror; apply results as one transaction |
src/editor/keys.ts, cursor.ts |
Key bindings and the cursor transaction filter |
src/editor/dnd.ts, lines.ts, vim.ts, zoom.ts |
Drag and drop, indentation lines, Vim, Zoom plugin bridge |
src/commands.ts, settings.ts, main.ts |
Obsidian commands, settings tab, plugin entry |
Behavior, command ids and settings follow Outliner (MIT, Viacheslav Slinko), so its users can switch without relearning. Listwise is a separate implementation.