vim设置工作目录

bas*_*eln 6 vim working-directory

当我在Vim中切换缓冲区时(使用:bn和:bp),我希望它自动设置工作目录,但不要是打开文件的目录.我希望Vim向上递归搜索一个名为"tags"的文件,当它找到该文件时,将工作目录设置为带有"tags"文件的目录.

例:

:e ~/programming/projects/foobar/src/js/scripts.js
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,"foobar"是一种"项目根".我们假设"tags"文件位于foobar目录中.现在Vim应该查看"js",但是没有标签文件.然后它应该在"src"中查找,那里没有标签文件.然后它应该查看"foobar"并找到"tags"文件,然后执行:

:cd ~/programming/projects/foobar/
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?:)

vst*_*stm 4

如果您的全部目的是获得正确的“标签”文件,那么这可以更容易完成:

set tags=./tags,tags;$HOME/programming,$HOME/programming/your/global/tags
Run Code Online (Sandbox Code Playgroud)

tags选项接受逗号(或空格)分隔的条目列表。在我的示例中,我有以下条目:

  • ./tagstags这意味着它应该首先在当前目录中查找-file
  • tags;$HOME/programmingtags这意味着从当前目录查找-file $HOME/programming(这就是分号的作用,请参阅file-searching)。如果您没有使用分号指定“stop”目录,那么它将搜索到根目录/
  • $HOME/programming/your/global/tags最后这是一个由绝对文件名引用的标签文件

从你的描述来看,我的例子对于你的目的来说可能有点过分了,你只需要这个:

set tags=tags;$HOME/programming
Run Code Online (Sandbox Code Playgroud)

但是如果你确实需要更改工作目录,那么你可以将类似这样的内容(如果必须的话更改lcd为)添加到你的 .vimrc 中:cd

au BufNewFile,BufRead *.js execute ":lcd " . fnamemodify(findfile("tags", ".;"), ":p:h")
Run Code Online (Sandbox Code Playgroud)