Tab键== 4个空格,在Vim中花括号后自动缩进


1265

如何使vi - Vim从不使用制表符(将空格转换为制表符,太糟糕了!),使制表符键== 4个空格,并像Emacs一样在大括号块之后自动缩进代码?

另外,如何保存这些设置,这样我就不必再次输入它们了?

我已经看到了与此相关的其他问题,但是它似乎总是与我想要的有点偏离。


Answers:


1881

正如以下几个答案中所指出的那样,现在首选的方法是不使用smartindent,而使用以下内容(在.vimrc中):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

在您的.vimrc:文件中:

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

帮助文件需要一些时间来习惯,但是您读得越多,Vim就会越好:

:help smartindent

更好的是,您可以将以下设置嵌入源中以实现可移植性:

:help auto-setting

要查看当前设置:

:set all

正如Graywh在评论中指出的那样,smartindent已被cindent取代,该cindent“更聪明地工作”,尽管仍然主要用于具有C语法的语言:

:help C-indenting


4
如果您设置了expandtab,那么它应该使用空格。您还“设置兼容”吗?这具有多种副作用,包括将expandtab重置为其默认值“ off”
Ken Ken

60
抱歉,但是smartindent被cindent取代了,它本身仅适用于C样式语法。在使用其他语言时,在vimrc中打开任何一个都可能是一个问题。只需使用“文件类型缩进”即可。
graywh'2

2
好吧,smartindent 仅适用于C样式语法,实际上已被弃用。
graywh 2010年

4
如果启用expandtab,是否有办法在文本中实际输入制表符?
Daniele Segato

3
@DanieleSegato <ctrl v> <tab>应该在插入模式下工作:stackoverflow.com/questions/4781070/…–

236

相关的,如果您打开同时使用制表符和空格的文件(假设您已经

set expandtab ts=4 sw=4 ai

您可以将整个文件中的所有标签替换为空格

:%retab

10
仅供参考,如果您不希望将制表符替换为空格,请删除expandtab行。
Eno 2012年

6
制表符不是空格吗?;-)
Rob Wells

11
@ Rob-Wells:我将“空白”更改为“空格”。你现在高兴了?;-)
netjeff 2014年

您能解释一下第一行的含义吗?
基金莫妮卡的诉讼

2
expandtab确定选项卡是否扩展为空格。ts = tabstop =文件中<Tab>所占的空格数。sw = shiftwidth =(自动)缩进的每个步骤要使用的空格数。ai =自动缩进=在开始新行时从当前行复制缩进。
mcmacerson

89

获得特定于文件类型的缩进的最佳方法是filetype plugin indent on在vimrc中使用。然后,您可以指定诸如set sw=4 sts=4 et.vim / ftplugin / c.vim之类的内容,而不必为所有正在编辑的文件设置全局名称,并且其他非C类型语法也将正确缩进(甚至是lisps)


9
恕我直言,比标记为正确答案的要好。替代cindent和smartindent的文件类型缩进。
0fnt 2010年

62

要在大多数文件中包含4个空格的制表符,在Makefile中包含真正的8宽制表符,并在包括C / C ++在内的各种文件中自动缩进,请在~/.vimrc文件中输入以下内容:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
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.

您为什么不需要else?在我看来,在所有情况下
最后几

6
@lucidbrot,您好,“ autocmd FileType make”语句基本上告诉vim打开Makefile时要使用的一些设置。而下面的行则设置默认值。换句话说,“ tabstop = 8 ...”设置将在以后打开文件时应用,并将覆盖初始化时使用的“ tabstop = 4 ...”设置。
谢尔文·艾米(Shervin Emami),

56

在许多Linux系统上,例如Ubuntu,.vimrc默认情况下该文件不存在,因此建议您首先创建它。

不要使用.viminfo主目录中存在的文件。它用于其他目的。

第1步:转到主目录

cd ~

步骤2:建立档案

vim .vimrc

步骤3:添加上述配置

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

步骤3:按Shift+ 保存文件ZZ


11
不使用Shift + ZZ它将创建.swp文件。使用wq
shas 2015年

