English | 简体中文
Notion 风格的 Obsidian 块编辑插件:块手柄、拖拽排序、多选、块类型转换、分栏与块颜色。仅桌面端。
块手柄:鼠标悬停或光标所在块的左侧显示六点拖拽手柄(Notion 样式),对应块浅色高亮
拖拽排序:拖动块出现浮动预览与插入指示线(宽度取编辑器行宽);拖到编辑区上下边缘自动滚动;拖到列表 / 引用 / Callout 正文右侧变为其子块(缩进 4 个字符,可用「缩进步长」调整),向左拖出自动降级缩进;拖到普通段落 / 标题右侧时自动把目标转为列表项(- 前缀)并把被拖块缩进为其子项(Markdown 下只有列表项有父子结构);拖到目标块左 / 右边缘快速与它合成两栏分栏;按住 Alt 拖拽 = 复制到落点;支持跨分屏拖到其他文档(移动 = 目标插入 + 源删除,Alt 同样为复制;同一文件的分屏按文档内移动处理)
拖入分栏新增一栏:把文本块(或 Shift 多选的一组块)拖进分栏,该块成为新的一栏。落点分三档,按优先级判定:① 两栏之间的插入带(指针距中缝 18px 内,命中即画竖线 + 参照栏描边)→ 插在两栏之间;② 栏的右半区 → 插到该栏之后;③ 栏的左半区 → 插到该栏之前。多行分栏时插入带按行独立计算(落在第 2 行的带只增加该行栏数);最右栏右半区 = 追加到行末。Alt = 复制到新栏、源块保留
把栏拖出分栏:按住栏顶 ⠿ 手柄拖到分栏区间外的任意位置(显示横向插入线),该栏剥掉引用前缀后成为普通块。指针落在某行的上半插到该行之前、下半插到该行之后,因此每一行都有两个可选落点;拖到文末则追加在最后。落在分栏自身范围内(栏之间)不显示落点,那是栏间换序。剩余栏不足 2 栏时自动降级为「取消分栏」,整段还原为普通段落;被拖出栏的宽度按比例分给剩余栏。Alt = 复制到落点、栏仍保留
拖动动作提示:拖动时浮动预览上实时显示松手将执行的动作——移动 / 缩进为子块 / 复制(Alt)/ 移动到其他文档 / 复制到其他文档(Alt)/ 分栏 · 左 / 分栏 · 右,不会出现落点提示时(拖回自身等)不显示
多选:Shift + 点击手柄把块加入 / 移出选区,可整组拖动、删除、复制、批量转换类型;Esc 退出多选
块菜单:点击手柄弹出菜单——18 种类型互转(代码块带 30 种语言子菜单、Callout 带 26 种类型子菜单)、折叠块展开 / 折叠切换、上/下方插入块、复制块内容 / 生成块 ID / 引用其他块…、创建副本(副本不带块 ID)、上移 / 下移、块颜色(设置 / 清除)、分栏(组合为分栏 / 添加分栏 / 添加一栏 / 追加一行 / 取消分栏)、本块字数、删除(标题为删除整段)
斜杠命令:正文输入 / 模糊搜索(子序列匹配 + 相关度排序,中英文可混查)快速转换块类型,或插入媒体嵌入(图片 / 音频 / 视频 / PDF,从仓库选择附件;代码块内自动禁用)
块 ID:生成易拼写的 ^block-id(正确处理代码块 / 列表等结构化块 ID 独立成行的规则)、复制块链接、图形化「引用其他块…」(选笔记 → 选块 → 插入 [[笔记#^id]] 链接)、一键清除全文块 ID(带确认框,防误触)
分栏:Shift 多选相邻块后菜单「组合为分栏」(按空行切段,每段一栏);阅读视图并排显示;Live Preview 渲染为并排分栏,点击展开为源码编辑,点击外部自动收回;支持多行分栏(「追加一行」,宽度按 60-40 / 60-40/50-50 分配)与栏内编辑(拆分一栏 / 合并右栏 / 插入一栏 / 行上移 / 行下移);外壳可写 gap= radius= valign= border 覆盖默认外观,子栏可写 bg= bg-dark= 设背景色;分栏块菜单还支持「添加一栏」「取消分栏」,可整体拖动 / 删除 / 跨文档搬运;栏可拖入新块、拖出为普通块(实时预览自渲染分栏下生效,见上文两条拖拽说明)
嵌套列表转分栏:「组合为分栏」按空行切段,而列表项之间通常没有空行 → 嵌套列表另给两个按缩进层级切分的入口(块菜单):列·父项(每个一级列表项各成一栏,其下子行跟随)、列·子项(每个二级列表项各成一栏,要求整段只有一个父项)。按子项切分时父项作为分栏前的引导段单独成行,不并入任何一栏(父项统领全部子项,塞进某一栏会误导归属)。切分只看缩进层级,- 与 1. 有序列表同样适用;列表项内嵌的代码围栏不参与切点判定。栏数不足 2 或形态歧义时菜单项置灰
块颜色:任意块可设置背景色(预设色板 / 原生取色器 / 自定义 hex);hex 浅色自动推导深色主题配色与正文对比色,深浅主题自动跟随
链接打开位置:内部链接 [[...]] 可配置在当前标签页 / 新标签页 / 分屏 / 新窗口打开;Ctrl/Cmd+点击等修饰键行为不受影响
命令面板:Alt+↑/↓ 移动块、缩进 / 反缩进、打开块菜单、生成块 ID、引用其他块…、重复当前块、设置 / 清除块颜色、清除块 ID,以及每种类型独立的「转换为」命令
设置 → Block Editor:
| 设置项 | 默认 | 说明 |
|---|---|---|
| 显示块手柄 | 开 | 关闭后仅保留命令与斜杠入口 |
| 手柄跟随光标 | 开 | 关闭后仅在鼠标悬停时显示手柄 |
| 块悬停高亮 | 开 | 悬停时给手柄对应的块加一层浅色高亮背景 |
| 高亮颜色 | 跟随主题 | 自定义悬停高亮背景色;留空跟随当前主题的悬停色 |
| 高亮透明度 | 0.55 | 悬停高亮背景的透明度(0~1) |
| 实验:实时预览自渲染分栏 | 开 | 开启后实时预览中分栏由插件自渲染(双击进入编辑);关闭时显示原生嵌套 callout |
| 启用斜杠命令 | 开 | / 建议开关 |
| 拖拽自动滚动 | 开 | 拖到边缘自动滚动 |
| 缩进步长 | 自动 | 固定空格数或自动检测全文最小缩进;同时决定拖动嵌套插入的缩进(自动时为 4) |
| 点击链接时的打开位置 | 当前标签页 | 点击内部链接 [[...]] 时在哪里打开;Ctrl/Cmd+点击等修饰键行为不受影响 |
| 默认栏间距 | 10 px | 分栏外壳未写 gap= 参数时的栏间距 |
| 默认圆角 | 8 px | 分栏外壳未写 radius= 参数时的栏圆角 |
| 默认垂直对齐 | 拉伸(等高) | 分栏外壳未写 valign= 参数时的栏垂直对齐方式 |
| 默认边框 | 关 | 分栏外壳未写 border 参数时是否显示栏边框 |
| 手柄尺寸 | 20 px | 编辑器左侧块手柄的大小 |
| 拖拽阈值 | 4 px | 按住手柄拖动的判定位移,小于该位移视为点击弹出块菜单 |
npm install # 安装依赖
npm run dev # 监听构建(开发时用)
npm run build # 类型检查 + 生产构建 → main.js
npm test # 行为对照测试(未登记用例对照 scripts/legacy-main.cjs)
npm run test:update # 有意变更行为后重新生成预期差异基线 scripts/parity-baseline.json
npm run test:columns # 分栏双向拖拽落点判定回归(纯 Node,无需 Obsidian 环境)
npm run test:cmview # CMView 运行时形状回归(dispatch 在视图自身,无 .view 包装)
npm run test:extract # 栏拖出回归(状态机顺序守卫 + 端到端 markdown 结构 + 单步撤销)
npm run test:columns-list # 嵌套列表转分栏回归(切分 / 剥缩进 / 围栏感知 / 产物往返一致性)
npm run test:columns-list:mutation # 变异测试:确认上一套断言非恒真(3 个变异须全部被抓获)
本项目基于 MIT 许可证开源,你可以自由使用、修改和分发,只需保留原始版权与许可声明。
Copyright (c) 2026 MarcBolo
许可证全文见 MIT License。