Vim quickfix:如何打开在与 vim 工作目录不同的目录中编译的 :make 条目?

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

我正在研究 Vim 的 quickfix 列表,它看起来非常棒,但是由于相对路径问题,我无法利用它。解释:

我的Vimwindow路径是.

我在 Vim 中有一个自定义 make 命令:

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

west程序将使用CMake和gcc来编译我的项目。但事情是这样的:它将当前目录更改为 ./build.

所以,在Vim,当我运行

:make

quickfix 列表充满了像 ../src/main.c 这样的引用而不是 src/main.c

因此,当我尝试从 quickfix 列表中打开文件时,Vim 使用 make 的相对路径创建了一个新文件,而不是根据Vim 工作目录。

我的问题是:如何打开在与 vim 工作目录不同的目录中编译的 :make 条目?

运行执行 make 命令后是否可以更改 quickfix 列表的根路径?

您可以使用 :help getqflist() 来检索快速修复列表,:help map() 在它上面用 :help fnamemodify() 更改 filenamemodule 的值,并使用 :help setqflist().

再次设置 quickfix 列表

IMO,在您的 quickfix 缓冲区中 :lcd build 设置工具看到的当前工作目录更容易。

此外,如果您的“west”工具能够在遍历目录树时打印消息,那么 quickfix 也能够解析它们。顺便提一句。这就是 quickfix 跟踪 GNU 使当前目录开箱即用的方式。参见 :h errorformat:h quickfix-directory-stack

此 vimscript 文件允许您在新选项卡中打开 quickfix window 中的当前条目,完成后将 make 路径替换为 vim 路径。

使用此路径创建文件 ~/.vim/after/ftplugin/qf.vim,然后将其放入文件中:

" 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>

文件路径表示此脚本将加载 after 默认 qf 文件,ftplugin 表示此内容仅修改 quickfix 文件类型。如果需要,可以修改它以打开新的 windows、拆分和使用不同的热键。此替换仅在 make 的构建路径始终位于同一位置时才有效。