How do I set up different tab settings for different languages in Vim?

Viewed 24581

In my .vimrc I've got a generic tab setting of two spaces, and I'd like to override that on a per language basic (that is, four for Python, etc, otherwise use the default), but I'm having trouble finding any good example of this.

5 Answers

Just put the settings into the filetype plugin file ~/.vim/ftplugin/LANGUAGE.vim . My ~/.vim/ftplugin/perl.vim contains the lines:

"
" ---------- tabulator / shiftwidth --------------------
"  Set tabulator and shift width to 4 (Perl Style Guide)
"
setlocal  tabstop=4
setlocal  shiftwidth=4
"

These settings will automatically be in effect for each file with file type 'perl' (new or existing).

Typically what you do is set up a special vimrc-type file with the settings for a particular language, and then use autocommands in your main .vimrc to execute the special vimrc when necessary. Here's my configuration for Haskell (.hs, etc.) files:

autocmd! BufNewFile,BufReadPre,FileReadPre  *.hs    so ~/.vim/haskell.vim
autocmd! BufNewFile,BufReadPre,FileReadPre  *.hsc   so ~/.vim/haskell.vim
autocmd! BufNewFile,BufReadPre,FileReadPre  *.lhs   so ~/.vim/haskell.vim
autocmd! BufNewFile,BufReadPre,FileReadPre  *.cabal so ~/.vim/haskell.vim

My ~/.vim/haskell.vim does stuff like "set expandtab" to use spaces instead of tabs, and all sorts of other magic for formatting and things like this. You can often download good versions of these for various languages from http://vim.org and other sites.

Note that you can do a lot more than just change vim settings. For example, you can run the file through a filter before and after editing:

" Edit gpg-encrypted ascii-armoured files
autocmd! BufReadPre,FileReadPre      *.asc  set bin
autocmd  BufReadPost,FileReadPost    *.asc  '[,']!gpg -q -d
autocmd  BufReadPost,FileReadPost    *.asc  set nobin
autocmd! BufWritePre,FileWritePre    *.asc  set bin
autocmd  BufWritePre,FileWritePre    *.asc  '[,']!gpg -e
autocmd  BufWritePost,FileWritePost  *.asc  undo
autocmd  BufWritePost,FileWritePost  *.asc  set nobin
Related