如何在vim中只使用制表符而不是空格

111

我更喜欢使用 制表符,而不是 空格(可能与大多数人不同)

但我发现,当我在行末按下 Enter 后,会添加一些空格,而不是 制表符。所以,我必须删除它们并按下 Tab

我想知道如何将vim设置为:

  1. 只使用制表符缩进行
  2. 制表符看起来像4个空格,但实际上是一个制表符
  3. 在行末按下 Enter 后,新行仅以制表符开头

我已经搜索了一段时间,但没有找到一个好的答案。谢谢您提前。


更新

@Alok 提供的答案在大多数情况下都很有效。但我刚刚发现,有时它取决于文件类型。例如,如果你正在编辑一个 haml 文件,并且在你的 vimfiles/indent/ 中有一个 haml.vim,那么所有的制表符都将被转换为 空格。所以,如果你想让它只使用 制表符,你应该修改(或删除)相应的缩进文件。


不要修改已安装的文件,尝试将覆盖设置放在$HOME/vimfiles/after/indent/haml.vim中。有关更多信息,请查看:help after-directory - Nefrubyr
3
针对不同的文件类型,拥有不同的制表符/空格偏好是很常见的。请查看我在Vimcasts.org上的屏幕录像,其中展示了如何为不同的文件类型设置空白偏好。这个解决方案使用了你的vimrc,但如果你想设置许多不同的文件类型,你可能更喜欢使用after目录,就像Nefrubyr所建议的那样。 - nelstrom
在Python文件中,/after/indent技巧也适用于消除那些讨厌的空格。需要查看的有问题的文件是ftplugin/python.vim,只需复制带有setlocal的行,并按照@Nefrubyr的建议将其复制到空白文件中,进行编辑并恢复正常。 - Paul
3个回答

163

您要查找的设置为:

set autoindent
set noexpandtab
set tabstop=4
set shiftwidth=4
作为单行:
set autoindent noexpandtab tabstop=4 shiftwidth=4

autoindent可以替换为smartindentcindent,具体取决于您的个人喜好。同时请查看filetype plugin indent on

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


正如@freewind所说,当使用.haml文件时它无法正常工作。在我的情况下,我使用vim janus,只需添加建议的单行代码即可,但它对于haml文件不起作用。有什么想法吗? - alexventuraio
5
也需要添加 softtabstop=-1 - Walf
如果您正在使用neovim,请查看:help option,因为“autoindent和noexpandtab”至少是默认选项。 - SergioAraujo
有没有快速切换使用制表符或空格的方法?我应该开一个新的SO问题吗? - fde-capu

13

如果有人努力强制使用标签卡的话,我来晚了。对于当前版本的vim>8),需要设置以下内容:

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

它扩展为:

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

我们也可以仅针对特定的文件类型使用此设置,利用setlocal

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

更多参考,请查看:https://vim.fandom.com/wiki/Indent_with_tabs,_align_with_spaces


1

在我的情况下,set indentexpr= 就可以解决问题。

我找到了那些设置令人讨厌行为的配置文件,其中包括 fd python.vim/。在 /usr/share/vim/vim90/indent/python.vim 中有一行代码 setlocal indentexpr=python#GetIndent(v:lnum)。函数 python#GetIndent 定义在 /usr/share/vim/vim90/autoload/python.vim 中。该函数返回了一个奇怪的值,非 shiftwidthtabstop 的倍数。因此 vim 插入了一个制表符后跟着一些空格。

现在,我把 indentexpr 设置为空值,我认为 vim 会回退到 autoindentsmartindentcindent 已关闭。(https://vimhelp.org/indent.txt.html

当然,还需要 set noexpandtab。我不确定其他设置是否相关。


编辑: autoindent 并不完美,它只是将新行缩进与上一行相同。

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

不如预期工作,cindent 似乎不适用于 Python,因此最终使用 indentexpr 是正确的方法。

幸运的是,缩进函数可以配置,参见 help ft-python-indent 或查看代码 - 这更详细地说明了 disable_parentheses_indenting 功能。看起来这对我来说是解决方案:

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接