ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

相关:How to replace tabs with spaces? 在 Vim SE

N
Neuron

正如在其他几个答案中所指出的,现在首选的方法不是使用 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:][1] 文件中: set smartindent set tabstop=4 set shiftwidth=4 set expandtab 帮助文件需要一些时间来适应,但是你读的越多,Vim 就越好: :help smartindent 更好的是,您可以将这些设置嵌入到您的源代码中以实现可移植性: :help auto-setting 要查看您当前的设置: :set all 正如 graywh 在评论中指出的那样,smartindent 已被 cindent 取代,它“工作得更聪明”,虽然仍然主要用于具有类 C 语法的语言: :help C-indenting


如果您设置了 expandtab,那么它应该使用空格。你也“设置兼容”吗?这有各种副作用,包括将 expandtab 重置为默认的“关闭”
抱歉,smartindent 被 cindent 取代,它本身只适用于 C 风格的语法。在使用其他语言时,在 vimrc 中打开任何一个都可能是个问题。只需使用“文件类型缩进”代替。
好吧, smartindent 也仅适用于 C 风格的语法,基本上已被弃用。
如果我启用 expandtab,有没有办法在文本中实际输入制表符?
@DanieleSegato <ctrl v><tab>应该在插入模式下工作:stackoverflow.com/questions/4781070/…
n
netjeff

相关,如果你打开一个同时使用制表符和空格的文件,假设你有

set expandtab ts=4 sw=4 ai

您可以将整个文件中的所有制表符替换为空格

:%retab

仅供参考,如果您不希望您的选项卡被空格替换,请删除 expandtab 行。
制表符不是空格吗? ;-)
@Rob-Wells:我将“空白”更改为“空格”。你现在高兴了? ;-)
你能解释一下第一行是什么意思吗?
expandtab 确定选项卡是否扩展为空格。 ts = tabstop = 文件中 的空格数。 sw = shiftwidth = (自动)缩进的每一步使用的空格数。 ai = autoindent = 开始新行时从当前行复制缩进。
S
Santosh Kumar

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


恕我直言,比标记为正确的答案更好。文件类型缩进取代 cindent 和 smartindent。
S
Shervin Emami

要在大多数文件中使用 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?在我看来,最后几行在所有情况下都会覆盖特定于 makefile
嗨@lucidbrot,“autocmd FileType make”语句基本上告诉vim在打开Makefile时使用一些设置。而它下面的行正在设置默认值。换句话说,“tabstop=8 ...”设置稍后会在文件打开时应用,并将覆盖初始化时应用的“tabstop=4 ...”设置。
+1 使其可扩展。我选择了这个,因为关于每个部分的评论让我可以按照自己的方式进行设置(不会破坏任何东西),因为我知道每件事都在做什么。万岁!
E
Erick

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

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

第 1 步:转到您的主目录

cd ~

第 2 步:创建文件

vim .vimrc

第三步:添加上述配置

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

第 3 步:按 Shift + ZZ 保存文件。


不要使用 Shift + ZZ 它将创建 .swp 文件。使用 wq
@shas: "ZZ" is equivalent to ":x",与 ":wq" 相同,只是它仅在文件已更改时保存...(Ctrl-Z 是另一回事...)
@shas 这根本不真实。如果您不想要编辑会话的交换文件,则必须运行 vim -n <file>。交换文件不是在保存时生成的;这几乎会破坏它的目的,因为交换文件在恢复突然终止的编辑会话方面变得有用。
可在此处找到详细说明。(vim.fandom.com/wiki/Converting_tabs_to_spaces)
C
Chaudhry Junaid

推荐的方法是使用基于文件类型的缩进,如果这还不够,只使用 smartindent 和 cindent。

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

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

希望它有助于作为一个不同的答案。


p
phk

编辑你的 ~/.vimrc

$ vim ~/.vimrc

添加以下行:

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

U
User

VIM wiki

:set tabstop=4
:set shiftwidth=4
:set expandtab

P
Peter Mortensen

自动缩进基于当前的语法模式。我知道如果您正在编辑 Foo.java,然后输入 { 并按 Enter 会缩进以下行。

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

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


K
Kaz

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

其次,如果您使用自动缩进,这些手动缩进键无论如何都不必使用太多。

如果 Ctrl-T 而不是 Tab 困扰你,你可以重新映射它:

:imap <Tab> ^T

您还可以重新映射 Shift-Tab 以执行 Ctrl-D 缩进:

:imap <S-Tab> ^D

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

有了这个映射,您仍然可以使用 Ctrl-VTab 将文字 Tab 键入缓冲区。请注意,如果您这样做,即使 :set expandtab 已打开,您也会得到一个未展开的制表符。

使用 :set smarttab 可以实现与 <Tab> 映射类似的效果,它还会使行前的退格键表现得更智能。

smarttab 模式下,当 Tab 不是在行首使用时,它没有特殊含义。这与我上面将 Tab 映射到 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.BenKnoble 我不推荐这些;我自己使用 Ctrl-T、Ctrl-D 和 < >。这是按预期使用 Vim。习惯在其他编辑器中使用 Tab 的人可能不喜欢这样,仅此而已。
C
Cheung Johnson

毕竟,您可以编辑.vimrc,然后添加conf

set tabstop=4

或者执行命令


a
ashish

最简单的将是 n vim 文件

set tabstop=4