Emacs-ifying vim's autoindent

Tagged:  •    •  

I switch very often between Emacs and vim for my editing, and for this reason I've set up Emacs to use viper (vi emulation) and a couple more hacks that emulate vim's visual mode as well.

However, I've always been dissatisfied with the way vim's autoindent works. I find Emacs's usage of Tab to indent the current line very easy to use and intuitive. I ended up disabling it completely; recently I found a hint in the cinkeys-format help entry about setting up Emacs-style autoindent, and even though my vimrc skills are close to zero, I managed to improve it to behave more or less as in viper.

First of all, I make Tab have the desired effect in insert mode by putting this in my .vimrc file (this is the part I found in vim's help):

set cinkeys=0{,0},0),0#,!<Tab>,;,:,o,O,e
set indentkeys=!<Tab>,o,O

Then I add a new normal mode command for <Tab> like this: it goes into insert mode just to do <Tab> and then moves to the first non-space character of the line:

map <Tab> i<Tab><Esc>^

To enable autoindent completely, you need a couple more options to set the per-type indentation and to set up the C indentation options to the style you like by default, for example:

filetype indent on
set cinoptions=:0,(0,u0,W1s

These cinoptions correspond to kernel-style indentation, not GNU-style. For GNU-style you need

set cinoptions={1s,>2s,e-1s,^-1s,n-1s,:1s,p5,i4,(0,u0,W1s shiftwidth=2

and it's fun to see why it works. :-)

Unfortunately, this is still not enough because some ill-behaved vim files reset indentkeys instead of adding to it. For this I used the following shell snippet:

for i in tcl gitconfig ruby html xml php rst css make dtd xinetd yacc; do
  echo 'setlocal indentkeys+=!<Tab>' > .vim/after/indent/$i
done

This does not cover all vim format files, just the ones I'm somewhat likely to ever use.

Thank you so much for this ... I quit using vim for a while just because I didn't have the tab auto-indent

Put

autocmd FileType * setlocal indentkeys+=!<Tab>

in your .vimrc instead of putting a zillion one-liner files in .vim/after.

Aristotle Pagaltzis

User login