Vim/Neovim 中的快速修复列表和位置列表
快速修复(quickfix) 列表和位置(location)列表是 Vim 中必不可少的导航组件。本文将比较这两个列表之间的相似和不同之处,并提供每个列表通常在什么情况下使用的示例。
快速修复和位置列表提供了在 Vim 中导航的强大方法,尤其是在搜索文件或项目的上下文中,以及在检查错误时。本质上,它们都是文件位置的列表,Vim 自带一组内置的命令,用于在这些位置之间导航,且这些列表可以通过多种方式产生。
快速修复列表
快速修复列表对于导航到项目中的不同位置非常有用,例如查看静态代码分析工具(linting)中的警告、编译错误,或者执行项目范围内的搜索时。
许多内置命令(例如::vimgrep
,或 :make
)和第三方插件利用这个列表来显示其操作结果,这样就可以使用一组快速修复命令进行快速遍历操作。
例如,假设您希望在 JavaScript 项目中找到所有 window
的实例。您可以按照以下方式使用内置的命令 :grep
:
vim
:grep window src/js/
在后台,Vim 将在 shell 中运行 grep
命令并打印输出。但是这不是全部,该结果也存放在快速修复列表中,以便您可以快速跳转到每个文件中的所有匹配位置。请看以下演示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1uBn3Ys-1657268084822)(./grep.gif)]
虽然用于导航快速修复列表的命令有不少,但是以下命令是需要您关注的最常见的命令:
:copen
- 打开快速修复列表窗口。:ccl
或cclose
- 关闭快速修复列表窗口。:cnext
或:cn
- 跳到列表中的下一项。:cprev
或:cp
- 跳到列表中的上一项。:cfirst
- 跳到列表中的第一项。:clast
- 跳到列表中的最后一项。:cc<n>
- 跳到第 n 项。
快速修复列表的行为在很大程度上类似于普通的 Vim 窗口,因此标准的导航和移动的绑定命令也可以用来切换到列表中的项目并在其中跳转。例如,当窗口聚焦时,您可以使用 j
或 k
来高亮显示下一个或上一个项目,使用 enter
将光标移动到高亮显示的文件上和位置上。
位置列表
位置列表的行为与快速修复列表类似,只不过它是当前窗口的本地列表,而不是 Vim 会话的全局列表。因此,如果您有五个打开的窗口,则可以由多达五个位置列表,但是只有一个快速修复列表。
产生位置列表的方式与快速修复列表完全相同,只不过其内置命令的前缀是 l
。例如::lvimgrep
、:lmake
、:lgrep
等等。一些第三方插件也默认将它们的输出放在位置列表中,当然,它通常是可配置的,因此您可以配置到快速修复列表。
vim
:lgrep window src/js/
以下是用于导航位置列表的一些命令:
:lopen
- 打开位置列表窗口。:lcl
或:lclose
- 关闭位置列表窗口。:lnext
- 跳到列表的下一项。:lprev
- 跳到列表的前一项。:lfirst
- 跳到列表的第一项。:llast
- 跳到列表的最后一项。ll<n>
- 跳到第 n 项。
正如您所看到的,位置命令与它们的快速修复列表几乎完全相同,除了c
被替换成 l
。
导航旧列表
Vim 在每个会话中保留多达 10 个快速修复列表,在每个窗口中保留 10 个位置列表。如果某个操作创建了一个新列表,则前一个列表将保留在后台中,直到达到限制为止。这样就可以使用命令来引用以前的列表:
:colder
或:col
- 跳到前一个快速修复列表。:cnewer
或:cnew
- 跳到下一个快速修复列表。:lolder
或:lol
- 跳到前一个为止列表。:lnewer
或:lnew
- 跳到下一个位置列表。
虽然每次在列表之间切换时,屏幕上都会显示一条状态消息,但最好保持快速修复列表或者位置列表窗口打开,这样您就可以轻松地看到更新后的列表。
:cdo
及其朋友
:cdo
命令允许您对快速修复列表中的每个条目执行您选择的任意命令。这是一个强大的特性,并为在 Vim 中最接近本机项目范围的搜索和替换提供了基础。
例如,如果希望用 bar
替换项目中的所有 foo
实例,那么可以使用 :grep
进行搜索,如下所示:
vim
:grep foo
然后,您可以使用 :cdo
命令为快速修复列表中的每个项目执行替换命令,如下所示。update
部分会在每次修改后将缓冲区写入磁盘。
vim
:cdo s/foo/bar/ | update
在 :cdo
进行工作时,在 Vim 缓冲区中可能会打开几个文件。要关闭每个文件,请使用 :cfdo
命令来执行 :bd
。:cfdo
不会迭代列表中的每个条目,而是迭代列表中每个引用的文件。
vim
:cfdo bd
相当于 :cdo
和 :cfdo
的位置列表是 —— 您猜对了 —— :ldo
和 :lfdo
。
有用的插件
虽然默认的配置提供了使用快速修复列表和位置列表所需的一切,但是通过第三方插件增加一些定制。以下是我发现的两个最有用的插件:
vim-qf
:这个插件提供了一些快速修复和位置列表的设置和映射,非常适合您的工作流程。vim-unimpaired
:这个插件为常见的任务提供了一些有用的映射,其中适用于快速修复和位置列表的:[q
和]q
分别导航到列表中的前一项和下一项,而[Q
和]Q
分别导航到列表的开始和结束。
结论
快速修复和位置列表是加载和导航编译错误和警告,或在项目中搜索时的有用机制。
尽管快速修复列表传统上用于错误,但没有什么可以阻止您将其用于其他任务。另一方面,位置列表便于运行多个搜索查询,每个查询的结果都在一个独立的窗口中。
有关快速修复和位置列表的更多信息,请分别参见::help quickfix
和 :help location-list
。感谢阅读,编程愉快!