如何从项目根目录运行vim命令/脚本?
我有许多命令不希望在当前目录中运行,而是希望在项目根目录中运行。i、 e.查找目录,直到找到某个根的指示,例如.git目录 例如,在我的所有项目上运行vimgrep-r(递归),或者在整个项目上递归地运行标记生成 我怎样才能找到那条路?我发现的唯一一个关闭指示是:set tags=./tags~/项目 但这只是将字符串原样保存到标记中。为所描述的用例分配类似的内容,可以逐字逐句地获取字符串 非常感谢您的帮助! 谢谢 我使用插件设置项目相关变量。然后,我使用(/write)插件,这些插件依赖于(缓冲区/项目)-局部变量来完成任务。(不幸的是,大多数插件都依赖于全局变量,这不是在多项目会话中将其行为专门化到当前项目的最佳选择) 关于CTAG的生成,在使用中需要 关于grepping,和其他一样,我通常从当前目录开始,它通常是我项目的根目录。但您也可以很容易地拥有一个插件/命令,该插件/命令可以运行如下内容:如何从项目根目录运行vim命令/脚本?,vim,ctags,Vim,Ctags,我有许多命令不希望在当前目录中运行,而是希望在项目根目录中运行。i、 e.查找目录,直到找到某个根的指示,例如.git目录 例如,在我的所有项目上运行vimgrep-r(递归),或者在整个项目上递归地运行标记生成 我怎样才能找到那条路?我发现的唯一一个关闭指示是:set tags=./tags~/项目 但这只是将字符串原样保存到标记中。为所描述的用例分配类似的内容,可以逐字逐句地获取字符串 非常感谢您的帮助! 谢谢 我使用插件设置项目相关变量。然后,我使用(/write)插件,这些插件依赖于(缓
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会话,但在根目录的上下文中
或