有时我发现自己在编辑一个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'
选项,因此它一致地使用制表符和空格进行缩进。这种方法的缺点是,它将完全重新格式化代码,包括在某些地方更改缩进。好处是,它通常对语言有语义理解,并且在重新定义代码块时能够考虑到这一点。