在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) 显示了不规则的标识。我只是在 Vimset ts = 4
中使用时将 2 个空格更改为 4 个。【参考方案4】:
这对我有用:
您可以先执行此操作来查看标签:
:set list
然后为了可以替换标签然后执行以下操作:
:set expandtab
然后
:retab
现在所有制表符都已替换为空格 然后你可以像这样回到正常观看:
:set nolist
【讨论】:
:set list
很漂亮。【参考方案5】:
gg=G
将重新缩进整个文件,并删除我从同事那里获得的文件中的大部分(如果不是全部)选项卡。
【讨论】:
它会用空格替换制表符吗? 太棒了!也为我工作。 你能解释一下gg=G是做什么的吗?这正是我想要的。我在 sublime 上有 html,当我将它粘贴到 vim 中时,它被疯狂地缩进。现在看起来很干净。 @jes516gg
将光标移动到缓冲区的开头。 =
是格式,接受一个移动命令。 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
这将为您每按一次<TAB>
提供两个空格,但您代码中的实际\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 命令行显示:'<,'>
。然后输入!expand -t4
为制表符到4 个空格。 (生成的命令行类似于:'<,'>!expand -t4
)【参考方案12】:
如果你正在使用 makefile 或其他文本文件,它们需要真正的制表符而不是一些空格,
首先在你的 ~/vimrc 中添加set noexpandtab
,
或者直接输入set noexpandtab
命令,
使用 vi(vim) 编辑某些文件时
【讨论】:
以上是关于在vim中用空格替换制表符的主要内容,如果未能解决你的问题,请参考以下文章