Vim: 从祖先项目目录开始编辑文件

Vim: Edit file starting from ancestor project directory

我的机器上有一个 git 存储库的多个工作目录,当我在 vim 中打开每个文件时,我希望能够打开一个新文件,从包含当前缓冲区文件的顶级项目目录。

例如,假设我在缓冲区中打开了这些文件:

~/testing/MyProject/src/main.cc
~/mirror/MyProject/src/lib/module.h

如果我正在编辑 module.h 缓冲区,我希望能够键入 :e <something?> 并让它自动完成 ~/mirror/MyProject/

我通过在 .vimrc:

中添加 cabbr <expr> / 来让它工作
" Makes // expand to the containing MyProject directory.
cabbr <expr> / FindMyProjectInPath()

function FindMyProjectInPath()
  let path=expand("%:p:h")
  while path != "/" && fnamemodify(path,":t") != "MyProject"
    let path = fnamemodify(path, ":p:h:h")
  endwhile

  return path
endfunction

因此,如果我正在编辑 ~/mirror/MyProject/src/lib/module.h,我可以输入 :e //,它会扩展为 :e ~/mirror/MyProject/

如果我不在 MyProject 目录中,它将保持 //:如果我正在编辑 ~/other_project/main.cpp,则 :e // 不会展开。

您键入的第一个 /cabbr <expr> / 匹配,第二个使其展开。

您也可以使用变量来允许在编辑时动态设置 "MyProject"。

曾经常用的方法是将当前工作目录设置为项目的根目录。

但是,如果您确实更改了当前的工作目录,那么您可能需要查看类似 fugitive.vim:Gedit 命令的内容,该命令可用于编辑与存储库根目录相关的文件。例如:Gedit /foo.txt