Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为不同的工作目录加载不同的.vimrc文件?_Vim - Fatal编程技术网

如何为不同的工作目录加载不同的.vimrc文件?

如何为不同的工作目录加载不同的.vimrc文件?,vim,Vim,对于每个工作目录,我有不同的选项。我不想每次工作时都设置这些选项。我知道我可以为选项附加vimrc文件,但我不想在每个目录中使用相同的配置。这种情况我该怎么办 示例: 对于javascript项目,我想从~/.vimrc_js 对于Python项目,我想从~/.vimrc\u py文件类型插件加载设置 这是您可能正在寻找的,并且是一种非常简洁的方法。您需要在vimrc中将文件类型插件设置为on,以使其正常工作。然后必须在~/.vim/ftplugin/.vim处创建一个文件,该文件将针对使用该语

对于每个工作目录,我有不同的选项。我不想每次工作时都设置这些选项。我知道我可以为选项附加
vimrc
文件,但我不想在每个目录中使用相同的配置。这种情况我该怎么办

示例

对于javascript项目,我想从
~/.vimrc_js

对于Python项目,我想从
~/.vimrc\u py

文件类型插件加载设置 这是您可能正在寻找的,并且是一种非常简洁的方法。您需要在vimrc中将
文件类型插件设置为on
,以使其正常工作。然后必须在
~/.vim/ftplugin/.vim
处创建一个文件,该文件将针对使用该语言的任何缓冲区自动加载

例如,不要将JavaScript设置写入
~/.vimrc_js
,而是将它们写入
~/.vim/ftplugin/JavaScript.vim

自动驾驶
autocmd
是根据特定语言设置内容的最简单方法:

autocmd Filetype <language> <setting>
通过使用管道将多个设置分隔开,可以一次设置多个设置,这些设置很快就会变得不实用:

autocmd FileType php setlocal shiftwidth=4 tabstop=4|let php_sql_query=1
AutoCMD+源 在极少数情况下,您可能有足够的设置来保证一个单独的文件,但希望为多种语言加载它们。使用文件类型插件,您将得到重复的文件或符号链接

一个简单的替代方法是退回到autocmd,但您不必在一行中写入设置,而是可以生成一个文件。例如:

autocmd FileType markdown,tex,textile source ~/.vim/lang_settings/text.vim

如果每个项目都使用不同的语言,那么Jamie Schembri描述的内置文件类型插件(ftplugin)机制就可以正常工作。如果同一类型的文件确实需要不同的设置,请继续阅读:

中心配置 如果可以集中配置本地异常,则可以将此类AutoCMD放入
~/.vimrc

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4
另一方面,如果希望将特定配置与项目一起存储(并且不希望通过Modeline将其嵌入所有文件),则有以下两个选项:

具有内置功能的本地配置 如果总是从项目根目录启动Vim,则内置

:set exrc
启用从当前目录读取
.vimrc
文件。您可以在其中放置
:set ts=4 sw=4
命令

通过插件进行本地配置 否则,您需要插件的帮助;在vim.org上有几个;我可以推荐,它甚至允许特定于本地文件类型的配置


请注意,从文件系统读取配置有安全隐患;您可能需要
:设置安全

另一个解决方案是。它为不同的项目或文件类型设置编码样式。它与Vim一起工作,但它与编辑器无关,因此您可以将
.editorconfig
文件与其他文本编辑器(SublimiteText2、Notepad++、Vim、Emacs、Textmate、Gedit)或IDE(基于idea的IDE、RubyMine、PHPStorm、Visual Studio)一起使用。

您可以尝试该插件。它尝试将
.lvimrc
加载到您的项目目录或上面的目录中。您可以将每个项目的设置放在那里。

这里有另一个选项,类似于@Ingo Karkat的第一个建议,只是它允许您为每个工作目录拥有单独的vimrc文件(这更接近于OP的问题)。它比使用一个可用的插件有点黑客,但它确实避免了localvimrc插件的安全问题,并允许您将所有vimrc变体存储在主目录中,而不是分散在不同的工作目录中(不过,如果您将它们放在每个相关工作目录的根目录中,也同样有效

In.vimrc

if getcwd() =~ 'One Unique Target Directory'
  source ~/.one_unique_vimrc
elseif getcwd() =~ 'Another Unique Target Directory'
  source ~/.another_unique_vimrc
endif
挑战在于,您需要将一个vimrc定位到一个唯一的路径——因此这在下面的目录结构中无法很好地工作——如果您有一个用于Foo的vimrc和一个用于Baz的vimrc,则会出现一些不一致的行为(“为什么/Baz/Foo使用my/Foo vimrc?!”)

但它可以很好地与这样的目录结构配合使用

/Projects/My Greatest App/
/Projects/My Greatest App/src
/Projects/My Greatest App/bin
/Projects/unique.net/
/Projects/unique.net/index.html
/Projects/unique.net/.htaccess

其中一个vimrc用于“我最棒的应用程序”,另一个用于独特的网站

alert!看起来很像您需要的是特定于文件类型的设置,而不是特定于目录的设置。@Romaill这只是一个示例。我还需要许多特定于目录的设置,例如我想在这个项目中包含的字典。很抱歉,让它变得不清楚
:set secure
完全没有用处:只需将
调用feedkeys(“:!echo 1>2\n”)
放入
.exrc
中,然后观察文件
2
的出现。因此,您可以确定所有此类文件都只从可信来源显示,或者从不使用
set exrc
。不,我错了。它完全没有用处,因为“在Unix上,仅当“.vimrc”或“.exrc”不归您所有时才使用此选项。”:这允许
调用feedkeys()
,而不管
设置安全
。另一种绕过
设置安全
的有趣方法是:
让g:http\u netrw\u cmd=“下载和启动远程shell的某些cmd”
假设知道目标使用netrw查看远程文件;
命令-nargs=?-bar AuV:execute“!some cmd…”|AuVimDiff
假设您知道目标正在使用aurum及其
AuVimDiff
命令等。最好知道“安全”是无用的,然后再依赖它的功能。如果文件中出现恶意构造,则是90%的目标攻击。
set secure
对此类攻击无效。它也同样无用st恶意构造推送到公共存储库:克隆VCSE后,将当前用户指定为工作目录中文件的所有者,从而绕过Unix系统上的
set secure
。+1表示
set exrc
。我觉得每个人都把这个问题复杂化了,远远超过了显而易见的问题
/Foo
/Foo/Bar
/Foo/Bar/Baz
/Baz
/Baz/Quux
/Baz/Foo
/Projects/My Greatest App/
/Projects/My Greatest App/src
/Projects/My Greatest App/bin
/Projects/unique.net/
/Projects/unique.net/index.html
/Projects/unique.net/.htaccess