重新定义“制表符”为4个空格。

1322

我当前的设置假定为8个空格; 我该如何重新定义它?


5
最好将其设置为四个空格并同时启用自动缩进:在Vim中通过将tab宽度设置为4个空格来启用括号后自动缩进 - solid_liq
8
@heinrich5991 我不明白。我不需要8个空格来判断一行是否缩进,而且过多的空格会限制在一行长文本中可以查看的字符数(至少在换行之前)。但每个人有自己的偏好 :) - weberc2
54
@heinrich5991 我的观点是“尽可能使用少量空格来识别缩进线”。据我估计,当空格数小于3时,人们很难轻松地识别缩进线,并且在4个空格处停止增加。因此,根据我的经验,超过4个空格的缩进是浪费的。 - weberc2
11
@weberc2 我完全同意,伙计。这就是为什么我读 Ruby 或 "现代 JavaScript" 时感到极度幽闭恐惧的原因,它们都使用两个空格来缩进。当我试图跟踪深度嵌套的结构时,这确实会给我的眼睛带来紧张感。制表符才是胜利者。 - user458541
可能是在VIM中用空格替换制表符的重复问题。 - rofrol
13个回答

1926

这取决于你的意思。你是想要:

  • 在文件中让制表符在外观上占据4个字符单元格吗?
  • 希望Tab键生成由4个空格字符组成的缩进吗?

根据你需要的行为,下面两组设置之一应该可以解决问题:

如果你希望文件中的制表符外观上占据4个字符单元格:

set tabstop=4

如果您的代码需要使用实际制表符,这些设置可以防止不经意地插入空格(这些是默认值,但您可能希望进行防御性设置):

set softtabstop=0 noexpandtab

如果你也想使用制表符进行缩进,你应该将shiftwidth设置为与tabstop相同:

set shiftwidth=4

如果你想让按下tab键时缩进4个空格,请将以下设置添加到你的vimrc文件,以使其永久生效:

首先,告诉 Vim 使用 4 个空格缩进,并智能地将 Tab 键用于缩进(当在行的开头时),而不是插入 Tab 字符:

set shiftwidth=4 smarttab

如果你希望 vim 只使用空格字符而不是制表符:

set expandtab

最后,我还建议将制表位设置为与缩进宽度不同,以减少制表符被误认为是正确缩进的机会:

set tabstop=8 softtabstop=0
为了使这些设置永久生效,请将它们添加到您的vimrc文件中。 更多详情: - `tabstop`:硬制表符的宽度,用“空格”表示-实际上就是实际制表符字符的(最大)宽度。 - `shiftwidth`:缩进大小,也用空格测量。如果您的代码库使用制表符字符进行缩进,则需要将`shiftwidth`设置为制表符数乘以`tabstop`的数量。这也用于像`=``>`和`<`命令之类的东西。 - `softtabstop`:将其设置为非零值(而不是`tabstop`)将使Tab键(在插入模式下)插入一些空格(和可能的制表符),以模拟此宽度处的制表符停止位。 - `expandtab`:启用此选项将使Tab键(在插入模式下)插入空格而不是制表符字符。这也会影响`retab`命令的行为。 - `smarttab`:启用此选项将使Tab键(在插入模式下)插入空格或制表符,以便在光标位于行开头时(即只有前导空白字符时)跳到下一个制表符停止位的下一个缩进。
要获取有关任何这些选项的详细信息,请在vim中查看`:help ''`(例如,`:help 'tabstop'`)。

27
确保Makefile文件始终使用硬制表符非常重要,否则构建将失败!我已经展示了如何做到这一点,在https://dev59.com/d3VC5IYBdhLWcg3woCnN#21323445。 - Shervin Emami
4
Vim用户请注意 set softtabstop=4 功能!我已经厌倦了尝试用less或除vim以外的任何编辑器阅读您的代码,只看到因为您重新定义制表符为某个任意数字而出现的奇怪缩进(尽管系统的其他部分认为不同)! :-) - Ogre Psalm33
3
@OgrePsalm33个人而言,我在编辑代码时总是使用tabstop=8expandtab。不过,并非每个人都这样想。有些人认为缩进应该是一个制表符字符,这样宽度就可以由读者自行调整。我认为这些人并非仅限于(甚至大多数情况下都不是)vim用户... - Laurence Gonsalves
14
有人能帮我理解为什么这个答案建议在缩进由4个空格组成时使用tabstop=8?阅读了各种设置的说明后,我还是不明白原因。另一个答案建议使用tabstop=4,这对我来说有点更有意义。 - Cave Johnson
17
tabstop选项控制硬制表符的宽度。如果你想让你的缩进由4个空格字符组成,而不是单个4字符宽的制表符,则制表符宽度并不重要--某种程度上来说。实际上,你可能希望你的制表符宽度与缩进宽度* 不同 *,以减少制表符伪装成正确缩进的机会。(list + expandtab也可以帮助解决问题)另外,8字符宽的制表符是“标准”的——你的终端、Python和许多其他工具默认使用8字符宽的制表符。 - Laurence Gonsalves
显示剩余13条评论

817

为了对当前用户永久定义此项,请创建(或编辑).vimrc文件:

$ vim ~/.vimrc

然后,将下面的配置粘贴到文件中。一旦重新启动vim,选项卡设置将生效。

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

如果您没有 ~/.vimrc,可以尝试使用 /etc/vim/vimrc。在我的 Ubuntu 16.04 上,配置文件就在那里。但请记住,更改此文件将导致全局使用该配置。 - Todor Todorov
13
还有一件事,使用 :retab 将现有的 tab 转换为 空格。http://vim.wikia.com/wiki/Converting_tabs_to_spaces - DawnSong
@TodorTodorov 创建一个 ~/.vimrc 是可以的,而且通常也是这样做的。 - user26742873

