【问题标题】:How do you use vim's quickfix feature?你如何使用 vim 的快速修复功能?
【发布时间】:2010-12-17 08:29:32
【问题描述】:

我是一个非常新的 Vim 用户,我发现它的学习曲线非常陡峭(至少对我而言)。我刚刚安装了 this vim script 用于 JavaScriptLint 错误检查,一旦我保存缓冲区,就会在 vim 的 quickfix 窗口中显示错误。

但是,我不知道下一步该做什么。如何“滚动”浏览所有错误?如何关闭快速修复“窗口”?更改代码后如何让它检查错误?

我查看了 vim quickfix 文档,但是命令的数量太多了,我似乎找不到我想要的。任何帮助将不胜感激。

一个附带问题:有没有办法让 javascriptlint 检查驻留在 .html 文件中的代码的 js 错误?

【问题讨论】:

    标签: vim jslint


    【解决方案1】:

    正如你所说,有很多 commands 用于快速修复,但我倾向于发现我只使用其中的一小部分:

    :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 的建议有效,但是它遵循
    • @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 选择错误,而无需切换出快速修复窗口。
    • 对于初学者“你也可以这样做:'somecodehere' 来自动化它”并没有多大意义。这意味着显示的代码行必须放在 ~/.vimrc 中(Windows AFAIK 上的 _VIMRC),并且每次保存文件时从 VIM 的下一次启动将调用此命令。对吗?
    • 如何从:chi btw 中删除一个条目?
    【解决方案2】:

    导航快速修复列表(或位置列表,就此而言)最简单的方法是the unimpaired plugin

    填充快速修复窗口后,[q]q 在快速修复列表中(分别)前进和后退。 [Q]Q 转到开头和结尾(如果列表中只有一个项目,这特别方便;这使 vim 抱怨 [q]q)。所以工作流程是:

    1. 运行填充快速修复列表的任何命令
    2. 输入[Q 转到第一项
    3. 使用[q]q 滚动浏览后续项目(如果有)

    如果您使用 Syntastic,您将获得位置列表而不是 quickfix 列表。没问题;只需以相同的方式使用[L]L[l]l

    unimpaired 也有很多其他方便的映射 -- [e]e "bubble" 上下排列,[<Space>]<Space> 在上面和下面插入空行,等等。我很惊讶没有人之前在这里提到过;这可能是因为它直到 2010 年 1 月才存在,尽管这个问题是在 2009 年提出的。

    【讨论】:

      【解决方案3】:

      将以下两行放入您的 .vimrc 文件中:

      map <C-j> :cn<CR>
      map <C-k> :cp<CR>
      

      现在您可以使用 ctrl-j 和 ctrl-k 浏览错误,这模仿了标准的向下和向上运动命令 j 和 k。

      【讨论】:

      • &lt;c-j&gt; 有时(取决于终端?!)是错误的或完全不起作用,因为它与 的含义相同 // 最简单的方法是使用 &lt;c-n&gt; 和 @ 987654326@ 改为 // 否则:stackoverflow.com/questions/8304421/…
      • 我决定使用 F8 和 F9,像这样:noremap &lt;F7&gt; :cprevious&lt;CR&gt;noremap &lt;F8&gt; :cnext&lt;CR&gt; in .vimrc
      • 我已经使用&lt;C-j&gt;&lt;C-k&gt; 在vim splits 和tmux 窗格之间导航vim tmux navigator&lt;C-M-j&gt;&lt;C-M-k&gt; 的组合可能是另一种选择。
      • &lt;M-n&gt;&lt;M-N&gt; 对我来说感觉不错,因为它们匹配 / 搜索跳跃,而 jk 通常一次处理一行。
      【解决方案4】:

      您也可以使用:cc 2(或任何其他数字)跳转到快速修复窗口中的第二个错误,在这种情况下。使用:cn:cc 4 等导航会将光标放在相关行上。

      【讨论】:

        【解决方案5】:

        除了@DrAl 关于如何打开和关闭快速窗口以及在条目之间导航的出色答案之外,我还制作了一张图片来展示其他一些快速修复导航命令。

        以下每组 3 个文件代表一组快速修复结果,例如来自 vimgrep。 cnewer 和 Colder 用于查看历史结果集。

        【讨论】:

        • 非常方便的直观参考,我可能会将其保留为桌面壁纸
        • 谢谢,我不知道旧的/新的!有没有办法在不盲目倒退的情况下浏览旧列表?例如,看看有多少旧的快速修复列表?
        • @Moberg 我也需要知道这一点。你能帮忙吗?
        【解决方案6】:

        集成 JavaScript 语法检查的最佳实践方法是使用 Syntastic Vim plugin,它使用 Vim 的 location-list(与 quickfix 平行)窗口。

        我已经为 this questionthis question 写了答案,解释了如何做到这一点,以及如何使用社区驱动的@获得 Vim 的 源代码浏览/标签列表 987654324@(比 JSLint IMO 好得多)和 Mozilla 的 DoctorJS(以前的 jsctags)。

        【讨论】:

          【解决方案7】:

          也许这个选项在写这个问题时不存在(或者我自己很尴尬,因为我的.vimrc 中有一些东西使这种情况发生)但是当我得到一个Quickfix List 时,我只是用它导航它jk 然后点击 &lt;CR&gt;(即 Enter 键)跳转到文件中的那个位置。

          然后,要返回Quickfix List,我输入Ctrl+W j 表示“移下一个窗口”,然后我就回来了。

          最后,当我完成后,我只需输入:q,就像我想关闭任何普通窗口一样。

          【讨论】:

          • 这就是我想做的,但我得到“无法进行更改,'可修改'已关闭”。
          • 您可能已经覆盖了您的 Enter 键。例如,我有 nmap &lt;CR&gt; o&lt;Esc&gt;,所以我可以在正常模式下添加换行符。
          【解决方案8】:

          quickfix 窗口的操作与任何其他 vim 窗口基本相同:j 下一行,k 上一行,:cn 跳转到下一个错误/警告等。

          实验!

          【讨论】:

          • +1 进行实验,这就是我学到所有东西的方式。
          【解决方案9】:

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

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

          上面显示了运行录制的宏或简单的搜索和替换。缺少似乎是一种通过管道和外部命令的方式,就像你可以使用 :range! command

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多