Substitution rule for vim's Quickfix window when using WAF
Fri, 18 July 2014 :: #vim
I have a C++ project with *.cpp
files located in c:\project
. I'm also using a pseudo-out-of-tree build system, which uses c:\project\build
directory as an output directory for every executable, object file, autogenerated file, etc.
Normally, I'm launching vim
when by current directory (PWD
) is c:\project
:
$ vim <file>
When I use :make
command, my build tool launches and begins the project compilation step. In case of any errors, I'm getting the usual error list in the Quickfix window (:cope
). The problem is that the build tool I'm using (btw, its name is waf
and it's a very nice tool) is executed from the c:\project\build
directory, not c:\project
, so any references to source files will be printed out relatively to c:\project\build
directory. This means that for this file: c:\project\main.cpp
, in case of an error I'l get error message like:
..\main.cpp:9:0: <error message>
Vim's g++
parser takes this error line, extracts the filename from it (..\main.cpp
), but it won't open it after I click enter
, because vim session's PWD
is c:\project
. After clicking enter
, vim tries to open c:\main.cpp
.
I can just start vim from the c:\project\build
directory and it's working, but this in turn causes problems with vim plugins like CtrlP
, so I'd like to start vim session from project's root, not build's root.
So, is it possible to substitute the ..\
to an empty string? I was wondering, because apparently tools like gdb
have some path substitution options (source path substitution).
It turns out it's possible, but outside vim. I've fixed this by creating a build script (m.cmd
):
@echo off
waf 2>&1 | sed "s#^..\\##g"
and I did set :set makeprg=m.cmd
in vim.
It works as expected.