Vim中的快捷键和位置列表
quickfix和location列表是Vim中必不可少的导航组件。本文将考虑这两个列表的异同,并举例说明每个列表的典型使用情况。
quickfix和location列表为Vim提供了一种强大的导航方式,特别是在搜索文件或项目的情况下,以及检查错误时。本质上,它们是文件位置的列表,有一套内置的命令用于在它们之间进行导航,它们可以以各种方式被填充。
快速修复列表
quickfix列表对于导航到项目中的不同位置非常有用,例如在审查linting警告、编译错误或进行项目范围的搜索时。
许多内置的命令(如:vimgrep 或:make )和第三方插件都利用这个列表来显示操作的结果,这样就可以用一组快速修复命令来快速浏览它。
例如,假设你想找到你的JavaScript项目中window 的所有实例。你可以使用内置的:grep 命令,如下所示。
:grep window src/js/
在幕后,Vim将在shell中运行grep 命令并打印输出。但这还不是全部,结果也会被放在快速修复列表中,这样你就可以快速跳到每个文件中所有匹配的位置。请看下面的演示。
虽然有几个命令可以浏览快速修复列表,但这些是最常见的,你需要注意的。
:copen- 打开快速修复列表窗口。:ccl或 - 关闭快速修复列表窗口。:cclose:cnext或 - 转到列表中的下一个项目。:cn:cprev或 - 转到列表中的上一个项目。:cp:cfirst- 转到列表中的第一个项目。:clast- 转到列表中的最后一项。:cc <n>-转到第n个项目。
quickfix窗口在大多数情况下与普通的Vim窗口一样,所以标准的导航和移动绑定也可以用来在列表中的项目之间切换和跳跃。例如,当窗口被聚焦时,你可以用j或k来突出显示下一个或上一个项目,用Enter来移动光标到突出显示的文件和位置。
位置列表
位置列表的作用和快速修复列表一样,只是它是针对当前窗口的,而不是Vim会话的全局。所以如果你有五个打开的窗口,你最多可以有五个位置列表,但只有一个快捷键列表。
填充位置列表的方法与快速修复列表完全相同,只是内置命令的前缀为l 。例如。:lvimgrep,:lmake,:lgrep 等等。一些第三方插件也默认将它们的输出放在位置列表中,尽管它通常是可配置的,以防你喜欢快速修复列表。
: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 进行搜索,如下所示。
:grep foo
然后你可以使用:cdo 命令对快速修复列表中的每个项目执行替换命令,如下所示。update 部分使缓冲区在每次修改后都被写入磁盘。
:cdo s/foo/bar/ | update
当:cdo 进行工作时,Vim缓冲区中可能会有几个文件被打开。要关闭每个文件,使用:cfdo 命令来执行:bd 。:cfdo 遍历列表中的每一个条目,而不是遍历列表中的每一个引用的文件。
:cfdo bd
:cdo 和:cfdo 的位置列表对应的是 - 你猜对了 -:ldo 和:lfdo 。
有用的插件
虽然默认配置提供了你在快速修复和位置列表中工作所需的一切,但通过第三方插件可以增加一些自定义功能。以下是我发现的两个最有用的插件。
-
vim-qf。这个插件为快捷键和位置列表提供了少量的设置和映射,可以根据你的工作流程进行定制。
-
vim-unimpaired:这个插件为常见的任务提供了许多有用的映射,其中快速修复和位置列表的映射如下:
[q和]q分别导航到列表的上一个和下一个项目,而[Q和]Q分别导航到列表的开始和结束。
结论
quickfix和location列表是加载和导航编译错误和警告的有用机制,或者在项目中搜索时。
虽然 quickfix 列表是传统的错误列表,但没有什么可以阻止你将它用于其他任务。另一方面,位置列表对于运行多个搜索查询很方便,每个查询的结果都在一个独立的窗口中。