告诉Vim使用自定义.vimrc很容易,但是如何告诉它使用替代路径而不是〜/ .vim?


15

我可以用vim -u filenamefilename的,而不是我的默认.vimrc。即使以超级用户身份运行,在切换用户上下文(su)以使用我的 方法时,我仍在使用此方法.vimrc

我怎样才能达到同样为它默认是文件夹~/.vim,这样我可以指出Vim的命令行到其他文件夹?


我想要实现的目标

好的,假设用户joeHOME=/home/joe)和用户rootHOME=/root)。用户joe有一个别名集vim,看起来像这样(但最初是使用$HOME变量设置的,以使其具有动态性):

alias vim='vim -p -N -n -i NONE -u "/home/joe/.vimrc"'

然后,用户joe按照进行操作sudo su -(但添加了魔法),从而导致加载了.bashrc和其他物品。现在,用户具有与上述设置完全相同的别名。/home/joerootrootvim

问题在于,它.vimrc在各种系统和各种方案中使用。通常会称呼Joe的帐户joe,但有时会类似local.joe或其他名称,从而导致的值不同$HOME。因此,很难对~/.vim文件夹的绝对路径进行编码似乎不是一个好主意。但是,在上述情况下,用户root没有文件夹/root/.vim,但是默认情况下,该文件夹应通过已加载的.vimrc/home/joe/.vimrc)存在。

我想要实现的-最好是在命令行上-是让Vim /home/joe/.vim在启动时从下面使用插件等root(假设alias如图所示设置-其他情况可以忽略)。如果通过VimScript有一些动态方法,请提供指针。$HOME我认为,但是使用诸如这样的变量会导致捕获22。


你可能可以用好老的来完成这个任务ln。像'mv〜/ .vim〜/ .vim-whatever && ln -s〜/ .vim-whatever〜/ .vim`,然后对.vimrc。用bash别名将所有内容包装起来,以便您可以轻松地切换一种方式或其他方式
jar

Answers:


9

Vim在〜/ .vim中查找,因为该目录位于'runtimepath'的默认列表中,缩写为'rtp'。要告诉Vim在其他地方查看,您将必须完全指定一个不同的'rtp'值,或使用例如对replace()的调用来编辑默认值。如果只想让Vim首先在其他位置查找配置文件,则不必关心它是否也在〜/ .vim中查找,也不要关心它不会在目录后的替代文件中查找很简单:

vim --cmd 'set rtp^=alternate_dir'

看到

:help --cmd
:help :set^=

用您的备用目录替换.vim需要更多的输入。

vim --cmd 'let &rtp = substitute(&rtp, "\.vim", "alternate", "g")'

我尝试用~/.vim另一条路径替换,但无法匹配~,所以我继续发布了我所拥有的内容。

编辑

我无法~将“ rtp”的值与匹配的原因是,当获取的值是的值&rtp而不是的输出时:set rtp?,的~值将扩展为用户主目录的完整路径名。~结果不存在。

以下作品。

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'

多谢您抽出宝贵的时间回答。这看起来很有希望。明天我会修补一下,让您知道如何进行。我希望我的VimScript fu更强大,但是我正在努力,这指向了一个有希望的方向。
0xC0000022L13

@ 0xC0000022L:您显示它\\~的工作方式。我认为Bash可以逃脱一次吗?无论如何,这仍然行不通,因为VimScript处理的方式有所不同~
0xC0000022L13

我想我有。注意,:set rtp?显示为“〜/ .vim”,但会:echo &rtp扩展~为完整路径名。以下似乎有效:`vim --cmd'let&rtp = Alternative(&rtp,$ HOME。“ / \。vim”,“ alternate”,“ g”)“。我将更新我的答案。
garyjohn

谢谢,非常有趣和微妙的区别。使某些事情对我的具体情况而言更具问题,但我将接受。这使我更进一步。
0xC0000022L13年

3

在您选择的.vimrc中,您可以指定运行时路径:

let &runtimepath=/path/to/specific/vim/folder

如果您正在使用您的人员,.vimrc则可以将其设置到您的个人.vim目录,并且该目录既可以用作su普通帐户,也可以同时使用。


这并非完全来自命令行。有什么办法可以使这种动态变化吗?瞧,我想如果我$HOME在自己的帐户中使用类似于then的东西,它会解决,/home/joe但仍然是根/root……所以什么都不会赢。这.vimrc应该可以跨平台和Vim版本使用,并且设置绝对路径完全可以解决这个问题。不过,感谢您抽出宝贵的时间来回答。
0xC0000022L13

@ 0xC您已经从命令行指定了vimrc,而这又指定了运行时路径。请注意,在vimrc中,您可以运行脚本来定义变量,因此,如果您以确切的结果编辑问题,我们可能可以找到一种解决方法。
2013年

编辑了我的问题。感谢您的耐心
等候

在用户中.bashrc,您可以设置变量(例如$REALHOME,从中豁免)sudo reset_env,然后将其用作基础rtp吗?
2013年

这听起来像是一个可行的选择。我发现以这种方式走私变量更容易,但是:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.