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)
Bu开发者_如何学Pythont 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:
- use only tab to indent the lines
- a tab looks like 4-spaces, but actually is a tab
- 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.
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
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
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)
精彩评论