Multiple autocommands in vim

Vim

Vim Problem Overview


I've got some sections in my .vimrc that look like this:

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

now it seems I can convert them to this:

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

but here's my question: is there a vim way to have a structure like this?

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

ie, can the autocmd Filetype bit somehow be made to address a group of actions? (this is a simple example, I'm really asking for more complicated situations.)

Vim Solutions


Solution 1 - Vim

You can call a function, if you like:

autocmd Filetype ruby call SetRubyOptions()
function SetRubyOptions()
    setlocal ts=2
    ...
endfunction

Solution 2 - Vim

You can chain most commands with |:

au Filetype ruby
            \ setlocal ts=2  |
            \ setlocal sts=2 |
            \ ...

Not sure if this syntax is better or worse than writing a function. Some commands can't be chained like this, but you can use execute to get around that; see :h :bar.

Also see :h line-continuation for an explanation of the weird syntax with the \ at the beginning of the lines.

Solution 3 - Vim

ftplugins are the neat answer to your question.

  1. Ensure your .vimrc has a line such as :filetype plugin on
  2. Define a file named {rtp}/ftplugin/{thefiletype}.vim or {rtp}/ftplugin/{thefiletype}/whatever.vim (see :h rtp for more details).
  3. Edit this new file and put your VIM commands in there. It is probably a good idea to use the :setlocal command to ensure filetype-specific settings are only for that file (e.g., don't turn all comments purple across all filetypes).

See examples in vim distribution if you plan to override default settings ; or among the many ftplugins I wrote otherwise), just write down your :setlocal, :*map <buffer>, etc. definitions.

It represents some more line to type, but at least, it does scale.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPeterView Question on Stackoverflow
Solution 1 - VimLucas OmanView Answer on Stackoverflow
Solution 2 - VimBrian CarperView Answer on Stackoverflow
Solution 3 - VimLuc HermitteView Answer on Stackoverflow