我该如何在现有文件中将制表符转换为空格或者将空格转换为制表符?

231

我真的想不出来怎么做,除了在4个空格上进行查找替换并转换为制表符(版本0.10.2),我无法解决这个问题。我想不到有哪个编辑器/IDE没有特定的功能来完成这个任务。VS Code有吗?


参见:https://dev59.com/wFoV5IYBdhLWcg3wA62x - Trutane
4
如果你正在寻找一种真正完整的方案,以使用正确数量的空格替换文件中的所有制表符,请忽略下面答案的赞数,查看包括VSCode扩展程序的答案。我只试用过一个名为Tabs To Space的扩展程序,但它完美而彻底地完成了这项工作 :) - Amandalishus
10个回答

388

53
这仅转换前导空格/制表符。 - Nigel Scott
29
第一步也可以使用“ctrl+shift+p”进行。 - Alex
11
没有一个答案能够将每个制表符转换为正确且数量不同的空格。例如,输入此文本,然后进行转换:第1行:“A \ tB”。第2行:“ABC \ tD”。 - typpo
2
为什么不再读一遍问题,然后解释一下我的评论有什么问题呢? - Nigel Scott
2
有没有一种方法可以在项目中为所有文件执行此操作? - a06e
显示剩余6条评论

119

另一种方法是点击页脚上的当前缩进(Tab/Spaces:n),这将打开您的缩进选项,您可以在其中选择所需操作。

在此输入图片描述

27
只有缩进中的制表符会被转换,而不是所有的制表符。 - David Given
1
这适用于将未来的制表符转换为空格,还是仅适用于现有的制表符? - evanrmurphy

85
如果您想将非前导制表符转换为空格(或反之亦然),可以使用正则表达式搜索和替换。
按下CTRL + H键。 单击“.*”按钮,以使用正则表达式进行搜索。 要搜索制表符,请在“查找”框中输入“[\t]”。 在“替换”框中输入空格并执行替换。
正则表达式模式下的搜索框: screenshot of VSCode regex search box

47
这会将每个制表符转换为相同数量的空格,这是不正确的。 - David Given
无法正常工作,添加更多空格会弄乱一切。 - Emmanual
1
如果你想将制表符分隔的数据格式转换为逗号分隔的格式,这真的非常有帮助。 :) - Breedly
2
这个答案是灵活的。如果你想将连续的制表符转换为固定数量的空格,而且不熟悉正则表达式,请将[\t]改为[\t]+ - Ders
@Emmanual 这个答案很灵活,如果你想通过编程进行更改,只需要更新正则表达式模式即可。 - Luke
哎呀,我不想跳进正则表达式地狱,尤其是在 VSC 中。 - Tom Stambaugh

12
为了补充这些答案,我将介绍将每个制表符转换为n个空格的方法。
  1. 选中一个制表符
  2. 使用CTRL+F2选择所有出现的制表符
  3. 按下SPACE键n次
这是最简单的方法(不仅仅是将导航标签转换为n个空格)。
请注意,这并没有将连续的制表符转换为k个空格。对于连续的制表符,请参见我的评论 jrupe's answer。您需要使用正则表达式的VS Code查找和替换来完成此操作。

8
  1. 选择替换: CTRL-H
  2. 在查找框中输入水平制表符:按住ALT键,然后在小键盘上键入009。
  3. 在替换框中输入一个空格(或多个空格):按下空格键
  4. 按Enter键开始将Tab替换为空格(s)。

2
这对我没有用,但是我在下面发布了一个答案,使用正则表达式来处理非前导空格/制表符。 - jrupe
18
这会将每个制表符转换为相同数量的空格,但这并不正确。 - David Given
1
ALT 009 可能只在 Windows 上起作用? - mckenzm

6

快进到2020/2021年,有一些扩展可以帮助我们进行这种转换。我刚需要这个功能(因此我找到了这篇文章),在搜索扩展时,我发现了以下几个:

  • geocode.spacecadet - 提供TAB->SPC和SPC->TAB两种转换方式,但自2017年以来没有更新,有1.3k次安装和3.5的评分。
  • takumii.tabspace - TAB->SPC转换,来自2020年,有1.5k次安装,没有评论。
  • pygc.spacetab - SPC->TAB转换,从...等等,就是昨天!(或者根据你的时区可能是今天),只有2次安装,没有评论。

