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
我的机器上有一个 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