Vim 分栏显示搜索结果最实用的做法,是把命中行装进 quickfix 窗口,再用垂直分栏把结果钉在右侧,左边继续看源码、右边列着「文件名 : 行号 : 匹配内容」。在 Vim 里搜完代码,默认结果只是底部一行状态提示,看不到文件、行号和上下文,想逐条跳转还得反复敲命令。本文讲清 Vim 怎么分栏显示搜索结果的详细信息,覆盖 quickfix 与 location list 两种通道,以及 3 个新手最容易踩的坑。Vim 分栏显示的核心是先装结果、再开分栏,顺序别反,否则光标会直接跳走、对照的上下文全丢。看完你能把搜索结果变成可点击、可对照的分栏视图。

先看结论
搜索结果要不要「分栏显示」,关键在 quickfix 列表::vimgrep 或 :grep 把命中行写进 quickfix,再用 :vert copen 在垂直分栏里打开,就能左边看源码、右边看结果清单。想在单个窗口内单独维护一份结果,用 :lvimgrep + :lopen 的 location list 更合适。先装结果、再开分栏,顺序别反。
一、核心思路:搜索结果进 quickfix,再分栏打开
Vim 搜索分两步走:第一步让命中结果进入一个叫 quickfix 的结构,第二步把它渲染成分栏窗口。直接 :/pattern 只做单文件内高亮跳转,拿不到「跨文件清单」,所以要用下面这组命令。命令细节可以先翻 Vim 速查手册 对照按键含义,遇到不会的再回查。
quickfix 窗口本质上就是一个可跳转的结果缓冲区,每一行都带着源文件、行号和列号。Vim 搜索时产生的命中,只要进了这个缓冲区,就能在右侧分栏里逐条回车跳转。适用边界是:工程级全局搜索用 quickfix,单窗口私有结果用 location list,别混用。性能上,几千条命中也能流畅跳转,因为 quickfix 只存索引不复制文件内容。
如果只在单个文件里找东西,其实 :/pattern 配合 n / N 跳转就够了,没必要动用 quickfix;一旦要跨文件、跨目录批量定位,再切到 :vimgrep 这套才划算。Vim 分栏显示的价值,正是把跨文件命中从「一行状态提示」升级成「可对照的清单」,让搜索结果真正可点、可比对,而不是搜完就丢。

二、两种分栏方式的操作步骤
| 通道 | 适用场景 | 打开分栏命令 | 跳转命令 |
|---|---|---|---|
| quickfix | 工程级全局搜索 | :vert copen |
:cnext / :cprev |
| location list | 单个窗口私有的结果集 | :lopen |
:lnext / :lprev |
实际用起来,建议把分栏高度与快捷键一起固化进 vimrc,避免每次手敲。quickfix 与 location list 默认只开几行,命中多时光看不全,可用 :copen 15 或 :lopen 15 直接指定 15 行高,也可以用 :cwindow 让 Vim 仅在确有结果时才弹窗。想一键呼出右侧分栏,把 :vert copen 映射成 <leader>q 最顺手;点开后用 :cnext / :cprev 逐条跳转,左侧源码始终不动。Vim 分栏显示的核心是先装结果再开窗口,把这条命令固化进日常,全局搜代码会顺手很多。
2.1 用 :vimgrep 装结果,再用 :vert copen 分栏
:vimgrep 把正则命中写进 quickfix,支持 ** 递归:
:vimgrep /useState/ **/*.jsx
:vert copen
打开后右侧分栏每一行都是 文件路径|行号|列号|匹配内容,回车即跳过去,左侧原文件不动。若想用更快的 ripgrep,先把搜索后端换掉:
:set grepprg=rg\ --vimgrep\ --no-heading
:grep "useState"
:vert copen
配置这一步只需写一次,建议直接固化进 vimrc。更多实操可以看 Vim 实操说明 里对常见编辑场景的拆解。
2.2 用 :lvimgrep 维护窗口私有结果
location list 归「当前窗口」所有,不会和别人的 quickfix 打架,适合一个窗口专门搜函数定义、另一个窗口搜调用点:
:lvimgrep /handleClick/ src/**/*.ts
:lopen
这种分屏对照的写法,和网页里「一块块呈现结果」的思路是一致的——把零散命中聚合成一份可滚动清单。对比 quickfix,location list 的隔离性更好,不会影响别的窗口的跳转状态。

三、3 个常见错误
3.1 忘了先开分栏就 :cnext 跳走
很多人搜完直接 :cnext,光标瞬间跳到别的文件,刚才对照的上下文全没了。正确顺序是先 :vert copen 把结果钉在分栏,再在里面回车跳转,左侧始终保留你正在看的代码。失败排查时先看当前焦点在哪个窗口,焦点错了跳转就会乱。
3.2 grepprg 没配导致搜不到
默认 :grep 调的是系统 grep,在 Windows 上常常找不到或行为不一致,结果列表为空。先 :set grepprg=rg\ --vimgrep 切到 ripgrep,再搜就有详细结果;团队可以写进 vimrc 固化。预期结果是右侧分栏立刻列出所有命中,而不是空列表。
3.3 把 location list 当 quickfix 跨窗口共享
location list 是窗口私有的,A 窗口的 :lopen 结果 B 窗口看不到;想在全局共享,必须用 quickfix(:copen / :vert copen)。搞混两者会出现「明明搜到了却跳不动」的错觉。验证方法是分别在两个窗口各搜一次,确认彼此的结果互不串台。
⚠️ 注意:
:vert copen打开的是垂直分栏,想横向放在底部用:copen即可;分栏里:cclose关掉后,quickfix 数据还在,重新:copen会恢复。
总结
Vim 分栏显示搜索结果的详细信息,核心是「先装 quickfix、再开分栏」::vimgrep 或 :grep 把命中写进列表,:vert copen 在右侧钉一个可跳转的结果窗口,左侧继续看代码。记住三个坑——先开分栏再跳转、把 grepprg 配成 ripgrep、分清 quickfix 与 location list 的共享范围。把这串命令存进肌肉记忆,全局搜代码会顺手很多。
要点带走:
- 搜索结果进 quickfix,再用
:vert copen分栏; grepprg换成 ripgrep,跨平台结果才稳定;- quickfix 全局共享,location list 窗口私有。
下一步可以把 :vert copen 绑到一个快捷键,搜索分栏一键呼出。
常见问题
Q:quickfix 和 location list 到底选哪个?
A:做工程级全局搜索、希望所有窗口共享同一份结果,用 quickfix;只想在某个窗口临时看一份结果、不影响别处,用 location list 更干净。
Q:分栏打开后怎么快速关掉?
A:在结果分栏里执行 :cclose 关 quickfix、q 或 :lclose 关 location list,原文件窗口不受影响。
Q:为什么我 :grep 之后列表是空的?
A:多半是 grepprg 指向了不存在的命令或参数不对,先 :set grepprep? 看当前值,改成 ripgrep 的 --vimgrep 形式通常就好。
延伸学习
把 Vim 搜索分栏这套用熟,可以按这个顺序补:

TRAE-AI编程



