I use several different programming languages every day, and I'd like to have different tab widths (in spaces) for each. For example: I use the "standard" 2 spaces for Ruby, but all our existing Matlab code uses 4 spaces.
I have this from my personal ~/.vimrc
:
augroup lang_perl
au!
set tabstop=4 " tabstop length N in spaces
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs
augroup END
augroup lang_ruby
au!
set tabstop=2 " tabstop length N in spaces
set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs
augroup END
Those work, but the following doesn't:
augroup lang_matlab
au!
set tabstop=4 " tabstop length N in spaces
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs
augroup END
I really don't understand how augroup lang_ruby
figures out that I'm editing a Ruby file. (My searches brought up ftdetect
, but the solution wasn't obvious.) It doesn't seem like vim
knows that I'm editing Matlab using augroup lang_matlab
. What do I change to make this work?
If you want to have a large number of settings for {filetype}, you should put them into ~/.vim/ftplugin/{filetype}.vim
or into file that matches ~/.vim/ftplugin/{filetype}/**/*.vim
(examples: ~/.vim/ftplugin/ruby/foo.vim
, ~/.vim/ftplugin/ruby/foo/bar.vim
). In this case you don't need any autocommands at all. If you still want to use autocommands, use the following:
augroup lang_matlab
autocmd!
autocmd FileType matlab setlocal ts=4 sw=4 et
augroup END
. Note two things: FileType event (it is there and it is not BufRead,BufNewFile) and setlocal
instead of plain set
. First is intended to be used for filetype settings, second is how buffer-specific options must be set.
About why perl and ruby settings work and why matlab settings does not: your example code is just the same as
augroup lang_perl
autocmd!
augroup END
augroup lang_ruby
autocmd!
augroup END
set tabstop=4 " tabstop length N in spaces
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs
set tabstop=2 " tabstop length N in spaces
set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs
So, you effectively set ts=2 sw=2 et
. But the $VIMRUNTIME/ftplugin/perl.vim
contains the following code:
setlocal tabstop=4
setlocal shiftwidth=4
so, ts=4 sw=4
for perl is set into ftplugin/perl.vim
, not in your vimrc (if you have installed perl-support plugin). You can check it by replacing tabstop=4
with tabstop=8
in vimrc.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With