Freewind
Freewind

Reputation: 198388

How to use only tab (not space) in vim

I prefer to use tab than white space(may be a little different from most of others)

But I found, when I hit Enter at the end of line, it will add some white spaces, but not tab. So, I have to delete them and press tab.

I want to know how to set vim as:

  1. use only tab to indent the lines
  2. a tab looks like 4-spaces, but actually is a tab
  3. when hit enter at the end of a line, the new line is started with only tabs

I've googled for this for a while, but not found a good answer. Thank you in advance


UPDATE

The answer @Alok has provided works well in most of cases. But I just found, sometimes, it depends on the file type. For example, if you are editing a haml file, and there is a haml.vim in your vimfiles/indent/, then all the tabs will be converted to space. So if you want it to be tab only, you should modify(or delete) the corresponding indent file.

Upvotes: 118

Views: 113732

Answers (3)

jakun
jakun

Reputation: 674

In my case set indentexpr= did the trick.

I have found the config files which set the annoying behavior with fd python.vim /. In /usr/share/vim/vim90/indent/python.vim there is the line setlocal indentexpr=python#GetIndent(v:lnum). The function python#GetIndent is defined in /usr/share/vim/vim90/autoload/python.vim. This function returned a weird value which was not a multiple of shiftwidth and tabstop. Therefore vim inserted a tab followed by some spaces.

Now, that I have set indentexpr to an empty value, I think vim falls back to autoindent. smartindent and cindent are turned off. (https://vimhelp.org/indent.txt.html)

Of course set noexpandtab is required, too. I am not sure if any other settings are relevant here.


EDIT: autoindent is not perfect, it does nothing more than indent the new line as much as the previous line.

set smartindent
set cinwords=if,elif,else,try,except,finally,with,for,while,class,def

does not work as expected and cindent does not seem suitable for python, so using indentexpr is the way to go after all.

Luckily the indentation function can be configured, see help ft-python-indent or look at the code – that was more informative regarding the disable_parentheses_indenting feature. It seems this is the solution for me:

if !exists('g:python_indent')
    let g:python_indent = {}
endif
let g:python_indent.disable_parentheses_indenting = 1

(https://vi.stackexchange.com/a/38824/43863)

Upvotes: 1

wiredolphin
wiredolphin

Reputation: 1641

Late to the discussion, just for anyone who struggled to force the use of tabs. With the current version of vim (>8) it was required to set:

:set noet ci pi sts=0 sw=4 ts=4

which expands to:

:set noexpandtab
:set copyindent
:set preserveindent
:set softtabstop=0
:set shiftwidth=4
:set tabstop=4

We can also use this setup with only specific file types, taking advantage of setlocal:

autocmd FileType c,cpp,java,python setlocal noet ci pi sts=0 sw=4 ts=4

For further reference, see: https://vim.fandom.com/wiki/Indent_with_tabs,_align_with_spaces

Upvotes: 19

Alok Singhal
Alok Singhal

Reputation: 96241

The settings you are looking for are:

set autoindent
set noexpandtab
set tabstop=4
set shiftwidth=4

As single line:

set autoindent noexpandtab tabstop=4 shiftwidth=4

autoindent can be replaced with smartindent or cindent, depending upon your tastes. Also look at filetype plugin indent on.

http://vim.wikia.com/wiki/Indenting_source_code

Upvotes: 173

Related Questions