ChatGPT解决这个技术问题 Extra ChatGPT

在vim中用空格替换制表符

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

set tabstop=2

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

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

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

D
Daniel Hershcovich

根据其他答案打开扩展选项卡后,根据新设置转换现有文件的极其方便的方法是:

:retab

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


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

IIRC,类似于:

set tabstop=2 shiftwidth=2 expandtab

应该做的伎俩。如果您已经有制表符,那么请使用一个不错的全局 RE 将其替换为双空格。

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

:retab

糟糕,那是 ":%!expand -t2"
或者你可以使用 :retab
如果我想用空格保存它怎么办?现在,当我 :wq 并再次打开文件时,我回到了选项卡
@Gorkem 将这些命令放入您的 .vimrc 中,以便 vim 在每个会话中使用这些设置
这一切的意思是nicely explained on the Vim wiki
H
Hank Gay

尝试

set expandtab

对于软标签。

要修复预先存在的选项卡:

:%s/\t/  /g

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


该修复将在只需要一个的地方插入两个空格。
而不是做替换,你可以做尼克上面建议的 - 即retab。这会将所有现有选项卡重新标记为制表位中设置的空格数。
很棒的提示! Vim 向我展示了一个完全标识的文件,而 cat (linux cmd) 显示了不规则的标识。我只是将 2 个空格更改为 4,就像我在 Vim set ts = 4 中使用的那样。
s
serup

这对我有用:

你可以看到标签首先这样做:

:set list

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

:set expandtab

然后

:retab

现在所有选项卡都已替换为空格,然后您可以像这样返回正常查看:

:set nolist

:set list 很漂亮。
J
Jake Sellers

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


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

将以下行添加到您的 .vimrc

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

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


可能值得注意的是,q 也会关闭文件的当前缓冲区。这可能是也可能不是所希望的。
p
pk.

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

   set softtabstop=2 tabstop=8 shiftwidth=2

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


感谢您提及 softtabstop,我认为这是杀手级功能之一。
W
Willem van Ketwich

这让它对我有用:

:set tabstop=2 shiftwidth=2 expandtab | retab

感谢您提供有关 :retab 的提示。我将其添加到已接受的答案中,因此没有人会错过重要的部分:-)
C
Community

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

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


S
Shekar

首先在文件中搜索标签:/^I :set expandtab :retab

将工作。


第一部分你能解释一下吗
q
qwr

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

:!% expand -t8

如果您只想扩展代码的一部分:首先在可视模式下选择该部分,然后按 :。现在 vim 命令行显示 :'<,'>。然后为制表符输入 !expand -t4 到 4 个空格。 (生成的命令行类似于 :'<,'>!expand -t4
A
Andronicus

如果你正在使用 makefile 或其他文本文件,除了一些空格之外还需要真正的制表符,请先在 ~/vimrc 中添加 set noexpandtab,或者在使用 vi(vim) 编辑某些文件时输入 set noexpandtab 命令