Block Editor

approvedunreviewed

by MarcBolo

Notion 风格块编辑:块手柄、拖拽排序、多选、类型转换与斜杠命令。

★ 4 stars↓ 367 downloadsUpdated 4d agoMIT

Block Editor

English | 简体中文

Notion 风格的 Obsidian 块编辑插件:块手柄、拖拽排序、多选、块类型转换、分栏与块颜色。仅桌面端。

alt text alt text

功能

  • 块手柄:鼠标悬停或光标所在块的左侧显示六点拖拽手柄(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。

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.