I'm diving into the quickfix list of Vim that looks quite awesome, however I am not being able to exploit this because of a relative path problem. Explanation:

My Vim window path is .

I have a custom make command in Vim:

:set makeprg=west\ build\ -b\ nucleo_l552ze_q\ .\

The west program will use CMake and gcc to compile my project. But here is the thing: it changes the current directory to ./build.

So, in Vim, when I run

:make

the quickfix list is filled with references like ../src/main.c instead of src/main.c

As a result, when I try to open a file from the quickfix list, Vim creates a new file using make's relative path instead of opening the file I wanted based on the Vim working directory.

enter image description here

My question is: How do I open :make entries that were compiled in different directory than the vim working directory?

Is it possible to change the root path of the quickfix list after running the make command ?

3

There are 3 best solutions below

0
On BEST ANSWER

This vimscript file allows you to open the current entry in the quickfix window in a new tab, complete with substituting the make path with the vim path.

Create a file with exactly this path ~/.vim/after/ftplugin/qf.vim, then put this in the file:

" Get current list of quickfix entries "
" s: - script variable (local to this file) "
let s:qfw_entries = getqflist()

function! CreateTab()
    let l:current_line_no = line('.')
    let l:entry = s:qfw_entries[l:current_line_no - 1]
    let filepath = substitute(bufname(l:entry.bufnr), "../", "", "")
    if l:entry.valid
        " Close quickfix window "
        cclose
        lclose
        pclose

        " Open new tab "
        execute 'tabnew +'.l:entry.lnum.' '.filepath
    endif
endfunction

" Remaps the enter key to call CreateTab() on the current entry in quickfix "
nnoremap <buffer> <CR>    :call CreateTab()<CR>

The file path means this script will load in after the default qf files and the ftplugin means this stuff only modifies the quickfix filetype. This can be modified to open new windows, splits, and use different hotkeys if desired. This substitution will only work if the build path of make is always in the same location.

1
On

IMO, it is easier to do :lcd build in your quickfix buffer to set the current working directory as seen by the tool.

Also, if your "west" tool is capable to print messages as it walks directory tree then quickfix is capable of parsing them too. BTW. this is how quickfix tracks GNU make current directory out-of-the-box. See :h errorformat, :h quickfix-directory-stack etc.

3
On

You could probably use :help getqflist() to retrieve the quickfix list, :help map() over it to change the value of filename or module with :help fnamemodify(), and set the quickfix list again with :help setqflist().