1372

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

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

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

4

12 回答 12

2049

正如在其他几个答案中所指出的那样,现在首选的方法不是使用 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
于 2008-10-24T17:45:13.557 回答
260

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

set expandtab ts=4 sw=4 ai

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

:%retab
于 2008-11-27T05:42:13.667 回答
92

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

于 2009-01-04T21:09:33.780 回答
68

要在大多数文件中使用 4 空格制表符,在 Makefiles 中使用真正的 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.
于 2014-01-24T02:42:33.537 回答
63

在很多 Linux 系统上,比如 Ubuntu,.vimrc默认情况下该文件是不存在的,所以建议您先创建它。

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

第 1 步:转到您的主目录

cd ~

第 2 步:创建文件

vim .vimrc

第三步:添加上述配置

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

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

于 2014-08-04T13:26:58.590 回答
36

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

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

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

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

于 2014-05-02T10:35:06.630 回答
15

编辑你的 ~/.vimrc

$ vim ~/.vimrc

添加以下行:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
于 2015-10-08T01:26:41.920 回答
13

来自VIM 维基

:set tabstop=4
:set shiftwidth=4
:set expandtab
于 2015-11-18T19:08:54.550 回答
11

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

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

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

于 2008-10-24T17:48:21.520 回答
2

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

set tabstop=4

或者执行命令

于 2020-07-29T11:46:47.917 回答
1

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

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

如果Ctrl-T不是Tab打扰您,您可以重新映射它:

:imap <Tab> ^T

您还可以重新映射Shift-Tab以进行Ctrl-Ddeindent:

:imap <S-Tab> ^D

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

有了这个映射,您仍然可以使用Ctrl-VTab. 请注意,如果您这样做,即使:set expandtab打开,您也会得到一个未展开的制表符。

<Tab>使用 可以实现与地图类似的效果:set smarttab,这也会使行前的退格键表现得更智能。

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

其他有用的映射可能是:

: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 列的制表符位置的对齐。

于 2020-02-06T20:48:11.260 回答
0

最简单的将是 n vim 文件

set tabstop=4
于 2022-02-08T08:55:43.197 回答