如何从项目根目录运行vim命令/脚本?

如何从项目根目录运行vim命令/脚本?,vim,ctags,Vim,Ctags,我有许多命令不希望在当前目录中运行,而是希望在项目根目录中运行。i、 e.查找目录,直到找到某个根的指示,例如.git目录 例如,在我的所有项目上运行vimgrep-r(递归),或者在整个项目上递归地运行标记生成 我怎样才能找到那条路?我发现的唯一一个关闭指示是:set tags=./tags~/项目 但这只是将字符串原样保存到标记中。为所描述的用例分配类似的内容,可以逐字逐句地获取字符串 非常感谢您的帮助! 谢谢 我使用插件设置项目相关变量。然后,我使用(/write)插件,这些插件依赖于(缓

我有许多命令不希望在当前目录中运行,而是希望在项目根目录中运行。i、 e.查找目录,直到找到某个根的指示,例如.git目录

例如,在我的所有项目上运行vimgrep-r(递归),或者在整个项目上递归地运行标记生成

我怎样才能找到那条路?我发现的唯一一个关闭指示是:set tags=./tags~/项目 但这只是将字符串原样保存到标记中。为所描述的用例分配类似的内容,可以逐字逐句地获取字符串

非常感谢您的帮助! 谢谢

我使用插件设置项目相关变量。然后,我使用(/write)插件,这些插件依赖于(缓冲区/项目)-局部变量来完成任务。(不幸的是,大多数插件都依赖于全局变量,这不是在多项目会话中将其行为专门化到当前项目的最佳选择)

关于CTAG的生成,在使用中需要

关于grepping,和其他一样,我通常从当前目录开始,它通常是我项目的根目录。但您也可以很容易地拥有一个插件/命令,该插件/命令可以运行如下内容:

exe "vimgrep -r ".pattern." ".
  \ map(file_extensions, 
  \     string(lh#option#get('project_root_directory').'/**').'v:val')
编辑:

如果您不需要其他配置文件,并且如果
.git/
目录足以标识您的项目根目录,那么您可以使用这种功能来获取项目根目录:

function! ProjectRootDirectory()
   return fnamemodify(finddir('.git', '.;'), ':h')
endfunction
然后,当您运行ctags时,您必须根据这个vim函数的结果执行ctags。我不知道你现在使用哪个插件来运行CTAG。我的lh标签不支持通过其配置变量实现的功能。如果需要,可以轻松添加它。
但是,我看不到一种简单的方法可以从
.vimrc
配置
&tags
一次,以便在每个项目的基础上配置此设置。

我使用插件设置项目相关变量。然后,我使用(/write)插件,这些插件依赖于(缓冲区/项目)-局部变量来完成任务。(不幸的是,大多数插件都依赖于全局变量,这不是在多项目会话中将其行为专门化到当前项目的最佳选择)

关于CTAG的生成,在使用中需要

关于grepping,和其他一样,我通常从当前目录开始,它通常是我项目的根目录。但您也可以很容易地拥有一个插件/命令,该插件/命令可以运行如下内容:

exe "vimgrep -r ".pattern." ".
  \ map(file_extensions, 
  \     string(lh#option#get('project_root_directory').'/**').'v:val')
编辑:

如果您不需要其他配置文件,并且如果
.git/
目录足以标识您的项目根目录,那么您可以使用这种功能来获取项目根目录:

function! ProjectRootDirectory()
   return fnamemodify(finddir('.git', '.;'), ':h')
endfunction
然后,当您运行ctags时,您必须根据这个vim函数的结果执行ctags。我不知道你现在使用哪个插件来运行CTAG。我的lh标签不支持通过其配置变量实现的功能。如果需要,可以轻松添加它。
但是,我看不到一种简单的方法可以从
.vimrc
配置
&tags
一次,以便在每个项目的基础上配置此设置。

避免“更改工作目录”或区分“工作目录和项目根目录”,因为几乎没有工具准备好正确处理这些概念

唯一可以使用的工具(例如git)是那些不关心当前目录的工具

否则,试图让一切正常运转而不产生不良副作用是疯狂的。“工作目录”是一个非常基本的概念,甚至在运行的程序中都无法尝试更改

最好的方法是在目录中打开一个新的Vim会话,在那里你想做“本地”的事情,然后切换回“项目”会话来运行项目命令。Vim将保护您避免在另一个会话中意外覆盖更改

另一种方法是将命令包装在shell中,这样它们就可以拥有自己的工作目录,例如:

:!cd ../../..; ctags -R
(这将允许您为项目重新生成标记文件,而不仅仅是当前目录)

或:

但是,任何具有文件名的输出都是相对于该根目录的,而不是当前根目录的

因此,您可能更愿意:

:!cd ../../..; vim
它在当前会话中创建一个新的Vim会话,但在根目录的上下文中

或者,您可能更喜欢相反的方式(假设Vim在项目根目录中运行):

这使您可以在当前文件的目录中工作,并且您必须退出到主会话才能再次运行项目范围的工具

因此,您不是在“更改”目录,而是在“更改vim会话”(通过拥有2个会话或像上面那样在另一个会话中“嵌套”)

避免“更改工作目录”或区分“工作目录和项目根目录”,因为几乎没有工具准备好正确处理这些概念

唯一可以使用的工具(例如git)是那些不关心当前目录的工具

否则,试图让一切正常运转而不产生不良副作用是疯狂的。“工作目录”是一个非常基本的概念,甚至在运行的程序中都无法尝试更改

最好的方法是在目录中打开一个新的Vim会话,在那里你想做“本地”的事情,然后切换回“项目”会话来运行项目命令。Vim将保护您避免在另一个会话中意外覆盖更改

另一种方法是将命令包装在shell中,这样它们就可以拥有自己的工作目录,例如:

:!cd ../../..; ctags -R
(这将允许您为项目重新生成标记文件,而不仅仅是当前目录)

或:

但是,任何具有文件名的输出都是相对于该根目录的,而不是当前根目录的

因此,您可能更愿意:

:!cd ../../..; vim
它在当前会话中创建一个新的Vim会话,但在根目录的上下文中