使用Syntastic在Vim中,跳转到当前行的快速修复或位置列表中的错误。

10
我开始使用Syntastic插件来检查当前缓冲区的语法并指出有错误的行。我可以使用:Errors打开错误列表,然后通过按下Enter跳转到包含错误的行,以便在我的缓冲区中查看错误。
我想知道如何反过来做。我想从标记有语法错误的缓冲区行转到相应的位置列表条目,以便我可以在列表中读取完整的错误消息。我知道:ll [n]会跳转到列表中的第n个错误,但通常我不知道哪个错误号对应于缓冲区中给定的行。然而,我找不到接受行号而不是错误号的命令。
5个回答

9
您说的没错,目前没有内置的方法可以找出当前光标位置后面的错误。但这个功能通常很有用。我为此编写了QuickFixCurrentNumber插件。使用`g`映射键,您可以跳转到快速修复/位置列表中与当前光标位置(或光标后面的下一个项目)对应的项。它还提供了`[q] / [q]`映射键,以在限制导航为仅针对当前缓冲区中的错误时跳转到上一个/下一个错误。请参考QuickFixCurrentNumber插件

4
我认为,至少使用默认的 Vim 命令或 Syntastic 是不可能的。
但是,Syntastic 实际上会在命令行中回显与当前行关联的错误消息。该特性默认启用

Syntastic会将第一个错误消息回显到命令行,但通常该消息会被截断;因此我想自己跳转到位置列表中的错误。 Syntastic可以根据缓冲区中的当前行检索错误消息的事实提供了希望,这意味着可以从缓冲区跳转到位置列表中相应的错误行。 - gotgenes
很遗憾,没有这个命令。您应该在Syntastic的问题跟踪器上发布一个功能请求。 - romainl
如果您将命令行设置为使用2行,则它会将它们都用于消息,这有助于避免截断。 "set cmdheight=2" - John Eikenberry

2

我刚刚为我的“Man查看器”创建了这个功能。它可以在导航时跟踪“locationlist”窗口中的当前项目:

function! s:visibleLoc()
   return len(filter(getwininfo(), {i,v -> v.loclist}))
endfunc

function! s:followLine()
   let curLine = line(".")
   if (exists("b:lastLine") && b:lastLine == curLine) || 0 == s:visibleLoc()
      return
   endif
   let b:lastLine = line(".")
   let ent = len(filter(getloclist("."), {i,v -> v.lnum <= curLine}))
   if ent < 1 || (exists("b:lastEntry") && b:lastEntry == ent)
      return
   endif
   let b:lastEntry = ent
   let pos = [ 0, curLine, col("."), 0 ]
   exe "ll ".ent
   call setpos(".", pos)
endfunc

au CursorMoved <buffer> call <SID>followLine()

谢谢,这对我有所帮助。 - elbeardmorez

1

:caf 命令会将光标移动到错误处,如果您不介意将光标移回并重新使用它,则这个命令非常有用。

您可能可以创建映射来将光标移回,然后再使用 :caf,但是处理边缘情况,比如错误是文件中的第一个字符时,可能会稍微复杂一些。


0

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