你如何使用vim的快速修复功能?

165

我是一个相对较新的Vim用户,但我发现它的学习曲线对我来说相当陡峭。我刚安装了这个vim脚本进行JavaScriptLint错误检查,一旦我保存了缓冲区,它就会在vim的快速修复窗口中显示错误。

然而,我不知道接下来该怎么做..如何浏览所有的错误? 如何关闭快速修复“窗口”?在我修改代码后,如何让它继续检查错误?

我已经看过vim快速修复文档,但命令的数量令人不知所措,我似乎找不到想要的内容。任何帮助都将不胜感激。

一个相关的问题:是否有办法使javascriptlint检查位于.html文件中的代码中的js错误?

9个回答

205

就像你所说的,有很多用于快速修复的命令,但我倾向于只使用其中的一小部分:

:copen " Open the quickfix window
:ccl   " Close it
:cw    " Open it if there are "errors", close it otherwise (some people prefer this)
:cn    " Go to the next error in the window
:cp    " Go to the previous error in the window
:cnf   " Go to the first error in the next file
:.cc   " Go to error under cursor (if cursor is in quickfix window)

我倾向于使用:make:vimgrep,因此我无法评论JavaScript lint检查器,但这应该可以帮助你入门。

关于JavaScriptLint的一般用法,我不是JavaScript程序员,但看起来脚本公开了一个名为“JavascriptLint”的函数,因此如果您想手动调用它,可以使用:call JavascriptLint()。然而,它是针对文件系统上的文件进行操作的,所以需要先保存。如果(仅当)命令行jsl适用于HTML文件,则您应该能够在HTML文件上使用:call JavascriptLint()来检查内部JavaScript。您还可以执行以下操作:

autocmd BufWritePost,FileWritePost *.html call JavascriptLint()

自动化它。如果jsl不支持HTML文件,那么(除非修补应用程序或要求作者更改它),否则它可能是无望的……


谢谢,这些命令是一个好的开始,我只需要玩一下并熟悉它的工作方式。如果我使用:cn命令去到qf窗口中的错误,我能否在不退出qf窗口的情况下跳转到我的代码窗口?它能跳转到有错误的那一行吗?您提供的使用:call的建议很好,但它会跟随<script src>链接,这不是我想要的。 - hora
@hora: :cn 不应该关闭 qf 窗口,但它会切换到包含错误的窗口:这是你所说的“跳转”吗?你可以使用 Ctrl-W p:wincmd p 快速切换回来,因此你可以执行 :command! CN :cn | wincmd p<CR> 或类似的命令(未经测试)。这将为你提供一个 :CN 命令,它可以在不切换出快速修复窗口的情况下转到下一个错误。或者你可以执行类似于 :au BufWinEnter quickfix nmap <buffer> <Enter> :.cc | wincmd p<CR> 的命令(同样未经测试),并使用 Enter 选择一个错误而不会切换出快速修复窗口。 - DrAl
1
对于初学者来说,“你也可以做:'somecodehere' 来自动化它”并不意味着太多。这意味着所示的代码行必须放置在 ~/.vimrc(在 Windows 上是 _VIMRC,据我所知),并且从下一次启动 VIM 开始,每次保存文件时都会调用此命令。对吗? - Беров
如何从 :chi 中删除一个条目? - VimNing