6
为了跟进这个问题,我刚刚下载了Takumil开发的Tab To Space插件,它完全做到了它应该做的事情。我无法相信它已经有了将近2000次的下载却没有评分。我写了一篇评论并给了它5颗星,因为虽然它只完成了一项功能,但是它做得绝对完美。无论赞成票的数量如何,这都是对提问者问题最完整的回答。 - Amandalishus
请问您能否解释一下扩展与其他答案中描述的内置功能有何不同?根据那些答案,使用VSCode开箱即用似乎非常容易。 - Zach Lysobey
@ZachLysobey 有许多不同的选项,其中大多数都有解释。你在比较哪一个? - Alexei Z
@AlexeiZ 似乎VSCode可以愉快地转换制表符<->空格,而无需任何扩展程序。我只是好奇这些扩展程序提供了什么样的附加价值(如果有的话)? - Zach Lysobey
2
@Zach Lysobey,如果制表符不是新行中的首个字符,则VSCode不会将其转换。我想这是本帖中许多人面临的主要问题。 - csiz
@csiz 噢,那很有道理。我个人仍然会选择另一种方法(比如正则表达式搜索+替换),但也许对某些人来说这很有用。 - Zach Lysobey

5

按F1,然后在文本框中输入“将缩进转换为空格”或其他您想要的内容。


3
只转换行首制表符,不转换行中制表符。 - AlexChaffee

2
在Visual Studio中,Ctrl+K+F对我很有效。

2
这是Visual Studio中的“格式选择”快捷方式,根据您的格式设置,它可能会影响制表符/空格。这与OP关于VS Code的问题也不太相关。 - Reilly Wood

1
这是一个实用的解决方案,可以正确替换(包括不同数量的空格),不仅适用于前导空格。
假设你的制表符长度为4个空格,请按照以下步骤操作:
1. 使用^(([^\t]*\t+)?([^\t]{4})*?[^\t]{0})\t替换为$1 (4个尾随空格)。 2. 使用^(([^\t]*\t+)?([^\t]{4})*?[^\t]{1})\t替换为$1 (3个尾随空格)。 3. 使用^(([^\t]*\t+)?([^\t]{4})*?[^\t]{2})\t替换为$1 (2个尾随空格)。 4. 使用^(([^\t]*\t+)?([^\t]{4})*?[^\t]{3})\t替换为$1 (1个尾随空格)。 在每次替换后,重复按下Ctrl+Alt+Enter,直到找不到结果为止。
如果你的制表符长度是2个空格,那么你只需要按照以下步骤操作:
1. 将^(([^\t]*\t+)?([^\t]{4})*?[^\t]{0})\t替换为$1 (2个尾随空格)。 2. 将^(([^\t]*\t+)?([^\t]{4})*?[^\t]{1})\t替换为$1 (1个尾随空格)。
将空格替换为制表符可以用类似的方法完成。

0

用于转换缩进

使用 命令面板 中的 将缩进转换为制表符将缩进转换为空格 命令。

默认情况下,VS Code 会尝试检测编辑器选项卡使用的缩进样式,并在按下 tab 键时匹配该行为。您可以通过将 "editor.detectIndentation": false 放入 settings.json 文件 中来禁用该行为。

如果您保留缩进类型检测功能,则可以使用命令面板中的 使用制表符进行缩进 命令来为尚未缩进的新文件设置缩进样式为制表符,或者使用 使用空格进行缩进 来设置为空格。

如果您将 editor.detectIndentation 设置为 false,则会生效 editor.insertSpaces 设置,其默认值为 true,这会导致 tab 键插入空格而不是实际的制表符。

另请参阅editor.tabSize设置(制表符的可视宽度,以及在editor.insertSpacestrueeditor.detectIndentationfalse时插入的空格数)。

您还可以通过在settings.json文件中将它们包装在"[<language-mode-name>]: { ... }"块中来按语言模式配置这些设置。

您可能还对如何在VS Code中跨多个文件执行命令?感兴趣。

用于任何固定宽度转换

(重点是固定宽度 - 这不是制表符敏感的)

您可以使用查找小部件(ctrl/cmd+f):

  • 要从制表符转换为空格,可以启用正则表达式模式 (alt+r) 并搜索 \t ,或将一个制表符粘贴到搜索字段中,然后在替换字段中输入所需的空格数,然后按下“全部替换”按钮或使用其工具提示中显示的键盘快捷键。

  • 要从空格转换为制表符,启用正则表达式模式,并搜索 {1,N} ,其中 N 是您所需的制表位宽度,然后在替换字段中输入 \t 并替换所有。如果您想要保留独立的单个空格,请尝试在搜索输入中输入 {2,N}|((?<= {N-1}) )。请注意,由于编辑器制表位行为的原因,这不能保留精确的视觉间距(制表符将与制表位对齐)。

要在多个文件中进行替换,请使用“搜索视图”,该视图的界面类似于查找小部件。您可以使用扩展搜索控件(使用三个点的“切换搜索详细信息”按钮)来排除/包含全局模式进行替换。


我尝试着开发一些更加灵敏的制表位,基于原生VS Code的解决方案,但是没有取得太多进展,可能还遇到了VS Code的一个bug。也许有一天我会回来继续研究这个问题,但是我认为在任何允许用户选择制表位宽度,并且使用或希望使用非前导缩进的项目中,你都不会得到理想的结果-至少在IDE中常见的制表位行为中不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接