Vim 用制表符替换行开头的所有空格

Vim 用制表符替换行开头的所有空格,vim,indentation,Vim,Indentation,我想用制表符替换行开头的所有空格。下面的代码段可以工作,但仅适用于第一个缩进级别 如何让它在1到10天内工作∞ 缩进水平?这样它就用3个制表符替换了12个空格(假设tabstop为4) 请注意,在这里使用:retab似乎不是一个选项,因为:retab不仅会更改缩进,还会更改文件中所有的重复(“”,&tabstop) 重新缩进文件(使用=)也不是一个选项,因为Vim&I有时对应该在哪个级别缩进的内容有不同的意见(即,它有太多的副作用) 我还考虑过使用展开&未展开程序,但我不希望依赖外部实用程序。您

我想用制表符替换行开头的所有空格。下面的代码段可以工作,但仅适用于第一个缩进级别

如何让它在1到10天内工作∞ 缩进水平?这样它就用3个制表符替换了12个空格(假设
tabstop
为4)

请注意,在这里使用
:retab
似乎不是一个选项,因为
:retab
不仅会更改缩进,还会更改文件中所有的
重复(“”,&tabstop)

重新缩进文件(使用
=
)也不是一个选项,因为Vim&I有时对应该在哪个级别缩进的内容有不同的意见(即,它有太多的副作用)


我还考虑过使用
展开
&
未展开
程序,但我不希望依赖外部实用程序。

您的尝试方向正确,但您需要
:help sub replace expr
来计算匹配空格的数量,并将其转换为相应数量的制表符:

silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
要执行相反的操作(将选项卡替换为空格),可以执行以下操作:

silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'

另一种将制表符转换为空格的方法是
:设置et
,然后设置
>
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'