在vim中使用多个自动命令

81

我的.vimrc文件中有一些这样的部分:

autocmd Filetype ruby setlocal ts=2
autocmd Filetype ruby setlocal sts=2
autocmd Filetype ruby setlocal sw=2

现在看起来我可以将它们转换为这样:

autocmd Filetype ruby setlocal ts=2 sts=2 sw=2

但是我的问题是:是否有一种 Vim 的方法可以实现这样的结构?

<something mentioning Filetype ruby>
  setlocal ts=2
  setlocal sts=2
  ...
<end>

比如说,autocmd FileType 一定要单独指定每个操作吗?有没有办法让它同时应用于一组操作呢?(这只是一个简单的例子,我实际上想问更加复杂的情况。)

3个回答

95
可以调用一个函数,如果你愿意的话:
autocmd Filetype ruby call SetRubyOptions()
function SetRubyOptions()
    setlocal ts=2
    ...
endfunction

嗯,这很不错 - 谢谢 - 但有没有办法再紧凑一些(即,消除命名和引用函数的需要)? - Peter
11
尽管这会很好,但是Vim脚本不支持lambda表达式 :P - Lucas Oman
@Peter - 不是的。这已经是最紧凑的了。 - Thomas Geritzma
8
未来来信:Vim 8.0 支持 lambda 表达式。 - Will

80
您可以使用|将大多数命令链接在一起:
au Filetype ruby
            \ setlocal ts=2  |
            \ setlocal sts=2 |
            \ ...

不确定这种语法是比编写函数更好还是更差。有些命令无法像这样链接,但是您可以使用execute来解决这个问题; 参见 :h :bar

另请参阅:h line-continuation,了解带有\的奇怪语法的说明。


24

ftplugins是你问题的完美解决方案。

  1. 确保你的.vimrc文件中有这样一行代码::filetype plugin on
  2. 定义一个名为{rtp}/ftplugin/{thefiletype}.vim{rtp}/ftplugin/{thefiletype}/whatever.vim 的文件(有关详细信息,请参见:h rtp)。
  3. 编辑这个新文件,并将VIM命令放在其中。使用 :setlocal 命令来确保针对特定文件类型的设置仅适用于该文件(例如,不要在所有文件类型中将所有注释变成紫色)。

如果你打算覆盖默认设置,请参考vim分发中的示例或者我写的许多ftplugins之一 ,并编写你的:setlocal:*map <buffer>等定义。

尽管需要输入更多的命令,但至少它可以扩展。


唯一不好的事情是ftplugins会将你的vimrc分成几十个文件,这样在电脑之间复制就不太方便了。 - Brian Carper
2
ftplugins比单个庞大的.vimrc更易于分发和共享。当配置变得丰富和复杂时,我们无法将所有内容都维护在一个文件中(请参见我的C++套件 - 我还为其他语言编写了类似但更简单的配置)。顺便说一句,我没有十几个(非标准)ftplugins,而是78个。其中只有9个我不再维护。我很高兴没有将它们的定义放在我的.vimrc中。 此外,将自己的配置复制到各种计算机上就像调用find + xarg + tar一样简单。 - Luc Hermitte
我已经创建了自己的插件,其中包含一个 ftplugin 目录,该目录包含每个文件类型特定配置的 <FileType>.vim 文件,并将此插件作为捆绑包添加到我的 Vundle 设置中。这样,某些文件类型的配置将保存在它们自己的文件中,并且当激活我的 Vundle 设置时,我将自动获取这些配置。 - joelpet

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