Kilo JetBrains 插件 Markdown 渲染对齐 VS Code 样式:架构分析与实施指南
【免费下载链接】kilocodeKilo is the all-in-one agentic engineering platform. Build, ship, and iterate faster with the most popular open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kilocode
本指南以仓库内规划文档 .kilo/plans/jetbrains-mdview-vscode-styling.md 为核心骨架,系统讲解 Kilo 开源项目如何让 JetBrains 插件中的助手/用户对话 Markdown 输出在视觉上对齐 VS Code webview 的 Markdown 样式,同时保留 JetBrains 侧Swing/JBHtmlPane + 编辑器支撑代码块的既有架构。读完本文,你将掌握:VS Code Markdown 样式在 Kilo 前端各包中的分布与主题令牌映射规则、JetBrains 侧MdViewHybrid/MdCommon的渲染与样式生成原理、以及一套完整的"样式令牌扩展 → CSS 规则镜像 → 代码块容器打磨 → 测试验证"实施步骤,可直接对照仓库源码逐条落地。
一、方案背景与目标
Kilo 的 JetBrains 插件(packages/kilo-jetbrains/)在会话转录中渲染 Markdown,其目标是让助手/用户转写的视觉体验与 VS Code webview 中渲染出的 Markdown 保持一致。方案的核心约束是:不推翻 JetBrains 侧现有的 Swing 渲染架构,而是在Swing/JBHtmlPane(HTML 排版)+EditorTextField(代码块)的框架内,把样式规格逐条对齐到 VS Code。
文档给出的 Goal 原文是:在保留现有架构的前提下,改进 JetBrains Markdown 输出,使其与 VS Code webview 的 Markdown 样式在视觉上匹配(见 jetbrains-mdview-vscode-styling.md)。
二、VS Code 侧 Markdown 样式的构成(Findings)
2.1 样式文件分布
方案文档指出,VS Code 的 Markdown 样式分散在四个地方:
- packages/ui/src/components/markdown.css:基础 Markdown 组件样式;
- packages/kilo-ui/src/components/markdown.css:kilo-ui 包对基础样式的覆盖与代码块滚动条细节;
- packages/kilo-ui/src/styles/vscode-bridge.css:VS Code 主题桥,把语义设计令牌映射到
--vscode-*CSS 变量; - 以及 message-part 覆盖规则(在 webview 各消息部件中对 Markdown 做的局部覆盖)。
也就是说,VS Code 侧"长得什么样"并不是一张写死的样式表,而是基础排版 + 覆盖 + 主题桥三层叠加的结果。JetBrains 侧要做的对齐,本质上是对这套分层结果的等价复刻。
2.2 VS Code 基础排版规格
从 packages/ui/src/components/markdown.css 可以看到 VS Code 侧 Markdown 的具体规格,方案文档将其归纳为:
- 基础文本:14px 无衬线字体(
--font-size-base)、160% 行高、break-word换行、首尾子元素外边距清零(> *:first-child { margin-top: 0 }/> *:last-child { margin-bottom: 0 }); - 标题:六个级别同尺寸(14px)、中粗字重(
--font-weight-medium)、靠颜色与下边距区分(margin-bottom: 24px); - 段落:12px 底部间距(
p { margin-bottom: 12px }); - 链接:使用交互色(
--text-interactive-base),默认无下划线,悬停时下划线并偏移 2px; - 列表:紧凑外边距、弱化的列表标记色(
li::marker { color: var(--text-weak) }); - 引用块:弱化文字、2px 左边框、正常字重;
- 水平线:视觉隐藏但保留间隔(
border: none; height: 0; margin: 40px 0); - 代码块:带边框与内边距(
.shiki的 12px padding、6px 圆角、0.5px 边框); - 行内代码:绿色语法色(
--syntax-string)+ 中粗字重; - 表格:浅边框(
--border-weaker-base)、12px 单元格内边距、表头更强调。
2.3 VS Code 主题桥的令牌映射
packages/kilo-ui/src/styles/vscode-bridge.css 在html[data-theme="kilo-vscode"]作用域下,把 Kilo 语义令牌桥接到 VS Code 主题变量。文档指出该桥接的关键映射如下(对应源码 vscode-bridge.css):
| Markdown 角色 | 映射到的 VS Code 令牌 |
|---|---|
| 标题、链接、列表项、图片 | --vscode-textLink-foreground |
| 正文、加粗、代码块 | --vscode-editor-foreground |
| 行内代码 | --vscode-charts-green |
| 引用、强调 | --vscode-descriptionForeground |
| 水平线 | --vscode-panel-border |
这意味着"对齐 VS Code"本质上就是让 JetBrains 侧同一类角色取到等价的颜色来源:JetBrains 用 IntelliJ 主题 API(TextAttributesKey/ColorKey)与集中式语义色来承担同一职责。
三、JetBrains 侧当前渲染架构与差距
3.1 渲染器构成
JetBrains 侧 Markdown 由两层组件完成渲染:
MdViewHybrid:混合渲染器,负责把 Markdown 源文本投影为分块视图(HTML 段落块、表格块、代码块、终端块、图表块),并处理流式追加与块级复用;MdViewHtmlPane:基于JBHtmlPane的 HTML 排版组件,承载正文/表格等富文本内容。
两者的共享 CSS 由MdCommon.rules()生成,默认配色由MdCommon.defaults(style)计算(见 MdCommon.kt)。对外统一暴露的是MdView接口(MdView.kt),它提供set/append/clear、applyStyle、resetStyles、链接监听、以及font/foreground/background/linkColor/codeBg/preBg/preFg/codeFont/quoteBorder/quoteFg/tableBorder/opaque等公开可覆盖属性,overrideSheet()输出当前生效的 CSS 规则字符串。
3.2 当前样式覆盖范围(差距清单)
从 MdCommon.kt 中rules()的实际代码可以看到现状:它只对宽泛的标签统一设置字体/颜色,并单独覆盖链接、pre/code配色、引用块边框与文字色、表格边框。方案文档明确列出了与 VS Code 的差距:
- 缺少 VS Code 等价的间距体系(标题、段落、列表、表格的 margin/padding);
- 缺少标题、加粗、强调、列表标记、表格单元格的分角色规则;
- 行内代码只有前景色、缺少中粗字重;
- 引用块缺少2px 左边框几何 + 8px 左内边距 + 24px 垂直外边距;
- 水平线缺少 VS Code 一致的间隔行为;
- 代码块表面缺少打磨(背景、边框、圆角、内边距、细滚动条)。
3.3 被保留的既有优势
方案文档特别强调一点:JetBrains 的围栏代码块在一个维度上已经强于 VS Code——它使用EditorTextField承载真实 IDE 语法高亮,并在流式输出时保留编辑器实例(MdViewHybrid的append走"fenced-code 快速路径"直接view.grow(delta))。因此方案明确不切换到 web/JCEF 渲染,而是保留并打磨这一优势。这也是后续所有代码块改动的前提。
四、实施方案详解
第 1 步:扩展 Markdown 样式令牌
当前MdStyle数据类(MdCommon.kt)已有foreground/background/linkColor/codeBg/preBg/preFg/codeFont/quoteBorder/quoteFg/quoteBg/tableBorder/headingFg/strongFg/emphasisFg/inlineCodeFg/listMarkerFg/hrColor/tableHeaderFg/codeBorder/opaque。方案要求在此基础上继续扩展内部字段,覆盖:标题、加粗、强调、行内代码前景、列表标记、水平线、表格/表头、代码块边框颜色等维度。
实施要点:
- 公开 API 稳定:除非确有必要新增外部 override,否则保持
MdView公开 override API 不变(MdView.kt 中列出的公开属性就是契约); - 默认值计算集中化:在
MdCommon.defaults(style)中从 IntelliJ/编辑器主题源(如CodeInsightColors.HYPERLINK_ATTRIBUTES、HighlighterColors.TEXT、DefaultLanguageHighlighterColors.LINE_COMMENT、EditorColors.PREVIEW_BORDER_COLOR)以及 Kilo 集中式语义色取值。现有代码中quoteFg取自行注释前景、linkColor取自超链接属性、inlineCodeFg取自SessionUiStyle.View.Markdown.string(),即是这种模式的先例; - 主题可覆盖:使用
JBColor.namedColor("Kilo.Markdown.*", fallback)定义 Kilo 专属 Markdown 调色板回退值,让主题可覆盖、运行时避免散落的硬编码颜色。
第 2 步:在MdCommon.rules()中镜像 VS Code CSS
在MdCommon.rules()(当前实现见 MdCommon.kt)中逐条补齐 VS Code 规则,方案文档给出的完整清单如下:
- 根/主体包裹规则:最大宽度行为、
break-word换行、基础行高、首/尾子元素外边距修剪(在JBHtmlPaneCSS 支持的前提下); - 标题规则:同基础字号、中粗字重、角色专属颜色、行高与底部间距;
- 段落/列表/列表项/嵌套列表/标记规则:若 Swing HTML 不支持
::marker,则回退为li { color: ... }并在支持时重置子文本颜色;否则保持列表文本正常并在测试中记录该限制; - 加粗/强调颜色:对齐 VS Code 令牌角色;
- 锚点样式:主题化链接色、不强制背景、
JBHtmlPane支持处加下划线; - 引用块几何:2px 左边框、24px 垂直外边距、8px 左内边距、弱化文字、正常字重;
- 表格布局:合并边框、尽量全宽、24px 垂直外边距、12px 单元格内边距、弱行边框、更强调的表头文字;
- 水平线:视觉隐藏但保持与 VS Code 一致的间距——
MdViewHybrid目前会过滤主题分割线(thematic breaks),因此该规则主要惠及MdViewHtmlPane与未来复用; - 行内代码:设置前景色与中粗字重;除非当前
JBHtmlPane配置已经能画得可接受,否则避免行内代码背景。
需要说明的是,现有MdCommon.inlineCode()(MdCommon.kt)已经实现了"给<code>注入style="color: ..."前景色"的能力,且MdViewTest中test set renders inline code明确断言生成的 HTML不含background内联样式,这与"行内代码不做背景"的取向一致。
第 3 步:打磨代码块容器(保留 IDE 高亮)
代码块仍是EditorTextField(围栏/缩进块)主用、JBTextArea兜底。方案要求在 MdViewHybrid.kt 的styleCodePane()基础上对齐 VS Code 的markdown-code包裹观感:
- 表面:轻微背景 + 轻微边框 + 可行时采用平台感的圆角弧度(现有
CodePane已通过重写paintComponent用抗锯齿fillRoundRect画可选圆角,弧度为SessionUiStyle.View.BLOCK_ARC,见 MdViewHybrid.kt); - 内边距:约 12px 量级(现有
viewportBorder由SessionUiStyle.View.Code.topPadding()与水平内边距组合); - 滚动条:细水平滚动条行为(现有
SCROLLBAR_HEIGHT = 12,见 SessionUiStyle.kt); - 几何常量集中:优先复用
SessionUiStyle.View.Code,只有现有值无法表达 VS Code 间距时才少量新增; - 边框分离:内部将代码块边框色与表格边框色分离,使表格样式调整不影响代码盒;
- 继续调用
SessionEditorStyle.applyToEditor(ed)(对应 MdViewHybrid.kt 的applyEditorChrome),保证代码块跟随 IDE 语法高亮与编辑器字体变化。
第 4 步:文件/路径的可视性对齐
JetBrains 侧其实已经有非常强的路径识别能力:MdCommon会用正则把散落在正文与行内代码中的文件路径识别出来,包成a.kilo-file-ref链接并保留:行号后缀(见 MdCommon.kt),测试test file refs keep line suffix and trailing punctuation outside link验证了这一行为。MdProjector的代码片段链接器则使用kilo-url-ref类(MdCommon.URL_REF_CLASS)。
在此基础上,方案要求:
- 对
href形似相对文件路径的 Markdown 链接,保持现有链接派发逻辑不变,让现有调用方能按需打开文件/URL; - 仅当现有使用路径可拿到
openFile回调时,才考虑给"看起来像路径的行内代码"装饰file-link类;若当前MdView抽象只有openUrl,则不要扩宽接口; - 最低限度:让行内代码/路径外观更贴近 VS Code——使用行内代码前景色,并对生成的 HTML 中含链接/代码类的显式文件链接使用点状下划线(对应 VS Code 侧
a.file-path-link的dotted下划线样式,见 markdown.css)。
第 5 步:保留既有 Swing 行为
这是防止回归的硬性要求:
MdViewHybrid.sync()的前缀复用逻辑(MdViewHybrid.kt 中"从前往后比对、能复用则update"的分块同步)除非必要否则不动;- 样式更新时只对保留的
JBHtmlPane块调用reloadCssStylesheets()并重新赋值文本(现有HtmlView.style正是先reloadCssStylesheets()再pane.text = html(...),见 MdViewHybrid.kt),而不是重建所有块; - 流式围栏代码快速路径与编辑器释放行为保持原样(
CodeField通过Disposer注册EditorFactory.getInstance()::releaseEditor,避免泄漏)。
第 6 步:聚焦测试与变更集
- 扩展 MdViewTest.kt 与
MdViewHybridTest,断言overrideSheet()包含新的 VS Code 等价规则:标题、加粗/强调、链接、行内代码前景、列表/表格/引用块间距、水平线、以及代码块边框与表格边框的分离; - 为代码块面板样式增加组件测试:背景、视口背景、边框色、内边距、滚动条策略、以及
applyStyle()后保留的编辑器实例; - 保持既有 stress/leak 测试绿色;只有实现改变了样式应用语义时才补充少量压力断言;
- 增加 changeset:
@kilocode/kilo-jetbrainspatch 版本,用户可见描述如Improve markdown readability in JetBrains chat transcripts.。
五、验证方式
方案给出了明确的验证路径(在 packages/kilo-jetbrains/ 目录下执行):
- 先跑定向测试:
./gradlew frontend:test --tests '*MdView*'(若 Gradle 模块支持该过滤);若定向过滤不可靠,则运行./gradlew test; - 类型检查:
bun run typecheck。
仓库现有的测试基建与之对应:MdViewTest基于BasePlatformTestCase获得真实 IntelliJ Application 以便JBHtmlPane正确初始化,并已覆盖set/append渲染、加粗/斜体、行内代码前景色、围栏代码块、链接、文件引用链接化、以及overrideSheet()内容断言(MdViewTest.kt);MdViewHybridTest与MdViewHybridStressTest则覆盖混合渲染器的行为与压力/泄漏场景。
六、约束与边界
方案文档最后明确了三条硬约束,理解这些边界有助于判断改动的影响范围:
- 不引入 JCEF、Compose 或 Kotlin UI DSL——坚持 Swing 渲染,避免为样式对齐付出渲染栈切换的代价;
- 改动收敛在
packages/kilo-jetbrains/与.changeset/内——除非明确需要共享的 Kilo UI 事实来源,否则不扩散到其他包; - JetBrains 与 Kilo UI 路径无需
kilocode_change标记(该标记用于上游 opencode 同步场景,见 script/upstream 相关工具); - 优先使用 IntelliJ 主题 API 与集中式语义令牌,而不是散落的字面颜色——这既是本方案的约束,也是代码库里
MdCommon.defaults()已经在遵守的既有规范。
七、总结
JetBrains 与 VS Code 的 Markdown 视觉对齐,本质是一次"规格翻译":把 VS Code 侧由 markdown.css、kilo-ui markdown.css 与 vscode-bridge.css 共同定义的字号、行高、间距、颜色角色,翻译成 JetBrains 侧MdCommon的 CSS 规则与 IntelliJ 主题令牌取值。方案在不动渲染架构的前提下,通过"扩展MdStyle令牌 → 镜像MdCommon.rules()→ 打磨EditorTextField代码块容器 → 对齐文件路径可视性 → 保留 Swing 行为 → 补测试与 changeset"六步完成落地,并在每一处都优先复用SessionUiStyle.View.Code等集中式常量与JBColor.namedColor主题回退,确保 JetBrains 的对话转写既获得 VS Code 同款的排版秩序,又保住了 IDE 原生语法高亮这一独有优势。对照 jetbrains-mdview-vscode-styling.md 与文中列出的源码文件,即可逐条复现该方案的全部细节。
【免费下载链接】kilocodeKilo is the all-in-one agentic engineering platform. Build, ship, and iterate faster with the most popular open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kilocode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考