Search code examples
cgccvimvim-quickfix

Vim quickfix: How to open :make entries that were compiled in different directory than vim working directory?


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 ?


Solution

  • 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.