ChatGPT解决这个技术问题 Extra ChatGPT

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

vim

我当前的设置假设 8 个空格;我怎么能重新定义它?

更好的是,将其设置为四个空格并同时启用自动缩进:Auto-indent with tabwidth set to 4 spaces
@heinrich5991 我不明白。我不需要 8 个空格来意识到一行是缩进的,而且超出必要意味着限制您可以在一长行文本上查看的字符(至少在换行之前)。但每一个他自己。 :)
@heinrich5991 我的论点是“尽可能少地使用以轻松识别缩进行”。据我估计,一个人轻松识别压痕的能力在 < 3 个空格处迅速下降,并且在 4 个空格处停止增加。因此,根据我的经验,超过 4 个空格的缩进是一种浪费。
@weberc2 不能再同意了,伙计。这就是为什么我在阅读 Ruby 或“现代 JavaScript”时感到如此幽闭恐惧症的原因,它们中的每一个都使用 2 个空格进行缩进。当我试图遵循高度嵌套的结构时,它确实让我眼睛疲劳。该死的胜利的硬标签。
Replace Tab with Spaces in VIM 的可能重复项

L
Laurence Gonsalves

这取决于你的意思。您是否希望文件中的实际制表符显示为 4 个空格宽,或者“制表符”实际上是指通过按制表键生成的缩进,这将导致文件字面上包含(最多)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 等于制表符的数量乘以制表符。这也被 =、> 和 < 命令之类的东西使用。 softtabstop 将此设置为非零值而不是 tabstop 将使制表键(在插入模式下)插入空格组合(可能还有制表符)以模拟此宽度的制表位。 expandtab 启用此选项将使制表键(在插入模式下)插入空格而不是制表符。这也会影响 retab 命令的行为。 smarttab 启用此选项将使制表键(在插入模式下)插入空格或制表符以在光标位于行首时转到下一个制表位的下一个缩进(即前面的唯一字符是空格)。

有关其中任何一项的更多详细信息,请参见 vim 中的 :help 'optionname'(例如 :help 'tabstop'


确保 Makefile 始终使用硬制表符也很重要,否则构建将失败!我已经在 stackoverflow.com/questions/234564/… 展示了如何
@Undefined 那是系统vim设置。 ~/.vimrc 是用户的 vim 设置。大多数人不理会系统设置,只编辑用户设置。请注意,在您在大多数系统上创建 ~/.vimrc 之前,它不会存在。
Vim 用户注意 set softtabstop=4 功能!我厌倦了尝试使用 less 或除 vim 之外的任何其他编辑器来阅读您的代码,只是看到古怪的缩进,因为您将制表符重新定义为任意数量的空格(即使系统的其余部分不这么认为) ! :-)
有人能帮我理解为什么这个答案说要使用 tabstop=8 来表示由 4 个空格组成的缩进吗?在阅读了各种设置的描述后,我无法得到原因。另一个答案说使用 tabstop=4 这对我来说更有意义。
@KodosJohnson tabstop 选项控制硬制表符的宽度。如果您希望缩进包含 4 个空格字符,而不是 4 宽的单个制表符,那么制表符的宽度无关紧要——有点。在实践中,您可能希望制表符宽度与缩进宽度不同,以减少制表符伪装成正确缩进的机会。 (list + expandtab 在这里也可以提供帮助)此外,8 字符宽的标签是“标准”——您的终端、Python 和许多其他工具默认为 8 字符宽的标签。
C
CJBS

要为当前用户永久定义此内容,请创建(或编辑).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 上,配置文件就在那里。但请记住,更改此文件将导致配置在全局范围内使用。
还有一件事,使用 :retab 将现有的 tab 转换为 spacesvim.wikia.com/wiki/Converting_tabs_to_spaces
@TodorTodorov 没关系,通常会创建一个 ~/.vimrc。
z
zen

或 vim 模式行的简写:

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

k
kenorb

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

因此,这里有一些可以在 ~/.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()

另请参阅:Converting tabs to spaces

以下是来自 Wikia 的另一个片段,可用于 toggle between tabs and spaces

" 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 来切换设置。


我没有得到“au!”行:似乎说只有在保存带有这些扩展名的缓冲区时才开始使用 UseSpaces?不是在打开它们的时候?
S
Snowcrash

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

不像公认的答案那么全面,但它可能会帮助那些只想复制和粘贴内容的人。


M
Mateusz Piotrowski

将您想要的设置放在 ~/.vimrc 文件中——请参阅下面的一些指南和最佳实践。

在 Vim 中使用制表符有四种主要方式:

始终将 'tabstop' 设置为 8,将 'softtabstop' 和 'shiftwidth' 设置为 4(或 3 或任何您喜欢的值)并使用 'noexpandtab'。然后 Vim 将混合使用制表符和空格,但键入 和 将表现得像一个制表符每 4(或 3)个字符出现一次。注意:将 'tabstop' 设置为 8 以外的任何其他值都会使您的文件在许多地方出现错误(例如,在打印时)。将“tabstop”和“shiftwidth”设置为您喜欢的任何内容并使用“expandtab”。这样,您将始终插入空格。当 'tabstop' 改变时,格式永远不会混乱。将 'tabstop' 和 'shiftwidth' 设置为你喜欢的任何值并使用 |modeline|再次编辑文件时设置这些值。仅在使用 Vim 编辑文件时有效。始终将“tabstop”和“shiftwidth”设置为相同的值,以及“noexpandtab”。这应该适用于人们使用的任何制表位设置(仅适用于初始缩进)。如果您这样做,在第一个非空白插入空格之后插入制表符可能会很好。否则当 'tabstop' 改变时对齐的注释会出错。

资源:

vimdoc.sourceforge.net/htmldoc/options.html#'tabstop'

:help 制表符


+1 用于解释为什么设置 tabstop != 8 可能不好!
这很好,但您应该注意,这是从 vim 中的 vimdoc.sourceforge.net/htmldoc/options.html#'tabstop' 或 :help tabstop 逐字记录的。
D
DawnSong

还有一件事,使用
:retab
将现有 tab 转换为 空格 {1 }


A
Alok

为每个用户添加行
set ts=4

~/.vimrc 文件
或系统范围的
/etc/vimrc 文件


i
izstas
:set sw=4

请参阅Mastering the VI editor


o
o0omycomputero0o

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

伟大的!在复制粘贴已经有缩进的文本时,自动缩进会引入双重缩进。小心一点。在这种情况下,粘贴/不粘贴模式可能会有所帮助
e
ego2509

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

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

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


如果您设置 EDITOR,大多数程序都会尊重它。
@D.BenKnoble 你是对的。我试过了。现在我更喜欢节省我的时间和精力。无法检查 nano 中的 F10 究竟运行了什么,但我总是用保存做一些技巧(也许 F10 是一个解决方案)。或者它在 screen 中不起作用?不记得了,就是讨厌)
V
Vivian De Smedt

确保 vartabstop 未设置

set vartabstop=

tabstop 设置为 4

set tabstop=4