我想将Vim的quickfix功能与Visual Studio的devenv构建过程或msbuild的输出一起使用.
我创建了一个名为build.bat的批处理文件,它执行devenv构建,如下所示:
devenv MySln.sln /Build Debug
Run Code Online (Sandbox Code Playgroud)
在vim我已经指出:make命令到该批处理文件:
:set makeprg=build.bat
Run Code Online (Sandbox Code Playgroud)
当我现在运行:make时,构建执行成功,但是错误不会被解析出来.所以如果我运行:cl或:cn我最终会看到devenv/Build的所有输出.我应该只看到错误.
我已经尝试了许多不同的错误格式设置,我在网络上的各个站点上找到了这些设置,但是没有一个设置正确地解析了错误.这里有一些我尝试过的:
set errorformat=%*\\d>%f(%l)\ :\ %t%[A-z]%#\ %m
set errorformat=\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %m
set errorformat=%f(%l,%c):\ error\ %n:\ %f
Run Code Online (Sandbox Code Playgroud)
当然,我已经尝试过Vim的默认设置.
以下是build.bat的一些示例输出:
C:\TFS\KwB Projects\Thingy>devenv Thingy.sln /Build Debug
Microsoft (R) Visual Studio Version 9.0.30729.1.
Copyright (C) Microsoft Corp. All rights reserved.
------ Build started: Project: Thingy, Configuration: Debug Any CPU ------
c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.Linq.dll" …Run Code Online (Sandbox Code Playgroud) 我阅读了文档,但更加困惑.
我有编译器生成以下错误:
rot;
^
"cpp\c1.cpp", line 13: error(114): identifier
"rot" is undefined
1 error detected in the compilation of "c1.cpp".
Run Code Online (Sandbox Code Playgroud)
我知道如何检测给出错误行的行,但我在错误列表中得到了大量额外无用的信息,错误消息分为两行,我更愿意合并.
我的开始错误格式是:
:set efm=\"%f\"\\,\ line\ %l:\ error(%n):\ %m
Run Code Online (Sandbox Code Playgroud)
既然我们在这里,有没有一种快速测试efm的方法,而不是一直试着运行make?
我不确定%tVim的quickfix列表中的格式说明符.它如何影响quickfix缓冲区的行为/显示?
我试着用以下测试文件找到它:
$ cat test.out
foo Error 1 foo.h foobar
bar Error 2 foo.h foobar
foobar Warning 3 foo.h foobar
barfoo Warning 4 foo.h foobar
Run Code Online (Sandbox Code Playgroud)
以下是errorformat第一个:
set errorformat+=%.%#%*\\s%.%#%*\\s%l\ %f%*\\s%m
Run Code Online (Sandbox Code Playgroud)
有了这个errorformat,我可以使用:cgetfile test.out并跳转到行号foo.h,但具有以下内容errorformat:
set errorformat+=%.%#%*\\s%t%.%#%*\\s%l\ %f%*\\s%m
Run Code Online (Sandbox Code Playgroud)
所有改变的是,现在我在quickfix缓冲区中的行号后面看到一些空格,例如我看到(1之后的两个空格)
foo.h|1 | foobar
Run Code Online (Sandbox Code Playgroud)
代替
foo.h|1| foobar
Run Code Online (Sandbox Code Playgroud)
所以我有两个问题:
errorformat?我每天都使用Vim来编写shell脚本.我一直在阅读关于quickfix窗口,我认为它可以加快我在编辑运行修复周期中的工作效率.
如果我理解正确,我必须编写自己的errorformat函数,以便Vim能够捕获错误并将它们引入quickfix窗口.但这似乎真的很复杂.
在编写Bash脚本时,是否有更简单/更方便的方法来利用Vim 中的quickfix窗口?
我试过阅读:help errorformat和谷歌搜索(主要是stackoverflow),但无法理解那里提到的一些模式:
%s- "指定要搜索的文本以找到错误行.[...]"
%s?之后?在它之前?或者,我不知道,这可能会污染整个模式吗?WTF?set efm+=,foobar?这里的"foobar"对我来说也是"要搜索的文字"......:/%+- 例如,我在一个问题中看到过类似的东西:%+C%.%#
%m早期/后期多线模式中使用?如果是的话,那么如果没有%.%#(== regexp .*),但是,让我们说,%+Ccont.: %.%#- 那样的东西可以捕获cont.:字符串后的东西%m吗?%C%.%#,并%+C%.%#和%+G?%A和%+A,或%E与%+E?:help errorformat-multi-line下列字符结尾:%\\@=%m- WTF的%\\@=意思是什么?我非常感谢帮助理解这些东西.
我想将输出从cscope重定向到Vim quickfix窗口.胶水部分很容易,但我目前陷入错误格式.以下是cscope输出的示例(cscope -L -1 bar):
Format: "filename scope linenumber sourceline"
Example: "abc.cpp foo 25 bar()"
Run Code Online (Sandbox Code Playgroud)
这意味着在foo()中,在abc.cpp的第25行,调用bar().
efm = %f\ %*[^\ ]\ %l\ %m但工作但范围信息丢失.例如:
Input: "abc.cpp foo 25 bar()" becomes
Output: "abc.cpp |25| bar()"
Run Code Online (Sandbox Code Playgroud)
我想要的是在quickfix窗口中包含范围,如下所示:
Input: "abc.cpp foo 25 bar()" becomes
Output: "abc.cpp |25| bar() inside foo()"
Run Code Online (Sandbox Code Playgroud)
是否可以仅使用errorformat执行此操作,或者是否需要编写脚本来操作输出,然后再将其输送到Vim?
使用vim的errorformat语法,有没有办法在过滤结果时使用部分消息?
例如,除了错误本身之外,一些链接器错误没有任何明确的区别将它们区分为行上的错误:
/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
Run Code Online (Sandbox Code Playgroud)
要么
/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
Run Code Online (Sandbox Code Playgroud)
使用错误格式:
set efm=%f:%l:\ %m
Run Code Online (Sandbox Code Playgroud)
会正确地捕获并显示这两个,但会错误地匹配许多其他情况(任何以"[string]:[number]:"开头的行).
或者,明确指定它们:
set efm=
set efm+=%f:%l:\ undefined\ reference\ to\ %m
set efm+=%f:%l:\ multiple\ definition\ of\ %m
Run Code Online (Sandbox Code Playgroud)
消除误报,但'消息'变得不那么有用 - 不再包含实际错误(只是在它之后的任何内容).
我缺少什么语法来处理这种情况?
理想情况下,我希望能够说出以下内容:
set efm+=%f:%l:\ %{StartMessage}undefined\ reference\ to\ %*\\S%{EndMessage}
set efm+=%f:%l:\ %{StartMessage}multiple\ definition\ of\ %*\\S%{EndMessage}
Run Code Online (Sandbox Code Playgroud)
...将StartMessage和EndMessage之间匹配的所有内容用作错误消息.
我试图匹配以下错误efm:
AssertionError: 1 == 2
at /home/strager/projects/blah/blah.js:13:37
Run Code Online (Sandbox Code Playgroud)
错误消息可以是任何内容(即它并不总是匹配AssertionError: .*或.*Error: .*格式).一般格式是:
errormessage
at filename:line:column
Run Code Online (Sandbox Code Playgroud)
我的问题是错误消息匹配任何行; 我需要将错误消息限制为仅一行,并且只有在匹配的"at"行后才匹配.
我尝试过以下方法efm:
set efm=%Z\ \ \ \ at\ %f:%l:%c,%E%m
" %Z at %f:%l:%c,%E%m
Run Code Online (Sandbox Code Playgroud)
这几乎可以工作,但除了错误之外,它还匹配状态行(例如错误之前和之后的非错误).如何强制%E%m ... %Z总共只有两行(一行用于错误消息,一行用于at行)?makeprg如果需要,我可以访问标准的UNIX工具.
我试图让makeprg和errorformat使用VIM和jslint,并且似乎无法获得正确的错误格式...我正在使用jslint的nodejs版本,它产生的结果如下:
1 116,9: The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.
for (var k in o)
Run Code Online (Sandbox Code Playgroud)
我基本上想要匹配行号,列和错误,并使用当前文件作为文件名.有人知道怎么做吗?
要清楚,我正在寻找errorformat来使这个命令工作.目前我的.vimrc文件有
augroup js
set makeprg=jslint\ %
set errorformat=%E%>%l,%c:%m,%Z
augroup END
Run Code Online (Sandbox Code Playgroud)
只是不工作(jslint工作正常,但错误格式错误)...
我正在尝试匹配C错误消息,如下所示:
gmake[1]: Entering directory `/project/swbuild45/ethanl/swfeature_int/pkt' ... sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c: In function 'bfd_delete_constituent_session': sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3654: error: 'bfd_ses' undeclared (first use in this function) sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3654: error: (Each undeclared identifier is reported only once sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3654: error: for each function it appears in.) sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3654: error: expected ';' before 'sion_cst' sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3663: error: 'dbl_dequ' undeclared (first use in this function) sw/se/xc/bsd/routing/rib/src/rib_bfd_thrd.c:3663: error: expected ';' before 'eue' ... gmake[1]: Leaving directory `/project/swbuild45/ethanl/swfeature_int/pkt'
到目前为止,我想出了这个:
errorformat=%f:%l:\ %m,%Dgmake[%\\d%\\*]:\ Entering\ directory\ `%f',%Xgmake[%\\d%\\*]:\ Leaving\ directory%s
Run Code Online (Sandbox Code Playgroud)
它打开文件并将我转到第一个错误,但我必须键入:cn四次才能得到第二个错误.我试图设置多行错误,但到目前为止我的错误字符串不起作用:
errorformat=%-Z%f:\ %s,%C%f:%l:\ %m,%A%f:\ %m,%Dgmake[%\\d%\\*]:\ Entering\ directory\ `%f',%Xgmake[%\\d%\\*]:\ …Run Code Online (Sandbox Code Playgroud)