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()
更改 filename
或 module
的值,并使用 :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 的构建路径始终位于同一位置时才有效。
我正在研究 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()
更改 filename
或 module
的值,并使用 :help setqflist()
.
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 的构建路径始终位于同一位置时才有效。