vim中的制表符和空格


71

启用自动缩进后,如何防止vim用制表符替换空格?

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

vim  vi 

Answers:


78

根本不使用标签可能是个好主意。

: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.

1
值得注意的是,选项卡仍以粘贴模式插入。虽然这很有意义,但我花了我一整天才弄清楚那些讨厌的标签来自何处。专家提示::set list:set listchars = tab:>
Quartarian

47

您可以将所有转换TABSPACE

:set et
:ret!

或全部转换SPACETAB

:set et!
:ret!

1
很高兴知道此命令。我曾经在复制粘贴时通过使用gedit来解决“ python麻烦”。
Nav

41

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

:help copyindent

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

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

注意:设置为“兼容”时,将重置“ copyindent”。 另请参见'preserveindent'

:help preserveindent

“preserveindent” “P1” 布尔 (缺省关闭); 本地缓冲 {Vi无此功能}

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

注意:多次使用“ >>”时,结果缩进是制表符和空格的混合。您可能不喜欢这样。
注意:设置为“兼容”时,将重置“ preserveindent”。 另请参见'copyindent'。 使用:retab清理空白。


26

这是我的一部分.vimrc

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

这对我来说效果很好,因为我绝对不希望在源代码中使用制表符。从您的问题看来,您确实希望在下一行保留两个制表符和七个空格,而且我不确定是否有一种方法可以教vim适应这种风格。


1

也许这可以帮助您?

标准vi会按字面意义解释Tab键,但是有一些流行的源自vi的更聪明的选择,例如vim。要使vim将tab解释为``缩进''命令而不是insert-a-tab命令,请执行以下操作:

set softtabstop=2

1

如果要基于“ ts”的设置用空格替换所有选项卡,则可以使用:retab。它也可以相反。


3
Super retab ”: :retab转换所有制表符或空格序列,即使那些可能在“像这样的引号字符串中”的序列也是如此。本技巧说明如何仅转换左边距的缩进。第一个非白色字符之后的任何空格或制表符都不会受到影响。
亚伦·托马
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.