73

当自动缩进打开时,如何防止vim用制表符替换空格?

一个例子:如果我在行的开头有两个制表符和 7 个空格tabstop=3,并且我按 Enter 键,下一行的开头有四个制表符和 1 个空格,但我不希望这样......

4

6 回答 6

83

根本不使用制表符也许是个好主意。

:set expandtab

如果要将文件中的所有选项卡替换为 3 个空格(看起来与 非常相似tabstop=3):

:%s/^I/   /

(人物在^I哪里TAB

从 VIM 在线帮助:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
于 2008-09-16T07:23:38.113 回答
51

您可以将所有转换TABSPACE

:set et
:ret!

或全部转换SPACETAB

:set et!
:ret!
于 2011-04-26T13:20:11.563 回答
41

我想要的只是自动缩进的行具有与前一行完全相同的缩进字符。

:help copyindent

'copyindent' 'ci' 布尔值 (默认关闭);本地缓冲;{Vi 无此功能}

自动缩进新行时复制现有行缩进的结构。通常,新缩进由一系列制表符后跟空格重建(除非启用了'expandtab',在这种情况下只使用空格)。启用此选项会使新行复制用于在现有行上缩进的任何字符。如果新缩进大于现有行,则以正常方式填充剩余空间。

注意:设置'compatible'时, 'copyindent'会被重置。 另请参见'preserveindent'

:help preserveindent

'preserveindent' 'pi' 布尔值 (默认关闭);本地缓冲;{Vi 无此功能}

更改当前行的缩进时,尽可能多地保留缩进结构。通常缩进被一系列制表符替换,后面跟着空格(除非启用了'expandtab',在这种情况下只使用空格)。启用此选项意味着缩进将保留尽可能多的现有字符以进行缩进,并且仅根据需要添加额外的制表符或空格。

注意:当多次使用“>>”时,缩进是制表符和空格的混合。你可能不喜欢这个。
注意:设置'compatible'时, 'preserveindent'会被重置。 另见'copyindent'。 使用 :retab 清理空白。

于 2008-09-16T11:35:56.777 回答
27

这是我的一部分.vimrc

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

这对我很有效,因为我绝对不希望我的源代码中有标签。从你的问题看来,你确实想在下一行保留两个制表符和七个空格,我不确定有没有办法教 vim 来适应这种风格。

于 2008-09-16T07:24:37.863 回答
1

也许这个底部可以帮助你?

标准 vi 按字面意思解释 tab 键,但有一些流行的 vi 派生替代方案更智能,例如 vim。要让 vim 将 tab 解释为 ``indent'' 命令而不是 insert-a-tab 命令,请执行以下操作:

set softtabstop=2
于 2008-09-16T07:20:46.403 回答
1

如果要根据 'ts' 的设置将所有制表符替换为空格,可以使用 :retab。它也可以做相反的事情。

于 2008-10-01T18:50:37.553 回答