0

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

我的 Vim 窗口路径是.

我在 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 命令后是否可以更改快速修复列表的根路径?

4

3 回答 3

4

您可能可以使用:help getqflist()检索快速修复列表,:help map()在其上更改filenamemodule的值:help fnamemodify(),并使用 再次设置快速修复列表:help setqflist()

于 2021-03-26T15:38:29.980 回答
2

:lcd buildIMO,在您的快速修复缓冲区中设置工具所看到的当前工作目录更容易。

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

于 2021-03-26T16:28:13.170 回答
1

此 vimscript 文件允许您在新选项卡中打开 quickfix 窗口中的当前条目,并用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 文件类型。如果需要,可以修改它以打开新窗口、拆分和使用不同的热键。仅当 make 的构建路径始终位于同一位置时,此替换才有效。

于 2021-03-27T17:03:58.947 回答