news 2026/9/14 20:40:52

Milkdown 缩进:三步把 Tab 默认值调到位

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Milkdown 缩进:三步把 Tab 默认值调到位

Milkdown 缩进:三步把 Tab 默认值调到位

【免费下载链接】milkdown🍼 Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown

你在用 Milkdown 写嵌套列表时发现,Tab 键插出的缩进和导出的 Markdown 对不上:单独用 indent 插件是两个空格,换 Crepe 预设又变成四个。默认值为什么是 2、又为什么会被改,本文会讲清楚,并带你三步把 Tab 缩进改成自己的习惯。

它是怎么工作的

indent 插件由两个片组成:配置片 indentConfig 和快捷键片 indentPlugin,源码在 index.ts。配置片存两个值:type 决定插入空格还是制表符,size 决定空格数量,默认值是{ type: 'space', size: 2 }。快捷键片负责响应 Tab 键。

接下来看执行链路。indentPlugin 是用 $shortcut 可组合器创建的,见 $shortcut.ts:编辑器 keymap 就绪后,它把 Tab 的处理函数注册进 ProseMirror keymap。按下 Tab 时,处理函数从上下文读出 indentConfig,交给 updateIndent 构造事务。

注意一个容易误解的点:updateIndent 不移动列表节点,它只在光标处插入文本。关键源码就两行:const text = options.type === 'space' ? Array(options.size).fill(' ').join('') : '\t',然后tr.insertText(text, to)。这意味着“缩进”是文本层面的字符,不是节点层面的层级变化。而 Crepe 构建器在内部把 size 更新成了 4,见 builder.ts 中的ctx.update(indentConfig.key, ...)。同一套编辑器在不同入口缩进表现不一致,根源就在这里。

三步跑通

第1步:装上依赖并启用 indent 插件

Tab 缩进不随核心自动生效,插件必须显式挂载。配置如下:

npm install @milkdown/kit
import { Editor } from '@milkdown/kit/core' import { indent } from '@milkdown/kit/plugin/indent' Editor.make().use(indent).create()

验证方法:光标放到行首按 Tab,应插入 2 个空格。

第2步:把空格数改成 4

在 .config() 里用 ctx.set 覆盖配置片,整段如下:

import { indentConfig } from '@milkdown/kit/plugin/indent' Editor .make() .config((ctx) => ctx.set(indentConfig.key, { type: 'space', size: 4 }) ) .use(indent) .create()

验证方法:按 Tab 后导出 Markdown,行首应为 4 个空格。

第3步:换成制表符缩进

如果团队规范用制表符,只改 type 一个字段:

ctx.set(indentConfig.key, { type: 'tab', size: 1 })

验证方法:导出 Markdown,行首是 \t 而不是空格。

把默认值换成你自己的

可配置项一共两个,全部列在这里:

配置名默认值说明
type'space'缩进字符,空格或制表符
size2每次插入的空格数,仅 type 为 'space' 时生效

完整配置示例,把缩进单位定为 4 个空格:

import { Editor } from '@milkdown/kit/core' import { indent, indentConfig } from '@milkdown/kit/plugin/indent' const indentRule = { type: 'space', size: 4 } // 每按一次 Tab 插 4 个空格 Editor .make() .config((ctx) => ctx.set(indentConfig.key, indentRule)) .use(indent) .create()

踩坑记录

现象:按 Tab 没有任何反应。原因:编辑器没挂载 indent 插件,Tab 上没有绑定处理函数。 修复:

Editor.make() .use(indent) .create()

现象:type 设成 'tab' 后,size 怎么改都不生效。原因:tab 分支固定插入一个 '\t',size 只参与空格拼接。 修复:

// 想控制插入数量,只能用空格 ctx.set(indentConfig.key, { type: 'space', size: 4 })

现象:用 Crepe 创建后,默认缩进是 4 空格而不是 2。原因:Crepe 构建器内部把 size 更新成了 4。 修复:

const cur = builder.editor.action(ctx => ctx.get(indentConfig.key) ) console.log(cur) // 先读生效值,再决定要不要覆盖

速查清单

  • 用 .use(indent) 启用 indent 插件
  • 配置走 ctx.set(indentConfig.key, ...)
  • 默认 2 空格,Crepe 下为 4 空格
  • Tab 只在光标处插字符,不移动节点
  • size 只对空格类型生效

如果想给缩进换一套快捷键,可以结合 ProseMirror 的 keymap 插件再绑一组按键。更多配置说明见 docs/api/plugin-indent.md。

【免费下载链接】milkdown🍼 Plugin driven WYSIWYG markdown editor framework.项目地址: https://gitcode.com/GitHub_Trending/mi/milkdown

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 20:39:22

在 Rancher Desktop 中禁用默认 CNI 并安装 Cilium 的完整配置指南

在 Rancher Desktop 中禁用默认 CNI 并安装 Cilium 的完整配置指南 【免费下载链接】cilium eBPF-based Networking, Security, and Observability 项目地址: https://gitcode.com/GitHub_Trending/ci/cilium 本文是一份基于 Cilium 官方安装文档整理的实战指南&#xf…

作者头像 李华
网站建设 2026/9/14 20:39:15

小米L50M5-AD电视硬件维修实战:电源板、eMMC与LVDS故障精修指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 20:37:45

Vue3结构化电子病历编辑器:合规、可计算、可回溯的临床表单系统

简介:这是一份面向前端开发者与医疗信息化学习者的Vue3实战项目源码,聚焦电子病历编辑器这一垂直场景,解决医疗文档结构化编辑、富文本交互与跨平台桌面集成等核心需求。资源共28个文件,涵盖7个JSON(配置与数据模板&am…

作者头像 李华
网站建设 2026/9/14 20:37:29

Flutter与鸿蒙融合:any_base库实现高效ID转换

1. 项目背景与核心价值在鸿蒙生态快速发展的当下,跨平台开发框架Flutter与鸿蒙系统的融合成为开发者关注的热点。any_base作为Flutter生态中优秀的进制转换库,能够实现任意进制之间的数值转换,这为构建轻量级ID生成系统提供了数学基础。传统U…

作者头像 李华
网站建设 2026/9/14 20:36:37

大数据诊断性分析:10个核心技巧与实战案例

1. 大数据诊断性分析概述大数据诊断性分析是通过对海量数据进行深度挖掘和分析,识别数据中的模式、异常和关联关系,从而发现业务问题根源的一种分析方法。与传统的描述性分析不同,诊断性分析更注重"为什么"而非"是什么"&…

作者头像 李华
网站建设 2026/9/14 20:35:57

LangChain与LangGraph 1.0:AI智能体开发的革命性升级

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华