首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Zed IDE 官宣:全新「彩虹括号」,又一次吊打了 VS Code?

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

作者头像
GoLang学习记
发布2026-02-27 13:11:52
发布2026-02-27 13:11:52
760
举报

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

“以前看 Lisp 代码像解摩斯密码,现在?像在看霓虹灯管搭的乐高。” —— 一位刚从 7 层嵌套回调中逃生的前端工程师


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

彩虹括号效果示例:每层嵌套一个颜色,一眼定位匹配关系
彩虹括号效果示例:每层嵌套一个颜色,一眼定位匹配关系

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

比如这段 Rust:

代码语言:javascript
复制
fnmain(){

let x =foo(bar(baz(1,2),qux()),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 的:

代码语言:javascript
复制
("(" @open ")" @close)
("[" @open "]" @close)
("{" @open "}" @close)
("<" @open ">" @close)
;; …省略 closure 和泛型
(("\"" @open "\"" @close) (#set! rainbow.exclude))  ; ← 这行关键!排除字符串引号

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

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

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

  1. 把缓冲区(buffer)按 50 行一块 划分;
  2. 只对当前编辑器可见的块执行 Tree-sitter 括号查询;
  3. 每块独立计算嵌套深度 → 颜色错位风险被限制在块边界(50 行 ≈ 屏幕 1~2 屏,几乎无感);
  4. 编辑时只更新变动块,滚动时懒加载新块。

✅ 优点: - 内存占用低 —— 无需整棵语法树 - 启动快 —— 滚动到哪算到哪 - 远程开发友好 —— 和本地一致(靠 buffer 同步)


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

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

代码语言:javascript
复制
pubstructTreeSitterData{

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

    brackets_by_chunks:Vec<Option<Vec<BracketMatch<usize>>>>,

}

pubstructBracketMatch<T>{

pub open_range:Range<T>,// 左括号位置

pub close_range:Range<T>,// 右括号位置

pub color_index:Option<usize>,// 颜色序号:0=蓝, 1=橙, 2=绿...

}
  • 数据存在 Buffer,不在 Editor → 多窗口/分屏共享,不重复计算
  • 修改时立刻失效,渲染时才重查 → 编辑流畅不卡顿
  • 复用主题配色 → 7 种“强调色”循环,自动适配深色/浅色主题

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

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

代码语言:javascript
复制
fnmain«1()1» «1{

let a = one«2(«3()3», «3{ «4()4» }3», «3()3»)2»;

for i in0..a «2{

println!«3("{i}")3»;

}2»

}1»

«n…n» 表示该对括号应被标为第 n 号颜色(1~7 循环) → 测试直接“看图说话”,精准验证嵌套逻辑是否正确!


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

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

  1. Cmd + , 打开设置
  2. 搜索 Colorize Brackets
  3. 可:
    • ✅ 全局开启 / 按语言单独开(比如只给 Rust、JS 开)
    • ✅ 排除特定括号(如 "',默认已排除)
    • ✅ 通过主题定制 7 种颜色
Zed 设置界面:Colorize Brackets 开关与语言粒度控制
Zed 设置界面:Colorize Brackets 开关与语言粒度控制

🔮 未来展望:不止于 ()[]{}

Zed 已预留扩展能力:

  • HTML/JSX 标签配对( / )技术上已支持,只需在 brackets.scm 中声明 → 下一版本或由社区贡献!
  • 更多 Tree-sitter 查询缓存化(借“分块缓存”框架复用

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

代码语言:javascript
复制
分块懒加载 + Tree-sitter 局部查询 → 大文件不卡

🎁 Zed 用 3 年时间,把一个“看似简单”的需求,打磨成兼顾性能、架构与用户体验的典范。 它再次证明:好工具,不在于堆功能,而在于用对的方法,解决真实的痛。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang学习记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔍 一、什么是「彩虹括号」?—— 给括号穿上彩虹衣
  • 🛠️ 二、技术挑战:为什么“彩虹括号”没那么容易实现?
  • 🌲 三、核心技术:Tree-sitter + Chunked Query —— 小而美的组合拳
    • 🧩 智能分块:性能的秘密武器
  • ⚙️ 四、数据结构设计:极简但高效
  • 🧪 五、测试方法也硬核:可视化断言 + 深度嵌套验证
  • 🎛️ 六、如何开启?高度可定制!
  • 🔮 未来展望:不止于 ()[]{}
  • ✅ 总结:一次克制而优雅的工程实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档