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

时间:2014-12-18 13:30:52

标签: vim indentation

我想用标签替换行开头的所有空格。以下代码段有效,但仅适用于第一个缩进级别。

如何使其适用于 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计划,但我宁愿不依赖外部公用事业。

1 个答案:

答案 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'