72

或者是vim模型行的速记方式:

vim :set ts=4 sw=4 sts=4 et :

我喜欢这个,因为在CKAD考试中,没有太多时间来设置选项。为什么末尾有一个冒号,还是打错了? - likejudo
冒号是有效的,但不是强制的。请参考:help modeline中的第二种形式。 - liverwust
虽然也许第二种方式在 Vim 8+ 中无效(https://superuser.com/a/1174296/977313),但是我回来得太晚,不能编辑之前的评论了。 - liverwust

62

有一些设置定义了是否使用空格或制表符。

因此,以下是方便的函数,可在您的~/.vimrc文件中定义:

function! UseTabs()
  set tabstop=4     " Size of a hard tabstop (ts).
  set shiftwidth=4  " Size of an indentation (sw).
  set noexpandtab   " Always uses tabs instead of space characters (noet).
  set autoindent    " Copy indent from current line when starting a new line (ai).
endfunction

function! UseSpaces()
  set tabstop=2     " Size of a hard tabstop (ts).
  set shiftwidth=2  " Size of an indentation (sw).
  set expandtab     " Always uses spaces instead of tab characters (et).
  set softtabstop=0 " Number of spaces a <Tab> counts for. When 0, featuer is off (sts).
  set autoindent    " Copy indent from current line when starting a new line.
  set smarttab      " Inserts blanks on a <Tab> key (as per sw, ts and sts).
endfunction

使用方法:

:call UseTabs()
:call UseSpaces()

要按文件扩展名使用它,可以使用以下语法(添加到.vimrc):

au! BufWrite,FileWritePre *.module,*.install call UseSpaces()

另请参阅:将制表符转换为空格


以下是来自Wikia的另一个片段,可用于在制表符和空格之间切换

" virtual tabstops using spaces
set shiftwidth=4
set softtabstop=4
set expandtab
" allow toggling between local and default mode
function TabToggle()
  if &expandtab
    set shiftwidth=8
    set softtabstop=0
    set noexpandtab
  else
    set shiftwidth=4
    set softtabstop=4
    set expandtab
  endif
endfunction
nmap <F9> mz:execute TabToggle()<CR>'z

它可以使用4个空格代替每个制表符,并映射到F9以切换设置。


1
我不理解 "au!" 这一行:似乎在说当保存具有这些扩展名的缓冲区时才开始使用 UseSpaces?而不是在打开它们时? - Olivier Dulac

31

我复制并粘贴了这段文字到我的 .vimrc 文件中:

" size of a hard tabstop
set tabstop=4

" always uses spaces instead of tab characters
set expandtab

" size of an "indent"
set shiftwidth=4
第一种和第二种设置意味着当我按Tab键时,我会得到4个空格。第三种设置意味着当我执行V>(即可视化并缩进)时也会得到4个空格。
虽然不如被接受的答案全面,但这可能会帮助那些只想复制和粘贴的人。

19

17
在~/.vimrc文件中设置所需的配置--以下是一些指南和最佳实践。
在Vim中使用tab主要有四种方式:
  1. 始终将'tabstop'设置为8,将'softtabstop'和'shiftwidth'设置为4(或3或您喜欢的任何数字),并使用'noexpandtab'。然后Vim将使用制表符和空格的混合,但键入<Tab>和键入空格时会像每4个(或3个)字符出现一个制表符。

    注意:将'tabstop'设置为除8以外的任何值都可能使您的文件在许多地方(例如打印时)显示错误。

  2. 将'tabstop'和'shiftwidth'设置为您喜欢的任何值,并使用'expandtab'。这样,您将始终插入空格。当'tabstop'更改时,格式不会被破坏。

  3. 将'tabstop'和'shiftwidth'设置为您喜欢的任何值,并使用|modeline|来设置这些值以再次编辑文件时使用。仅在使用Vim编辑文件时有效。

  4. 始终将'tabstop'和'shiftwidth'设置为相同的值,并使用'noexpandtab'。这应该对人们使用的任何'tabstop'设置(仅适用于初始缩进)起作用。如果这样做,第一个非空插入后的制表符将变成空格,则可能很好。否则,当'tabstop'更改时,对齐的注释将出错。

来源:

(说明:此文为编程相关内容,提供了两个链接,第一个是网站链接,第二个是命令行指令)

+1 是为了解释为什么将 tabstop 设置为非 8 可能会有问题! - Ogre Psalm33
3
这很好,但你应该注意这是从http://vimdoc.sourceforge.net/htmldoc/options.html#'tabstop'或者在vim中键入`:help tabstop`得到的逐字翻译。 - belacqua

11

在个人用户的~/.vimrc文件中,或者在系统范围内的/etc/vimrc文件中添加以下行:
set ts=4

这将设置Vim编辑器中的制表符宽度为4个空格。

7

7

下面是带注释的基础 ~/.vimrc:

set number " show line number                                                                                           
set tabstop=2 " set display width of tab; 1 tab = x space with                                                           
set expandtab " transform tab to x space (x is tabstop)                                                               
set autoindent " auto indent; new line with number of space at the beginning same as previous                                                                      
set shiftwidth=2 " number of space append to lines when type >> 

太好了!当复制粘贴已经有缩进的文本时,自动缩进会引入双重缩进。需要小心。在这种情况下,可以使用paste/nopaste模式来帮助解决问题。 - Amit M

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