我平时主要在 Zed 里写 Rust 和 TypeScript,有一个折腾过很久的痛点:从日志、报错堆栈或者一段带格式的代码里复制出跨行内容,想在编辑器里直接定位,结果搜索框根本不接受换行。后来某次版本更新之后,我发现 Zed 的搜索框终于支持多行输入了,这个改动看起来不起眼,却实实在在改变了我的搜索习惯。
我不太喜欢“新功能速览”那种写法,这篇就围绕“Zed 搜索框换行”这件事,把上手操作、背后逻辑、正则边界、实战场景以及我踩过的坑一次说清楚。如果你经常要在代码里找跨行片段、批量删整段旧接口,或者清理日志里的多行错误,这篇应该能帮你省下不少时间。
1. 搜索框终于能换行了,这解决的不只是输入体验
1.1 以前想在 Zed 里搜多行文本,基本只能绕路
先回忆一下换行能力出来之前的日子。假设我有一份日志文件,里面某条错误长这样:
code复制2025-06-01 12:00:00 ERROR failed to connect
at Object.connect (src/client.ts:42:17)
at main (src/index.ts:88:5)
我想把整个“错误行 + 堆栈前两行”从日志里一次搜出来。以前在 Zed 的搜索框里直接粘贴这三行内容,结果往往是粘贴后只剩第一行,或者换行被当作提交搜索的快捷键直接执行,匹配结果自然只针对第一行。遇到这种情况,我的处理方式很原始:先搜第一行的关键字,定位到附近之后再用肉眼往下扫堆栈。如果错误出现几十次,就得反复手动确认。
更复杂一点,如果是想批量处理代码里的跨行结构,比如把一段旧的配置对象整体删掉,那搜索框纯属帮不上忙。以前能走的路是手写正则,把换行翻译成 \n 字符,把一段几十行的代码“压扁”成一行表达式再搜索。这个做法最大的问题是不直观:从代码里复制出来的真实换行,和正则里的 \n 是两种东西,一旦某处多了一个空格或者行尾是 \r\n,整个匹配就静默失败,非常难排查。
1.2 新版搜索框的操作手感,其实比想象中更自然
Zed 这次更新之后,搜索框本身变成了一个可以接受真实换行的多行输入区。我用的是当前最新版,macOS 上操作路径是这样:
- 按
Cmd + F打开文件内搜索框。 - 在搜索输入框里输入第一行内容。
- 按
Shift + Enter插入换行,继续输入下一行。 - 也可以直接
Cmd + V把一整段带换行的文本粘贴进去。 - 输入完成后按
Enter执行搜索,在匹配项之间跳转。
这个设计的巧妙之处在于,它没有额外添加一个“允许匹配换行”的开关,而是把换行当成搜索目标的普通字符。也就是说,现在“搜索框里长什么样,匹配的内容就是什么样”。这个“所见即所得”的交互方式,比在文本输入框里敲转义字符要直观太多。
实测下来,粘贴代码片段的时候最爽。比如从浏览器控制台复制一段报错,或者从 GitHub 上复制一段带缩进的代码片段,直接丢进搜索框就能定位。输入框会自动增高,不会出现输入到一半被截断或者换行被吞掉的情况。
1.3 换行不仅让“查找”更方便,更关键的其实是“替换”
我后来发现,搜索框能换行只是第一步,真正有杀伤力的是替换框也跟着支持了多行输入。以前想把“连续三个空行”替换成“一个空行”,用普通搜索框没法直接表达,因为你根本没法在搜索框里输入空行本身;现在搜索框里输入两次换行,替换框里输入一次换行,一趟就能扫完整个文件。
再比如,老的 JavaScript 代码里有很多这种块状结构:
js复制// #region 旧逻辑
function legacyMethod() {
// ...几十行
}
// #endregion
想批量删除这些区域,传统做法要么靠编辑器命令,要么来回多次正则匹配。现在可以直接在搜索框里输入 // #region 旧逻辑\nfunction legacyMethod() {\n... 这种字面量多行文本,先在文件里定位看看到底匹配了多少处,确认没问题之后再去调整替换框。整个过程可以把“目标长什么样”和“要替换成什么”直接摆在眼前,而不是在正则和转义之间来回折腾。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
