@heinrich5991 I don't get it. I don't need 8 spaces to realize that a line is indented, and more than necessary means limiting the characters you can view on a long line of text (at least before wrapping). But to each his own. :)
– weberc2Apr 20 '14 at 11:25

30

@heinrich5991 My argument is "use as little as possible to readily identify an indented line". By my estimation, one's ability to easily identify an indentation drops off rapidly at < 3 spaces, and it stops increasing at 4 spaces. Therefore, indentation that exceeds 4 spaces is a waste, in my experience.
– weberc2Apr 21 '14 at 13:40

3

@weberc2 Couldn't possibly agree more, mate. Which is why I feel so damn claustrophobic reading Ruby or "modern-day JavaScript", each of which use 2-spaces for indentation. It legitimately gives me eye strain when trying to follow heavily-nested structures. Hard tabs for the goddamn win.
– AlhadisNov 13 '15 at 6:57

2

@BrettWidmeier That has to be one of the worst things I've ever heard. Seriously.
– AlhadisFeb 11 '16 at 9:35

9 Answers
9

It depends on what you mean. Do you want actual tab characters in your file to appear 4 spaces wide, or by "tab" do you actually mean an indent, generated by pressing the tab key, which would result in the file literally containing (up to) 4 space characters for each "tab" you type?

Depending on your answer, one of the following sets of
settings should work for you:

For tab characters that appear 4-spaces-wide:

set tabstop=4

If you're using actual tab character in your source code you probably also want these settings (these are actually the defaults, but you may want to set them defensively):

set softtabstop=0 noexpandtab

Finally, if you want an indent to correspond to a single tab, you should also use:

set shiftwidth=4

For indents that consist of 4 space characters but are entered with the tab key:

In case you need to make adjustments, or would simply like to understand what these options all mean, here's a breakdown of what each option means:

tabstop

The width of a hard tabstop measured in "spaces" -- effectively the (maximum) width of an actual tab character.

shiftwidth

The size of an "indent". It's also measured in spaces, so if your code base indents with tab characters then you want shiftwidth to equal the number of tab characters times tabstop. This is also used by things like the =, > and < commands.

softtabstop

Setting this to a non-zero value other than tabstop will make the tab key (in insert mode)
insert a combination of spaces (and possibly tabs) to simulate tab stops at this width.

expandtab

Enabling this will make the tab key (in insert mode) insert spaces instead of
tab characters. This also affects the behavior of the retab command.

smarttab

Enabling this will make the tab key (in insert mode) insert spaces or tabs to
go to the next indent
of the next tabstop when the cursor is at the beginning of a line (i.e. the
only preceding characters are whitespace).

For more details on any of these see :help 'optionname' in vim (e.g. :help 'tabstop')

~/.vimrc is typically the location of the vim configure file that you can throw these commands in
– Seth McClaineMar 14 '14 at 18:05

25

@Undefined That's the system vim settings. ~/.vimrc is the user's vim settings. Most people leave the system settings alone and just edit the user settings. Note that ~/.vimrc will not exist until you create it on most systems.
– Laurence GonsalvesMay 23 '14 at 16:38

2

Vim users take note of the set softtabstop=4 feature! I am tired of trying to read your code with less, or any other editor except vim, only to see wacky indenting because you redefined tab to be some arbitrary number of spaces (even though the rest of the system thinks otherwise)! :-)
– Ogre Psalm33Sep 17 '14 at 12:51

2

@OgrePsalm33 Personally, I always have tabstop=8 and expandtab enabled when editing code. Not everyone feels that way, however. There are some who feel an indent should be a single tab character, so the width is adjustable by the reader. I don't think these people are exclusively (or even mostly) vim users...
– Laurence GonsalvesOct 7 '14 at 0:42

To define this on a permanent basis for the current user, create (or edit) the .vimrc file:

$ vim ~/.vimrc

Then, paste the configuration below into the file. Once vim is restarted, the tab settings will apply.

set tabstop=4 " The width of a TAB is set to 4.
" Still it is a \t. It is just that
" Vim will interpret it to be having
" a width of 4.
set shiftwidth=4 " Indents will have a width of 4
set softtabstop=4 " Sets the number of columns for a TAB
set expandtab " Expand TABs to spaces

If you do not have ~/.vimrc, try with /etc/vim/vimrc. In my case on Ubuntu 16.04 the config file is there. But keep in mind that changing this file will cause the configuration to be used globaly.
– TodStoychevOct 11 '16 at 7:43

Put your desired settings in the ~/.vimrc file -- See below for some guidelines and best practices.

There are four main ways to use tabs in Vim:

Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4 (or 3 or whatever you prefer) and use 'noexpandtab'. Then Vim will use a mix of tabs and spaces, but typing and will behave like a tab appears every 4 (or 3) characters.

Note: Setting 'tabstop' to any other value than 8 can make your file appear wrong in many places (e.g., when printing it).

Set 'tabstop' and 'shiftwidth' to whatever you prefer and use 'expandtab'. This way you will always insert spaces. The formatting will never be messed up when 'tabstop' is changed.

Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a |modeline| to set these values when editing the file again. Only works when using Vim to edit the file.

Always set 'tabstop' and 'shiftwidth' to the same value, and 'noexpandtab'. This should then work (for initial indents only) for any tabstop setting that people use. It might be nice to have tabs after the first non-blank inserted as spaces if you do this though. Otherwise aligned comments will be wrong when 'tabstop' ischanged.

So here are handy functions which can be defined in your ~/.vimrc file:

function! UseTabs()
set tabstop=4 " Size of a hard tabstop (ts).
set shiftwidth=4 " Size of an indentation (sw).
set noexpandtab " Always uses tabs instead of space characters (noet).
set autoindent " Copy indent from current line when starting a new line (ai).
endfunction
function! UseSpaces()
set tabstop=2 " Size of a hard tabstop (ts).
set shiftwidth=2 " Size of an indentation (sw).
set expandtab " Always uses spaces instead of tab characters (et).
set softtabstop=0 " Number of spaces a <Tab> counts for. When 0, featuer is off (sts).
set autoindent " Copy indent from current line when starting a new line.
set smarttab " Inserts blanks on a <Tab> key (as per sw, ts and sts).
endfunction

Usage:

:call UseTabs()
:call UseSpaces()

To use it per file extensions, the following syntax can be used (added to .vimrc):