9

我在 Vim 中创建了一个为我编译一些东西的函数。它看起来像这样:

function! MyFunc(mode)
  lcd ./build
  pwd
  let &makeprg='the_command some_script_file'
  let &errorformat='some format'.','
  let &errorformat.='%-G%.%#'
  silent make
  lcd ..
  cwindow
endfunction

我通常在项目目录中打开vim,然后我可以运行这个函数,其中cd 进入build,构建它,然后cd 回来,所以我留在我的项目目录中。

但是,有时,当构建失败并打开 quickfix 窗口时,它会显示相对于我的项目目录的文件名(耶),但有时在同一个文件中,它会显示绝对路径。构建脚本的输出总是显示相对路径,vim 正确处理这两个路径,即它找到了正确的文件。

我怀疑路径处理是负责任的。我的问题是,有什么问题,有没有更好的方法来处理切换到构建目录并返回?我总是希望显示相对路径。

谢谢!!

4

2 回答 2

5

我认为这与lcd. 当从您的函数打开快速修复窗口时,它将从当前窗口继承本地目录。但是当从其他任何地方(或在运行您的函数之前)打开快速修复窗口时,它将保留全局工作目录。当不匹配时,Vim 必须显示绝对路径。

如果您确实需要使用:lcd,最好使用位置列表 ( :lmake),因为它也是窗口本地的。但是我会首先尝试使用 global :cd,因为无论如何切换只是暂时的,而且到目前为止您并不关心恢复实际的原始值。

于 2012-10-30T15:04:43.317 回答
1

正如 Ingo 指出的那样,路径是相对于 quickfix 窗口的当前目录的,该目录是从前一个窗口继承的。

您可以autocmd QuickFixCmdPre在执行 make 之前使用它来设置正确的路径。

如果您使用Project Root 插件,请将以下内容添加到您的.vimrc

augroup changeQfCmdDir
   au!
   autocmd QuickFixCmdPre make ProjectRootCD
augroup END

,那么quickfix窗口的路径会在被a填充之前被修正:make(你也可以指定一些其他使用quickfix窗口的命令:)grep,lgrep,cscope

于 2014-01-30T18:50:57.303 回答