When I work on files in python, I sometimes mistake tabs for spaces and vice versa. Is there a way I can get Vim to display a character for a tab instead of a tab?
Yes, use listchars:
set list set listchars=tab:>-
If you put these two lines in your .vimrc, tabs will be shown as
> for the start position and
- through the rest of the tab.
(Sidenote: listchars can also show trailing spaces with
x with the character you want to use for a trailing space), which can be useful as well.)
The basic answer is
:set list, which causes tabs to display as
However, I recommend going beyond that. Just
:set list is problematic in that it fails to preserve visual alignment on screen. For example:
%.o: %.cpp ^Ig++ -c $<
doesn't look good, especially when you expect the
g++ to appear under the first
As explained in
:help listchars, a two-character setting for
tab:xy causes visual alignment to be preserved:
tab:xy Two characters to be used to show a tab. The first char is used once. The second char is repeated to fill the space that the tab normally occupies. "tab:>-" will show a tab that takes four spaces as ">---". When omitted, a tab is show as ^I.
The example above would appear on screen as:
%.o: %.cpp ␉·······g++ -c $<
Personally, I go all-out with my
eol, I use U+23CE RETURN SYMBOL
trail, I use U+2420 SYMBOL FOR SPACE
nbsp, I use U+23B5 BOTTOM SQUARE BRACKET
These characters are distinctive enough that they rarely appear literally in document text.
To type these special characters into your
vimrc, type Ctrl-vu
23CE while in Insert Mode, as explained in
Temporary Tab highlighting
For occasional use, one can simply highlight all tabs in a document using the following search
To remove the highlighting, simply type
:noh which is short for
:nohlsearch —no high lighting.
Permanent Tab highlighting
" Highlight tabs as errors. " https://vi.stackexchange.com/a/9353/3168 match Error /\t/
For more of these useful highlighting commands —including combined with trailing whitespace and making this permanent— see the Vim wiki.
I personally like the use of the plugin indentLine, which displays a vertical line at indentation levels.
It is of great help especially in python, where the indentation is important.
Among other things, it provides a toggle command, that can be mapped to a key combination, so that you can turn it off, when you don't need it.
Easiest method is to do
:set list, which will show tabs as
^I and end of line as
I like to use a mapping that calls
to toggle between regular display and list display.
:nmap <leader>l :set invlist<cr>
This allows me to quickly check if there are tab vs space problems and then go back to a regular display.
You may want to show tabs differently in a regular terminal and gvim.
set list! if has('gui_running') set listchars=tab:▶\ ,trail:·,extends:\#,nbsp:. else set listchars=tab:>.,trail:.,extends:\#,nbsp:. endif
(Adding for completeness, in case others find it useful).