图像化目录 / Markdown / 树形图切换工具
开箱即用:Indentree
纯前端静态站:无构建步骤、无后端、无登录——文件不离开浏览器(本地存储只用来记住主题、面板宽度和树形符号)。
三视图实时互转
- Markdown(中间):Ace 编辑器 + vim 键位(
i插入 /Esc普通模式 /hjkl、yy、p、u等),状态条显示当前模式 - 大纲(左侧):Notion 式可拖拽列表,行内改名、增删、缩进、多选、整体拖拽
- 树形图(右侧):只读的分支结构预览,符号与长度可自定义
三个视图都是同一棵「中间树」的投影:任一视图的改动都会回流到中间树,再刷新其余视图。
Markdown 往返保真
- 行内语法原样保留:
**粗体**、`代码`、[链接](url) - 叶子块保真:代码围栏、缩进代码块、表格、HTML 块整块保留,不被拆成行
- 无法用 Markdown 表达的操作会被拒绝并提示(例如把标题拖到层级更深的标题之上),而不是悄悄改坏文档
大纲编辑
- 双击改名;Enter 新建同级;Tab / Shift+Tab 缩进 / 取消缩进;Backspace 删除空节点
- 拖拽排序:落点分 上 / 内 / 下 三区——拖到行中间是「成为子节点」,拖到边缘是「同级前 / 后」
- 多选:checkbox 点选、Shift 连选(同父约束),选中后整体拖拽或批量删除
- 撤销:改名 / 排序 / 缩进 / 新建 / 删除 / 拖拽落点全覆盖
手机 / 触屏
- 窄屏自动切单栏,顶部与底部都有视图切换
- 空白处单击取消选择,双击在末尾新建条目
- 拖拽时底部浮出「🗑 拖到此处删除」通栏;批量删除有二次确认
- 右上角「+」动作菜单:在末尾新建条目 / 撤销 / 删除选中项
其他
- 树形图自定义:分支 / 末分支 / 竖线 / 横线符号与长度、三套预设、「复制分享链接」(设置写进 URL)、设置本地保存
- 三栏面板:拖拽 gutter 调宽、推到底收起、点侧边小标签恢复、布局本地保存
- 主题三态:跟随系统 / 浅色 / 深色,Ace 编辑器联动
- 错误行级标红:Markdown 解析失败时状态条给出行号,并在编辑器里标红该行
| 场景 | 按键 | 作用 |
|---|---|---|
| 大纲行 | Enter |
进入行内编辑 |
| 大纲行 | 双击 | 进入行内编辑 |
| 行内编辑 | Enter |
提交并在其后新建同级节点 |
| 行内编辑 | Tab / Shift+Tab |
缩进 / 取消缩进 |
| 行内编辑 | Backspace(内容为空) |
删除该节点 |
| 行内编辑 | Esc |
提交并退出编辑 |
| 大纲 | Delete / ⌘⌫(Mac) |
删除选中项(批量) |
| 大纲 | Esc |
取消选择 / 关闭菜单与确认条 |
| 大纲 | ⌘Z |
撤销上一步大纲操作 |
| 大纲空白处 | 单击 / 双击 | 取消选择 / 在末尾新建条目 |
| Markdown | vim 键位 | i Esc hjkl yy p u… |
行内编辑框 / Markdown 栏聚焦时,
⌘Z归输入框自己的文本撤销;要撤销大纲操作请先Esc退出编辑,或用「+」菜单里的撤销。
ES module + vendor/ 静态资源,需要一个 http 服务(不能直接 file:// 打开):
python3 -m http.server 8000
# 浏览器打开 http://127.0.0.1:8000/index.html 页面接线(DOM / 存储 / 事件),不放进 src/
src/*.mjs 纯函数模块(解析、序列化、树操作、选择、拖拽几何、撤销栈、面板布局…)
test/*.test.mjs node:test 单元测试
vendor/ 第三方静态资源(Ace、SortableJS),附来源与用法说明
docs/ 架构决策(ADR)与 agent 约定
.scratch/indentree/ 需求 spec 与逐票实现记录
node --test # 单元测试- Markdown 表达边界:少数方向正确的操作无法用 Markdown 表达(如把标题拖到更深层标题之上)会被拒绝并提示——这是格式边界,不是拖拽缺陷
- 撤销栈:只跟踪大纲侧改动;在 Markdown 栏改过文本后会清空(避免回滚掉文本区的改动);不做重做