Vim如何进入git根目录?

5

我正在尝试从vim进入我的项目的git根目录,以便我的Ctrl-P正常工作。 我经常在一些项目中工作,我不希望Ctrl-P查找git根目录,因此我设置它仅查找具有.gitignore的最近文件夹。

在命令行中,我可以执行像cd $(git rev-parse --show-toplevel)这样的操作,但是当我尝试使用:!cd $(git rev-parse --show-toplevel)在vim中执行相同的操作时,它会隐藏vim并显示空白输出。 我被告知vim命令行中的!将允许我运行bash命令。 我错过了什么吗?


1
:!cd 不等同于 :cd。此外,Vim 不知道 $(...),请使用 system()。更好的做法是,使用类似于 :exec 'cd' fnameescape(fnamemodify(findfile('.gitignore', escape(expand('%:p:h'), ' ') . ';'), ':h')) 的方式,而不是运行 git - Sato Katsura
谢谢。我将findfile更改为finddir('.git'),因为在这种情况下,我不想查找.gitignore文件,而是要查找整个项目的git根目录。如果您将此作为实际答案,我会接受。 - adam-beck
2个回答

9

您可以使用反引号来运行shell命令,并将输出管道传输到Vim命令中,例如:cd

:cd %:h | cd `git rev-parse --show-toplevel`

这将把当前目录设置为当前文件的目录,然后使用git rev-parse --show-toplevel命令获取git目录,并运行:cd命令。

或者,如果您使用fugitive.vim插件,您可以使用:Gcd命令。

如需更多帮助,请参阅:

:h :cd
:h backtick-expansion
:h :bar

1
没有 fnameescape()。调皮,调皮。 ;) - Sato Katsura
3
:Gcd正是我想要的。我正在使用Fugitive,所以它在我的情况下有效。我点了赞,但选择了Sato的答案,因为它适用于那些没有Fugitive的人。 - adam-beck
1
@SatoKatsura,你是正确的:Gcd针对当前文件%有效。但是,如果您在git控制的目录中启动Vim,它也可以作为特殊情况工作。 - Peter Rincker
1
回复:fugitive:当然,但是如果你从项目的目录开始,就不需要使用:Gcd命令了。 fugitive在内部处理上令人惊讶地笨拙... - Sato Katsura
1
:echo is looking for a valid expression. Using backticks to run a shell command only really work on vim command which look for files e.g. :find. See :h backtick-expansion & :h expression. You are likely looking for :pwd or getcwd(). e.g. :echo getcwd() - Peter Rincker
显示剩余4条评论

4

一种实现方法:

:exec 'cd' fnameescape(fnamemodify(finddir('.git',
    \ escape(expand('%:p:h'), ' ') . ';'), ':h'))
escape(..., ' ') 是用于封闭 finddir() 的必要条件。 fnameescape() 确保 cd 不会因为特殊字符而报错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接