用vim中的空格替换制表符


358

我想将制表符转换为gVim中的空格。我将以下行添加到我的_vimrc

set tabstop=2

它可以在两个空格处停下来,但看起来仍然插入了一个制表键(我试图在以后使用h键来计算空格)。

我不确定如何使gVim将制表符转换为空格?


1
就个人而言,我发现tabstop = 2的缩进量太小;我使用ts = 4,并且了解为什么人们(例如Linux内核团队)使用ts = 8(他们不使用expandtab-我这样做)。
乔纳森·莱夫勒

4
有没有一种方法可以将空间转换为vim中的制表符?
2012年

2
@cwd用制表符替换空格(^I该字符Ctrl-v随后来自Tab)将起作用,例如,如果您当前的制表符为4个空格::%s/ /^I/g
Indra Ginanjar 2012年

Answers:


381

IIRC,类似:

set tabstop=2 shiftwidth=2 expandtab

应该可以。如果您已经有了制表符,请在其后添加一个不错的全局RE,以将其替换为双空格。


25
糟糕,这是“:%!expand -t2”
Paul Tomblin,2009年

368
或者你可以使用:雷泰
风铃草

如果我想用空格保存该怎么办?当我:wq并再次打开文件时,我回到标签页
Gorkem Yurtseven 2014年

1
@Gorkem将这些命令放入您的.vimrc中,以便vim每次会话都使用这些设置
Krakkos 2014年

5
这一切意味着什么,可以在Vim Wiki上很好地解释
Serge Stroobandt

824

按照其他答案展开扩展标签后,根据新设置转换现有文件的极为便捷的方法是:

:retab

它将在当前缓冲区上工作。


但是,我们如何才能让retab询问每次TAB的确认?
Oculus Dexter

8
作为Vim,它也可以在视觉上选择的区域工作:)
Andy

2
感谢您教我新事物。:%s/\t/ /g在看到您的评论之前,我已经花了数年的时间了。
大勒

您甚至可以:args retab | w对在命令行上打开的所有文件执行操作,例如vim *.txt
JakeD '18年

有人知道哪个版本的vim具有:retab吗?我的7.3.322没有。
比特币制造商

114

尝试

set expandtab

用于软标签。

修复现有标签:

:%s/\t/  /g

因为您已经将Tabstop设置为2个空格,所以我使用了两个空格。


5
该修复将在仅需要一个的地方插入两个空格。
乔纳森·莱夫勒

8
除了进行替换,您可以执行尼克上面建议的操作-即重新制表。这将重新制表所有现有的制表符,作为制表符中设置的空格数。
Gowri

很棒的提示!Vim给了我一个完美识别的文件,而cat(linux cmd)显示了不规则的识别。在Vim中,我只是将2个空格更改为4个set ts = 4
karlphillip 2011年

60

这为我工作:

您可以先查看以下标签:

:set list

然后使替换标签成为可能,然后执行以下操作:

:set expandtab

然后

:retab

现在,所有标签页都已替换为空格,然后您可以返回正常查看状态,如下所示:

:set nolist

1
:set list真漂亮。
阿米尔·沙巴尼

44

gg=G 会重新缩进整个文件,并删除我从同事那里获得的大多数(如果不是全部)选项卡。


1
是否用空格代替制表符?
likejudo

1
太棒了!也为我工作。
纳瓦兹

1
你能解释gg = G做什么吗?这正是我想要的。我在崇高上有html,当我将其粘贴到vim中时,它就疯狂地缩进了。现在看起来很干净。
jes516 '18 -10-31

3
@ jes516 gg将光标移动到缓冲区的开头。 =是格式,并接受移动命令。 G将光标移动到缓冲区的末尾,从而告诉vim从当前缓冲区的开始到结尾进行格式化。
杰克·塞勒斯

40

在.vimrc中添加以下行

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

在vim中打开文件,然后按F2键。选项卡将转换为4个空格,并且文件将自动保存。


可能值得注意的是,q也会关闭文件的当前缓冲区。这可能会或可能不会。
Willem van Ketwich

14

如果要保持\t等于8个空格,请考虑设置:

   set softtabstop=2 tabstop=8 shiftwidth=2

<TAB>按一次将为您提供两个空格,但是\t在您的代码中实际仍将被视为8个字符。


softtabstop我想感谢您提到杀手级功能之一。
Martin Ueding 2013年


4

首先在文件中搜索选项卡:/ ^ I:set expandtab:retab

将工作。


您能否解释一下第一部分
serup

3

本文有一个出色的vimrc脚本,用于处理制表符和空格,并在它们之间进行转换。

提供以下命令:

Space2Tab仅 将空格转换为制表符。

Tab2Space 将制表符转换为空格,仅以缩进形式。

RetabIndent 执行Space2Tab(如果设置了'expandtab')或Tab2Space(否则)。

每个命令都接受一个参数,该参数指定选项卡列中的空格数。默认情况下,使用“ tabstop”设置。

资料来源:http : //vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

这比我初次寻找解决方案时的回答对我有所帮助。


3

expand是用于将制表符转换为空格的Unix实用程序。如果您不想set在vim中执行任何操作,则可以使用vim中的shell命令:

:!% expand -t8

1
如果您只想扩展部分代码:首先在可视模式下选择该部分,然后按:。现在,vim命令行显示:'<,'>。然后输入!expand -t4制表符到4个空格。(生成的命令行就像:'<,'>!expand -t4
Penghe Geng
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.