将制表符重新定义为4个空格


1094

我目前的设定是假设8个空格;我该如何重新定义它?


4
更好的是,将其设置为四个空格并同时启用自动缩进:将制表符宽度设置为4个空格的自动缩进
solid_liq 2013年

7
@ heinrich5991我不明白。我不需要8个空格就可以知道一行是缩进的,而且超过必要的含义就是限制了可以在长行文本中查看的字符(至少在换行之前)。但每一个他自己。:)
weberc2

40
@ heinrich5991我的论点是“使用尽可能少的距离来确定缩进线”。据我估计,一个人容易识别凹痕的能力在<3个空格处迅速下降,而在4个空格处停止增加。因此,以我的经验,超过4个空格的缩进是浪费。
weberc2 2014年

7
@ weberc2不能再同意了,伙计。这就是为什么我在阅读Ruby或“现代JavaScript”时感到如此该死的幽闭恐惧症,它们每个都使用2个空格进行缩进。当尝试遵循嵌套结构时,它确实使我眼睛疲劳。真该死。

Answers:


1614

这取决于你的意思。您是要让文件中的实际制表符显示 4个空格,还是按“制表符”,实际上是指按Tab键生成的缩进,该缩进将导致文件实际包含(最多)4个空格字符您键入的每个“标签”?

根据您的答案,以下设置之一应该适合您:

  • 对于出现在4个空格范围内的制表符

    set tabstop=4
    

    如果您在源代码中使用实际的制表符,则可能还需要这些设置(这些实际上是默认设置,但您可能需要进行防御性设置):

    set softtabstop=0 noexpandtab
    

    最后,如果您希望缩进与单个选项卡相对应,则还应该使用:

    set shiftwidth=4
    
  • 对于由4个空格字符组成但使用Tab键输入的缩进

    set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
    

要使上述设置永久生效,请将这些行添加到vimrc中

如果您需要进行调整,或者只是想了解这些选项的全部含义,以下是每个选项的含义的细分:

tabstop

硬制制制表符的宽度,以“空格”度量-有效地表示实际制表符的(最大)宽度。

shiftwidth

“缩进”的大小。它也以空格进行度量,因此,如果您的代码库使用制表符缩进,那么您希望shiftwidth将制表符字符数​​乘以tabstop=><命令之类的东西也使用此功能。

softtabstop

将此值设置为非零值tabstop将使Tab键(在插入模式下)插入空格(可能还有制表符)的组合以模拟制表符在此宽度处的停止。

expandtab

启用此选项将使Tab键(在插入模式下)插入空格而不是Tab字符。这也会影响retab命令的行为。

smarttab

启用此选项将使Tab键(在插入模式下)在光标位于行首时(即,前面的唯一字符为空格)插入空格或制表符,以转到下一个制表符的下一个缩进。

有关任何这些的更多详细信息,请参见vim(例如)。:help 'optionname':help 'tabstop'


18
确保Makefile始终使用制表符字符也很重要,否则构建将失败!我已经在stackoverflow.com/questions/234564/…上
Shervin Emami 2014年

29
@Undefined这是系统vim设置。~/.vimrc是用户的vim设置。大多数人不理会系统设置,而只是编辑用户设置。请注意,~/.vimrc只有在大多数系统上创建它后,该属性才存在。
劳伦斯·贡萨尔维斯

4
Vim用户要注意该set softtabstop=4功能!我厌倦了尝试使用less或任何其他编辑器读取代码vim,只是为了看到古怪的缩进,因为您将Tab重新定义为任意数量的空格(即使系统其余部分认为不是这样)!:-)
Ogre Psalm33,2014年

6
有人可以帮我理解为什么这个答案说要tabstop=8用于由4个空格组成的缩进吗?阅读各种设置的说明后,我找不到原因。另一个答案说使用tabstop=4它对我来说更有意义。
科多斯·约翰逊,

5
@KodosJohnson该tabstop选项控制硬制表符的宽度。如果您希望缩进由4个空格字符组成,而不是由4个宽的单个制表符组成,则制表符的宽度无关紧要- 有点像。在实践中,您可能希望制表符的宽度与缩进的宽度不同,以减少制表符伪装成适当的缩进的机会。(list+ expandtab在这里也可以提供帮助)此外,8字符宽的选项卡是“标准”-您的终端,Python和许多其他工具默认为8字符宽的选项卡。
劳伦斯·贡萨尔维斯(Lawrence Gonsalves),

744

要为当前用户永久定义此.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

4
还有一件事,用于:retab将现有的转换tabspacesvim.wikia.com/wiki/Converting_tabs_to_spaces
DawnSong

57

或vim modeline的简写:

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

28

很少有设置定义使用空格还是制表符。

因此,以下是可以在~/.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来切换设置。


27

我将其复制并粘贴到我的.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

前2个设置意味着当我按Tab时我得到4个空格。第三个设置意味着当我这样做时V>(即视觉和缩进),我还将获得4个空格。

虽然不像公认的答案那么全面,但是它可能会对那些只想复制和粘贴某些东西的人有所帮助。


14

将所需的设置放入〜/ .vimrc文件中-有关某些准则和最佳做法,请参见下文。

在Vim中使用标签的主要方法有四种:

  1. 始终将“ tabstop”设置为8,将“ softtabstop”和“ shiftwidth”设置为4(或3或您喜欢的任何值),并使用“ noexpandtab”。然后,Vim将使用制表符和空格的混合,但是键入并表现得像一个制表符每4(或3)个字符出现一次。

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

  2. 将“ tabstop”和“ shiftwidth”设置为您喜欢的任何值,然后使用“ expandtab”。这样,您将始终插入空格。更改“ tabstop”时,格式永远不会搞乱。

  3. 根据需要设置'tabstop'和'shiftwidth'并使用| modeline | 在再次编辑文件时设置这些值。仅在使用Vim编辑文件时有效。

  4. 始终将“ tabstop”和“ shiftwidth”设置为相同的值,并设置“ noexpandtab”。然后,这将对人们使用的任何制表符设置起作用(仅适用于初始缩进)。如果这样做,最好在第一个非空格后插入制表符作为空格。否则,更改“ tabstop”时对齐的注释将是错误的。

资源:


+1解释为什么设置tabstop!= 8可能很糟糕!
Ogre Psalm33

3
很好,但是您应该注意这是从vimdoc.sourceforge.net/htmldoc/options.html#'tabstop '或:help tabstopvim中逐字记录的。
belacqua '16




2

我的基本〜/ .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 >> 

0

永久所有用户(当您独自在服务器上时):

# echo "set tabstop=4" >> /etc/vim/vimrc

通常,在新服务器apt-get purge nano mc和所有其他服务器上可以节省您的时间。否则,您将在中重新定义编辑器gitcrontab等等


1
如果设置EDITOR,则大多数程序都会尊重它。
D. Ben Knoble

@ D.BenKnoble你是对的。我试过了。现在,我更愿意节省时间和精力。无法检查究竟与运行F10nano,但我总是做一些技巧与保存(也许F10是一个解决方案)。还是不起作用screen?我不记得了,只是讨厌它)
Vasilii Suricov

无论如何它过去...
Vasilii Suricov
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.