尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Milkdown嵌套列表:Tab缩进调整指南
Milkdown嵌套列表Tab缩进调整指南【免费下载链接】milkdown Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown当你正在用 Milkdown 编辑嵌套列表、想调整某一项的缩进层级时多半会先去找缩进字符其实不需要。Milkdown 里嵌套列表的缩进Indent由按键直接完成在列表项内按 Tab 降级按 ShiftTab 升级。下面先跑通这套默认行为再拆解它背后的 keymap 机制最后讲清文本缩进与列表快捷键的配置方法。用Tab和ShiftTab调整嵌套层级最小可用配置只有两行引入 core 和 commonmark 预设其余什么都不用写。import { Editor, rootCtx } from milkdown/core import { commonmark } from milkdown/preset-commonmark const root document.createElement(div) document.body.append(root) const editor Editor.make() .config((ctx) ctx.set(rootCtx, root)) .use(commonmark) .create()这段代码创建了一个挂载到 root 节点的编辑器commonmark 预设已经把列表节点和快捷键一并注册好。在文档里输入-触发 input rule文本就变成无序列表项回车输入第二项后把光标停在任一项里按键即可按 Tab当前列表项降级变成上一项的子列表。按 ShiftTab当前列表项升级回到上一层。也可以按 Mod-] 和 Mod-[分别对应降级和升级。Mod 在 Mac 上是 Cmd其他平台是 Ctrl。这套快捷键定义在 packages/plugins/preset-commonmark/src/node/list-item.ts 的 listItemKeymap 里属于 commonmark 预设的一部分不需要额外 use 任何插件。⚠️ 注意如果你还加载了 milkdown/plugin-indent它也会监听 Tab用于在光标处插入空格文本。同一按键被多个插件绑定时注册在前的处理器先执行谁先返回 true 谁消费这次按键。所以Tab 到底插文本还是调层级取决于插件加载顺序。Tab如何变成一次列表降级命令你可能会注意到按 Tab 后文档里的缩进并不是真的插入了制表符而是列表结构本身变了。这一步的关键在于 listItemKeymap 把快捷键映射到了命令上源码长这样export const listItemKeymap $useKeymap(listItemKeymap, { // ... SinkListItem: { shortcuts: [Tab, Mod-]], command: (ctx) { const commands ctx.get(commandsCtx) return () commands.call(sinkListItemCommand.key) }, }, LiftListItem: { shortcuts: [Shift-Tab, Mod-[], command: (ctx) { const commands ctx.get(commandsCtx) return () commands.call(liftListItemCommand.key) }, }, // ... })逐块看$useKeymap 接收一张默认快捷键表把它存进一个 ctx slice允许用户后续用 ctx.set 覆盖同时内部调用 $shortcut把每个快捷键注册进全局的 KeymapManager。KeymapManager 在 packages/core/src/internal-plugin/keymap.ts 里实现。它把同一按键下的所有处理器按 priority 排序缺省值为 50再用 chainCommands 串起来依次执行谁先返回 true 谁就消费掉这次按键。sinkListItemCommand 和 liftListItemCommand 只是对 ProseMirror 提供的 sinkListItem、liftListItem 做了包装。以降级为例sinkListItem 找到光标所在的 list_item 节点把它从当前列表拆出包进一个内层列表挂到上一个兄弟项下。换句话说Tab 按下后并没有发生插入字符编辑器改的是文档树节点被移到了更深的父级里序列化成 Markdown 时才体现为两格缩进。默认快捷键一览均定义在 listItemKeymap 中快捷键作用绑定命令Tab / Mod-]列表项降级sinkListItemCommandShift-Tab / Mod-[列表项升级liftListItemCommandBackspace / Delete唯一子项时退出列表liftFirstListItemCommand这里有个容易忽略的细节——列表外的 Tab 不归 commonmark 管此时轮到 indent 插件出场。packages/plugins/plugin-indent/src/index.ts 里的 $shortcut 同样绑定了 TabupdateIndent 会按配置在光标处插入一段空格或一个制表符不改动列表结构。空格还是Tab缩进字符与快捷键的选择这一步的关键在于两个可覆盖的 ctx sliceindentConfig 控制文本缩进listItemKeymap.ctx 控制列表快捷键。它们加上 priority基本就是 Milkdown indent插件配置 与列表 keymap 的全部可调面。缩进字符与尺寸indentConfig默认是{ type: space, size: 2 }即列表外按 Tab 插入 2 个空格。想改成 4 个空格在初始化时这样设置ctx.set(indentConfig.key, { type: space, size: 4, })改动后在列表外按 Tab 会插入 4 个空格。type 换成tab时size 表示制表符个数通常取 1。列表快捷键listItemKeymap.ctx默认绑定可以整表覆盖。比如想让 Tab 只用于文本缩进把列表降级挪到 Mod-]ctx.set(listItemKeymap.ctx.key, { Enter: { shortcuts: Enter }, SinkListItem: { shortcuts: Mod-] }, LiftListItem: { shortcuts: Mod-[ }, LiftFirstListItem: { shortcuts: Backspace }, })注意 ctx.set 是整体替换四个键要写全漏掉的键会丢到 $useKeymap 的默认值之外等于该快捷键失效。优先级priority当多个处理器抢同一个键时可以给某条绑定加 priority数值越大越先执行SinkListItem: { shortcuts: [Tab, Mod-]], priority: 100 }把三项组合起来下面是一份端到端的完整配置。它把列表降级收拢到 Mod-]让 Tab 在全文档内只负责插入一个制表符import { Editor, rootCtx } from milkdown/core import { commonmark, listItemKeymap } from milkdown/preset-commonmark import { indent, indentConfig } from milkdown/plugin-indent const root document.createElement(div) document.body.append(root) Editor.make() .config((ctx) { // 挂载节点 ctx.set(rootCtx, root) // 缩进配置制表符 ctx.set(indentConfig.key, { type: tab, size: 1 }) // 列表快捷键覆盖 ctx.set(listItemKeymap.ctx.key, { Enter: { shortcuts: Enter }, SinkListItem: { shortcuts: [Mod-]], priority: 100 }, LiftListItem: { shortcuts: [Mod-[] }, LiftFirstListItem: { shortcuts: [Backspace] }, }) }) .use(commonmark) .use(indent) .create()运行后输入两个列表项效果如下一级列表项二级列表项光标停在二级列表项中按 Mod-]它会移到上一项之下一级列表项二级列表项此时按 Tab 不再改变层级只在光标处插入一个制表符。到这里结构归 Mod 组合键字符归 Tab嵌套列表的缩进调整就各归其键了。【免费下载链接】milkdown Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

OmniRoute Kiro 多账号配置指南:利用 AWS SSO OIDC 客户端隔离解决会话冲突

OmniRoute Kiro 多账号配置指南:利用 AWS SSO OIDC 客户端隔离解决会话冲突

OmniRoute Kiro 多账号配置指南:利用 AWS SSO OIDC 客户端隔离解决会话冲突 【免费下载链接】OmniRoute Never stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works…

📅 2026/9/14 19:28:23
Pydantic AI 实时会话遇到 Gemini 会话上限断开怎么配置重连恢复

Pydantic AI 实时会话遇到 Gemini 会话上限断开怎么配置重连恢复

Pydantic AI 实时会话遇到 Gemini 会话上限断开怎么配置重连恢复 【免费下载链接】pydantic-ai How Python does AI. Agents, realtime voice, image generation, embeddings. Every model, every interface, typed end to end. 项目地址: https://gitcode.com/GitHub_Trendi…

📅 2026/9/14 19:28:23
iii 创建 Worker 完全指南:以 Worker 为单位扩展 iii 系统的核心能力

iii 创建 Worker 完全指南:以 Worker 为单位扩展 iii 系统的核心能力

iii 创建 Worker 完全指南:以 Worker 为单位扩展 iii 系统的核心能力 【免费下载链接】iii Effortlessly compose, extend, and observe every service in real-time for the first time ever. 项目地址: https://gitcode.com/GitHub_Trending/mo/iii 在 iii…

📅 2026/9/14 19:28:23
MORE NEWS

更多资讯

📰

Flutter开发OpenHarmony平台Python学习助手实践

1. 项目背景与设计理念作为一名长期从事移动应用开发的工程师,我最近完成了一个使用Flutter框架为OpenHarmony平台开发的Python基础语法学习助手。这个项目的初衷源于我观察到市面上大多数编程学习应用存在两个极端:要么过于复杂,让初学者望而…

📰

HarmonyOS ScrollBar滑动距离骤变问题分析与优化

1. 项目概述:ScrollBar滑动距离骤变问题现象最近在HarmonyOS 6应用开发中,不少开发者反馈ScrollBar组件存在一个棘手问题:当快速滑动列表时,滚动条会出现跳跃式位移,而非平滑跟随内容滚动。这个问题在长列表场景尤为明…

📰

原生响应式前端骨架:CSS自定义属性+Flexbox+data驱动

简介:这是一套面向前端初学者与课程设计者的现代响应式网页模板源码,适用于企业官网、作品集展示或毕业设计等实际开发场景,帮助用户快速掌握HTML5、CSS3及JavaScript在真实项目中的协同应用。压缩包共48个文件,包含18张高清JPG图…

📰

高汇MT5中文路径读取失败的三层根因与实战修复

1. 问题本质与真实场景还原“高汇MT5读取中文路径文件失败”——这绝不是一句模糊的报错提示,而是实打实卡住交易员、策略开发者、量化工程师日常工作的硬伤。我接触过至少37个真实案例:有人把EA放在D:\策略\日内突破\高汇专用\下,MT5启动后直…

📰

TTNRBO优化DBN回归预测:MATLAB实现与工业应用

1. 项目概述:TTNRBO优化DBN回归预测的核心价值在工业预测和数据分析领域,我们常常面临这样的困境:传统机器学习模型对复杂非线性关系的捕捉能力有限,而深度神经网络又容易陷入局部最优解。这正是我选择研究瞬态三角牛顿-拉夫逊优化…

📰

Milkdown嵌套列表:Tab缩进调整指南

Milkdown嵌套列表:Tab缩进调整指南 【免费下载链接】milkdown 🍼 Plugin driven WYSIWYG markdown editor framework. 项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown 当你正在用 Milkdown 编辑嵌套列表、想调整某一项的缩进层级时&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