在vim中用空格替换制表符

Posted

技术标签:

【中文标题】在vim中用空格替换制表符【英文标题】:Replace tabs with spaces in vim 【发布时间】:2010-09-30 10:18:39 【问题描述】:

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

set tabstop=2

它可以在两个空格处停止,但看起来仍然像插入了一个 tab 键(我尝试使用 h 键来计算空格)。

我不确定我应该怎么做才能让 gVim 将制表符转换为空格?

【问题讨论】:

就个人而言,我发现 tabstop=2 缩进太小了;我使用 ts=4,并且理解为什么人们(例如 Linux 内核团队)使用 ts=8(他们不使用 expandtab - 我使用)。 有没有办法在vim中将空格转换为制表符? @cwd 用制表符替换空格(^I 来自 Ctrl-v 然后 Tab )会起作用,例如,如果您当前的制表符是 4 个空格::%s/ /^I/g 【参考方案1】:

一旦您按照其他答案打开了 expandtab,根据您的新设置转换现有文件的极其方便的方法是:

:retab

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

【讨论】:

但是我们如何让 retab 询问每次出现的 TAB 的确认? 作为 Vim,它也适用于视觉选择的区域 :) 谢谢你教我一个新东西。在看到您的评论之前,我已经使用乏味的 :%s/\t/ /g 多年了。 你甚至可以使用:args retab | w 对命令行中打开的所有文件执行操作,例如vim *.txt 有谁知道哪个版本的 vim 有 :retab?我的 7.3.322 没有。【参考方案2】:

IIRC,类似于:

set tabstop=2 shiftwidth=2 expandtab

应该可以解决问题。如果您已经有选项卡,然后用一个漂亮的全局 RE 来用双空格替换它们。

如果您已经有要替换的标签,

:retab

【讨论】:

糟糕,这是“:%!expand -t2” 或者你可以使用 :retab 如果我想用空格保存它怎么办?现在,当我 :wq 并再次打开文件时,我回到了标签页 @Gorkem 将这些命令放入您的 .vimrc 中,以便 vim 在每个会话中使用这些设置 这是什么意思,是nicely explained on the Vim wiki。【参考方案3】:

试试

set expandtab

用于软标签。

修复预先存在的标签:

:%s/\t/  /g

我使用了两个空格,因为您已经将制表位设置为 2 个空格。

【讨论】:

这个修正会在只需要一个的地方插入两个空格。 您可以执行 Nick 上面建议的操作,而不是进行替换 - 即 retab。这会将所有现有选项卡重新标记为制表位中设置的空格数。 很棒的提示! Vim 向我展示了一个完全标识的文件,而 cat (linux cmd) 显示了不规则的标识。我只是在 Vim set ts = 4 中使用时将 2 个空格更改为 4 个。【参考方案4】:

这对我有用:

您可以先执行此操作来查看标签:

:set list

然后为了可以替换标签然后执行以下操作:

:set expandtab

然后

:retab

现在所有制表符都已替换为空格 然后你可以像这样回到正常观看:

:set nolist

【讨论】:

:set list 很漂亮。【参考方案5】:

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

【讨论】:

它会用空格替换制表符吗? 太棒了!也为我工作。 你能解释一下gg=G是做什么的吗?这正是我想要的。我在 sublime 上有 html,当我将它粘贴到 vim 中时,它被疯狂地缩进。现在看起来很干净。 @jes516 gg 将光标移动到缓冲区的开头。 = 是格式,接受一个移动命令。 G 将光标移动到缓冲区的末尾,因此它告诉 vim 从当前缓冲区的开头到结尾进行格式化。【参考方案6】:

将以下行添加到您的 .vimrc

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

在 vim 中打开一个文件并按 F2 制表符将转换为 4 个空格并自动保存文件。

【讨论】:

可能值得注意的是q 也会关闭文件的当前缓冲区。这可能需要也可能不需要。【参考方案7】:

如果您想让\t 等于 8 个空格,请考虑设置:

   set softtabstop=2 tabstop=8 shiftwidth=2

这将为您每按一次&lt;TAB&gt; 提供两个空格,但您代码中的实际\t 仍将被视为 8 个字符。

【讨论】:

感谢您提及softtabstop,我认为这是杀手级功能之一。【参考方案8】:

这对我有用:

:set tabstop=2 shiftwidth=2 expandtab | retab

【讨论】:

感谢 :retab 的提示。我将其添加到已接受的答案中,因此没有人会错过重要的部分:-)【参考方案9】:

这篇文章有一个出色的 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>)

与我第一次寻找解决方案时这里的答案相比,这对我的帮助更大。

【讨论】:

【参考方案10】:

首先搜索文件中的标签:/^I :设置扩展选项卡 :retab

会起作用的。

【讨论】:

第一部分你能解释一下吗【参考方案11】:

expand 是一个用于将制表符转换为空格的 unix 实用程序。如果你不想在 vim 中 set 任何东西,你可以使用 vim 中的 shell 命令:

:!% expand -t8

【讨论】:

如果您只想扩展代码的一部分:首先在可视模式下选择该部分,然后按:。现在 vim 命令行显示:'&lt;,'&gt;。然后输入!expand -t4 为制表符到4 个空格。 (生成的命令行类似于:'&lt;,'&gt;!expand -t4【参考方案12】:

如果你正在使用 makefile 或其他文本文件,它们需要真正的制表符而不是一些空格, 首先在你的 ~/vimrc 中添加set noexpandtab, 或者直接输入set noexpandtab 命令, 使用 vi(vim) 编辑某些文件时

【讨论】:

以上是关于在vim中用空格替换制表符的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 的文本文件中用逗号替换空格

Vim自动缩进配置原理和tab键替换空格-Vim使用技巧

Java如何去除字串中的空格、回车、换行符、制表符

如何让linux中的空格和制表符原形毕露

如何替换掉字符串里的空格?

正则表达式 Python - 用单个空格替换换行符、制表符、空格的任意组合[重复]