75
使用unimpaired插件是导航快速修复列表(或位置列表)的最简单方式。
一旦快速修复窗口被填充,[q]q分别向前和向后移动在快速修复列表中。[Q]Q 转到开头和结尾(尤其方便如果列表只有一个项目; 这会导致vim抱怨[q]q)。因此,工作流程是:
  1. 运行填充快速修复列表的任何命令。
  2. 键入[Q以转到第一个项目。
  3. 使用[q]q查看后续项目(如果有)。
如果使用Syntastic,则会获得位置列表而不是快速修复列表。没问题;以同样的方式使用[L]L[l]lunimpaired还有许多其他方便的映射,例如[e]e将行上下“泡沫化”,[<Space>]<Space>在上面和下面插入空白行等。我很惊讶没有人在这里提到过它;这可能是因为它在2009年提问之前不存在,直到2010年1月才出现。

34
将以下两行代码放入你的 .vimrc 文件中:
map <C-j> :cn<CR>
map <C-k> :cp<CR>

现在你可以使用 ctrl-j 和 ctrl-k 导航错误信息,这模仿了标准的向下和向上移动命令 j 和 k。


1
<c-j> 有时(取决于终端?!)会出现错误或完全不起作用,因为它的意思与 <NL> 相同。最简单的方法是使用 <c-n> 和 <c-p> 代替。否则,请参考 https://dev59.com/hl3Va4cB1Zd3GeqPDLpx。 - MacMartin
我决定在.vimrc中使用F8和F9,像这样:noremap <F7> :cprevious<CR>noremap <F8> :cnext<CR> - Flimm
我已经使用 vim tmux navigator 中的 <C-j><C-k> 来在 vim 分屏和 tmux 面板之间导航。组合键 <C-M-j><C-M-k> 可能是另一种选择。 - Paul Rougieux
"<M-n>"和"<M-N>"对我来说感觉很合适,因为它们与"/"搜索跳转匹配,而"j"和"k"通常一次只处理一行。 - SO_fix_the_vote_sorting_bug

26

您还可以使用:cc 2(或其他数字)来跳转到快速修复窗口中的第二个错误。 使用:cn:cc 4等导航将光标放在相关行上。


20
除了@DrAl关于如何打开和关闭快速窗口以及在条目之间导航的出色回答外,我制作了一张图片来展示其他快速修复导航命令。
以下每组3个文件代表一组快速修复结果,例如从vimgrep中。cnewer和colder用于浏览历史结果集。 输入图像描述

2
非常方便直观的参考资料,我可能会将其作为桌面壁纸保存。 - Just Khaithang
谢谢,我不知道有关于旧/新的信息!有没有办法在不盲目向后步进的情况下浏览旧列表?例如,可以看到有多少旧的快速修复列表吗? - Moberg
@Moberg 我也需要知道这个。你能帮忙吗? - VimNing
2
@Moberg,VimNing和未来的其他人。你们可能正在寻找:chi[story]。 - EVK
非常好的解释,配有图片,谢谢! - devstefancho

9
也许当这个问题被提出时,这个选项还不存在(或者可能是因为我的.vimrc中有一些东西导致了这种情况),但当我得到一个Quickfix List时,我只需使用jk浏览它,然后按下<CR>(即Enter键)跳转到文件中的那个位置。
然后,要返回Quickfix List,我键入Ctrl+W j以“向下移动窗口”,然后就回来了。
最后,当我完成时,我只需键入:q,就像关闭任何普通窗口一样。

这就是我想做的,但是我得到了“无法进行更改,'modifiable'已关闭”的错误提示。 - rtf
3
你可能已经覆盖了回车键的功能。例如,我使用的是 nmap <CR> o<Esc> 命令,这样我就可以在普通模式下添加新行了。 - ilvez

8
最佳实践是使用Syntastic Vim插件来集成JavaScript语法检查,它使用Vim的location-list(与quickfix并行)窗口。
我已经为这个问题这个问题编写了答案,解释了如何做到这一点,还介绍了如何使用社区驱动的jshint.com(在我看来比JSLint好得多)和Mozilla的DoctorJS(以前是jsctags)获取Vim的源代码浏览/标签列表

6

快速修复窗口的操作方式与其他vim窗口大致相同:使用j向下移动一行,k向上移动一行,:cn跳转到下一个错误/警告等。

尝试一下吧!


2
尝试是加分项,这几乎是我学习所有东西的方式。 - hora

0

虽然这需要 > Vim 7.4.858,但 cdo 命令(或 ldo 命令用于位置列表)允许以一种你曾经只能使用 sed 实现的方式更新非连续的行集:

:vimgrep /re/ %:p
:cdo! norm @a
# or
:cdo! s/re/repl/

以上显示了运行记录的宏或简单的搜索和替换。似乎缺少一种通过外部命令进行管道传输的方法,就像使用:range!command一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接