Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Autocommands for Matlab in vim?

Tags:

vim

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?

like image 326
Benjamin Oakes Avatar asked Nov 05 '22 15:11

Benjamin Oakes


1 Answers

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.

like image 175
ZyX Avatar answered Nov 11 '22 17:11

ZyX