created February 24, 2001 · complexity basic · author Yegappan · version 5.7
To insert space characters whenever the tab key is pressed, set the 'expandtab' option:
:set expandtab
With this option set, if you want to enter a real tab character use Ctrl-V<Tab> key sequence.
To control the number of space characters that will be inserted when the tab key is pressed, set the 'tabstop' option. For example, to insert 4 spaces for a tab, use:
:set tabstop=4
After the 'expandtab' option is set, all the new tab characters entered will be changed to spaces. This will not affect the existing tab characters. To change all the existing tab characters to match the current tab settings, use
:retab
To change the number of space characters inserted for indentation, use the 'shiftwidth' option:
:set shiftwidth=4
For example, to get the following coding style,
- No tabs in the source file
- All tab characters are 4 space characters
use the following set of options:
:set tabstop=4 :set shiftwidth=4 :set expandtab
Add the above settings to your .vimrc file.
References
Comments
I use this to highlight tabs and trailing spaces:
set list listchars=tab:»·,trail:·
To turn off expandtab for editing makefiles, I put the following in my .vimrc:
au FileType make setlocal noexpandtab
To use this mode only for python add the following to ~/.vimrc
autocmd FileType * set tabstop=2|set shiftwidth=2|set noexpandtab autocmd FileType python set tabstop=4|set shiftwidth=4|set expandtab
I also add the following line:
set softtabstop=4 " makes the spaces feel like real tabs
This makes the backspace key treat the four spaces like a tab (so one backspace goes back a full 4 spaces).
I change these so frequently that I have keystrokes bound to switch between them:
" That awful mixed mode with the half-tabs-are-spaces: map \M <Esc>:set noexpandtab tabstop=8 softtabstop=4 shiftwidth=4<CR>
" Mini tabs, small "m": map \m <Esc>:set expandtab tabstop=2 shiftwidth=2<CR>
" Think "little tabs" and "big tabs": map \t <Esc>:set expandtab tabstop=4 shiftwidth=4<CR> map \T <Esc>:set expandtab tabstop=8 shiftwidth=8<CR>
It is possible to get vim to insert at the "true" start of the line with soft tabs, if you have:
set softtabstop=4
I use this to insert spaces at the beginning of a line and real tab characters elsewhere:
inoremap <silent> <Tab> <C-R>=(col('.') > (matchend(getline('.'), '^\s*') + 1))?'<C-V><C-V><Tab>':'<Tab>'<CR>
If you're trying to figure out how it works and are confused by the <C-V><C-V><Tab> thing: <C-R>= asks for an expression, and the expression is entered as if it was typed, then the return value of the expression is inserted as if it too was typed - so, we want to insert <C-V><Tab>, but if we just entered that into the expression, it would be converted to <Tab> before the expression is executed - so, we have to enter <C-V><C-V><Tab> into the expression, which will be converted to <C-V><Tab> before the expression is executed, which will then become <Tab> in the actual file.
I also remapped Shift-Tab so I could easily insert real tabs at the beginning of the line when necessary:
inoremap <S-Tab> <C-V><Tab>
or (surely there is a better way???):
" make tab do tabs at beginning and spaces elsewhere function VaryTabs() if &expandtab return "\<Tab>" else let nonwhite = matchend(getline('.'),'\S') if nonwhite < 0 || col('.') <= nonwhite return "\<Tab>" else let pos = virtcol('.') let num = pos + &tabstop let num = num - (num % &tabstop) - pos +1 return repeat(" ",num) endif endif endfunction inoremap <Tab> <C-R>=VaryTabs()<CR>
This is what I use for python
au BufEnter *.py set ai sw=4 ts=4 sta et fo=croql