6
@shas:“ ZZ”等同于“:x”,与“:wq”相同,除了它仅在文件已更改时才保存...(Ctrl-Z是另一回事...)
Gert van den伯格2015年

1
@shas简直不真实。如果您不希望将交换文件用于编辑会话,则必须运行vim -n <file>。交换文件不是在保存时生成的文件。因为交换文件在恢复突然终止的编辑会话中很有用,所以这几乎无法实现其目的。
哈兹

32

推荐的方法是使用基于文件类型的缩进,仅在不足时才使用smartindent和cindent。

将以下内容添加到您的.vimrc中

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

希望它能作为一个不同的答案有所帮助。


12

编辑您的〜/ .vimrc

$ vim ~/.vimrc

添加以下行:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

自动缩进基于当前语法模式。我知道,如果您正在编辑Foo.java,则输入a {Enter在下面一行插入缩进。

对于选项卡,有两个设置。在Vim中,键入一个冒号,然后“设置tabstop = 4”,这会将这些标签设置为显示为四个空格。再次点击冒号并输入“ set expandtab”,这将为制表符插入空格。

您可以将这些设置放在主目录中的.vimrc(或Windows上的_vimrc)中,因此只需键入一次即可。


0

首先,不要Tab在Vim中使用密钥进行手动缩进。Vim在插入模式下有一对命令,用于手动增加或减少缩进量。这些命令是Ctrl-TCtrl-D。这些命令观察的值tabstopshiftwidth并且expandtab,保持的空格和制表符(后面的空格任何必要数目的标签最大数)的正确混合物。

其次,如果您使用自动缩进,那么这些手动缩进键也不必使用太多。

如果您Ctrl-TTab打扰您,可以重新映射它:

:imap <Tab> ^T

您也可以重新映射Shift-TabCtrl-D确定:

:imap <S-Tab> ^D

这里^ T和^ D是可以作为插入的文字控制字符Ctrl-VCtrl-T

有了此映射后,您仍然可以使用键入文字Tab到缓冲区中Ctrl-VTab。请注意,如果执行此操作,即使:set expandtab打开了,也会得到未扩展的制表符。

<Tab>使用可以达到与地图相似的效果:set smarttab,这也会导致线前的退格键表现得很聪明。

smarttab模式下,当Tab不在行首使用时,它没有特殊含义。这与我上面的Tabto 映射不同Ctrl-T,因为Ctrl-T在行中的任何地方(在插入模式下使用)都会增加该行的缩进。

其他有用的映射可能是:

:map <Tab> >
:map <S-Tab> <

现在我们可以做一些事情,例如选择一些行,然后点击Tab以缩进它们。或Tab在一行中按两次(在命令模式下)以增加其缩进量。

如果使用正确的缩进管理命令,然后一切由三个参数控制:shiftwidthtabstopexpandtab

shiftwidth参数控制您的缩进大小;如果要缩进四个空格,请使用:set shiftwidth=4或缩写:set sw=4

如果仅执行此操作,则缩进将使用空格和制表符的混合来创建,因为这noexpandtab是默认设置。使用:set expandtab。这将导致您在缓冲区中键入的制表符扩展为空格,而Vim管理的缩进仅使用空格。

expandtab打开时,如果您通过所有适当的Vim机制管理缩进,则的值将tabstop变得无关紧要。它控制标签碰巧出现在文件中时的显示方式。如果有set tabstop=8 expandtab,然后使用硬标签将其潜入文件中Ctrl-VTab,则将照常对齐下一个基于8列的标签位置。


您所有的映射都应使用非递归变量。映射go <C-t>可以使用该语法而不是文字。最后,<Tab>正常模式下的映射也会映射<C-i>(它们是相同的字符),所以我不建议这样做(您失去了一些漂亮的vim功能
D. Ben Knoble

@ D.BenKnoble我不推荐任何一个。我自己使用Ctrl-T,Ctrl-D和<>。那是按预期使用Vim的。过去在其他编辑器中使用过Tab的人可能并不喜欢那样,仅此而已。
卡兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.