你不会为了自己付出的真心而感到后悔

“以前看 Lisp 代码像解摩斯密码,现在?像在看霓虹灯管搭的乐高。”

  —— 一位刚从 7 层嵌套回调中逃生的前端工程师

一、什么是「彩虹括号」?—— 给括号穿上彩虹衣

  Zed IDE 官宣:全新「彩虹括号」,又一次吊打了 VS Code?

  简单说: 不同嵌套层级的括号,自动用不同颜色高亮 。

  比如这段 Rust:

  

  1 fnmain{

  2 letx=foo(bar(baz(1 ,2 ),qux),3 );

  3}

  → 最外层 { } 是 蓝色 ,

  → foo(…) 是 橙色 ,

  → bar(…) 是 绿色 ,

  → baz(…) 是 紫色 ……

  颜色轮换,层级分明 ,再也不用靠数括号或靠 IDE 高亮“临时成对”来猜匹配关系!

   小知识:

  此功能被 Zed 用户“蹲守” 超过 3 年 —— 是 Zed 史上请求量最高的功能

二、技术挑战:为什么“彩虹括号”没那么容易实现?

  乍一听:不就是给括号染个色? 但真正落地,要跨过三座大山:

  方案

  问题

依赖语言服务器(LSP)

  LSP 协议压根没定义“括号配对/嵌套深度”这类信息;且 90% 的语言服务器不提供此能力 → 不可扩展

照搬 VS Code 方案

  VS Code 为实现它, 在内存中维护整棵语法树 → 大文件卡顿、内存飙升 → 不适合 Zed 架构

Zed 的选择

   只查询 当前可见区域 的括号; 拆成小“块”(chunks)懒加载; 复用现有 Tree-sitter 查询体系

   关键洞察:

  用户不需要“绝对精确”的全局嵌套深度——

  只要 局部视觉区分清晰 ,哪怕深处分界处颜色错一位, 人眼也几乎察觉不到 。

  “够用就好”的工程哲学,让性能与体验双赢。

   三、核心技术:Tree-sitter + Chunked Query —— 小而美的组合拳

  Zed 早已用 Tree-sitter 做语法高亮、大纲生成等。

  而每个语言扩展,都自带一个 brackets.scm 查询文件,比如 Rust 的:

  ("(" @open ")" @close)("[" @open "]" @close)("{" @open "}" @close)("" @close);; …省略 closure 和泛型(("\"" @open "\"" @close) (#set! rainbow.exclude)) ; ← 这行关键!排除字符串引号

   这里 ( #set ! rainbow.exclude) 就是 告诉彩虹括号:“引号别染色,免得干扰阅读” 。

智能分块:性能的秘密武器

  Zed 不再“全文件扫描”,而是:

      把缓冲区(buffer)按 50 行一块 划分;

      只对 当前编辑器可见的块 执行 Tree-sitter 括号查询;

      每块独立计算嵌套深度 → 颜色错位风险被限制在块边界 (50 行 ≈ 屏幕 1~2 屏,几乎无感);

      编辑时只更新变动块,滚动时懒加载新块。

   优点:

  - 内存占用低 —— 无需整棵语法树

  - 启动快 —— 滚动到哪算到哪

  - 远程开发友好 —— 和本地一致(靠 buffer 同步)

四、数据结构设计:极简但高效

  核心新增两个字段,放在 Buffer (Zed 的文档模型)里:

  

  1 pubstructTreeSitterData{

  2 chunks:RowChunks,// 行号分块管理器

  3 brackets_by_chunks:VecOptionVecBracketMatchusize>>>>,

  4}

  5 pubstructBracketMatchT>{

  6 pubopen_range:RangeT>,// 左括号位置

  7 pubclose_range:RangeT>,// 右括号位置

  8 pubcolor_index:Optionusize>,// 颜色序号:0=蓝, 1=橙, 2=绿...

  9}

   数据存在 Buffer,不在 Editor → 多窗口/分屏共享,不重复计算

   修改时立刻失效,渲染时才重查 → 编辑流畅不卡顿

   复用主题配色 → 7 种“强调色”循环,自动适配深色/浅色主题

五、测试方法也硬核:可视化断言 + 深度嵌套验证

  Zed 团队用一种“可视化测试标记法”验证彩虹逻辑:

  

  1 fnmain1 1 1 {

  2 leta=one2 (3 3, 3 { 4 4 }3, 3 3)2;

  3 foriin0 ..a 2 {

  4 println!3 ("{i}")3;

  5 }2

  6 }1

  → n…n 表示该对括号应被标为第 n 号颜色(1~7 循环)

  → 测试直接“看图说话”,精准验证嵌套逻辑是否正确!

六、如何开启?高度可定制!

  默认 关闭 (避免打扰旧用户),手动开启:

    Cmd + ,

      打开设置

      搜索 Colorize Brackets

      可:

   全局开启 / 按语言单独开(比如只给 Rust、JS 开)

   排除特定括号(如 " ' ,默认已排除)

   通过主题定制 7 种颜色

  Zed IDE 官宣:全新「彩虹括号」,又一次吊打了 VS Code? 未来展望:不止于 {}

  Zed 已预留扩展能力:

   HTML/JSX 标签配对 ( / )技术上已支持,只需在 brackets.scm 中声明 → 下一版本或由社区贡献!

   更多 Tree-sitter 查询缓存化 (借“分块缓存”框架复用

总结:一次克制而优雅的工程实践

  维度

  Zed 方案亮点

性能

  分块懒加载 + Tree-sitter 局部查询 → 大文件不卡

架构

  复用现有 brackets.scm + Buffer 缓存 → 低侵入

体验

  颜色轮换 + 排除干扰项 + 主题融合 → 美观不刺眼

扩展性

  分块框架可复用 → 为未来功能铺路

   Zed 用 3 年时间,把一个“看似简单”的需求,打磨成 兼顾性能、架构与用户体验的典范 。

  它再次证明: 好工具,不在于堆功能,而在于用对的方法,解决真实的痛。