我想用标签替换行开头的所有空格。以下代码段有效,但仅适用于第一个缩进级别。
如何使其适用于 1到∞缩进级别?这样它就会用3个标签替换12个空格(假设tabstop
为4)?
fun! Retab()
let l:spaces = repeat(' ', &tabstop)
silent! execute '%s/^' . l:spaces . '/\t/g'
endfun
请注意,使用:retab
似乎不是一个选项,因为:retab
不仅会更改缩进,还会更改所有repeat(' ', &tabstop)
次出现无处不在在文件中。
重新缩进文件(使用=
)也不是一个选项,因为Vim&我有时会对在哪个级别缩进的内容有不同的看法(即它有太多的副作用)。
我还考虑过使用expand
& unexpand
计划,但我宁愿不依赖外部公用事业。
答案 0 :(得分:2)
您的尝试进入正确的方向,但您需要: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'