如何重构现有的源代码文件以规范选项卡的所有使用



有时我发现自己在编辑一个C源文件,该文件将tab的使用视为四个空格,并将其视为常规tab。

是否有任何工具可以尝试解析文件并对此进行"规范化",即将所有出现的四个空格转换为常规制表符,或将出现的所有制表符转换为四个空格,以保持一致?

我想这样的事情即使只需要一个简单的vim-one-line也可以完成吗?

:retab:retab!可以提供帮助,但也有一些注意事项。

如果你使用空格进行缩进,那么只需设置'expandtab'并执行:retab,那么你的所有选项卡都会在适当的制表位(默认为8(转换为空格,这会更容易。这很容易,而且这种方法中没有陷阱!

如果要使用4空格缩进,请保持启用'expandtab'并将'softtabstop'设置为4。(避免修改'tabstop'选项,它应该始终保持在8。(

如果您想做相反的操作并转换为制表符,则可以设置'noexpandtab',然后使用:retab!(它还将查看空间序列并尝试将它们转换回制表符。(这种方法的主要问题是,它不仅考虑缩进进行转换,还考虑行中间的空间序列,这可能会导致操作影响代码中的字符串,这是非常不可取的。

也许用制表符替换空格以进行缩进的更好方法是使用以下替代命令:

:%s#^s+#=repeat("t", indent('.') / &tabstop).repeat(" ", indent('.') % &tabstop)#

是的,这是一口。。。它匹配行开头的空白,然后使用indent()函数找到总缩进量(该函数计算考虑制表位的缩进量(,然后将其除以'tabstop',以决定特定行需要多少制表位和多少空格。

如果此命令适用于您,您可能需要考虑为其添加映射或:command,以方便使用。例如:

command! -range=% Retab <line1>,<line2>s#^s+#=repeat("t", indent('.') / &tabstop).repeat(" ", indent('.') % &tabstop)

这还允许您"重新标记"文件的一个范围,包括使用视觉选择选择的文件。

最后,:retab的最后一个替代方案是要求Vim使用=命令完全"重新格式化"您的代码,该命令将使用当前的'indentexpr'或其他缩进配置(如'cindent'(来完全重新缩进块。这通常尊重'noexpandtab''smarttabstop'选项,因此它一致地使用制表符和空格进行缩进。这种方法的缺点是,它将完全重新格式化代码,包括在某些地方更改缩进。好处是,它通常对语言有语义理解,并且在重新定义代码块时能够考虑到这一点。

最新更新