首页 > 解决方案 > vim:用另一个字符串替换 n 个字符串

问题描述

在阅读Vim regex replace with n characters之后,我知道如何用空格替换制表符:

:%s/^\v(\t)*/\=repeat(repeat(' ',4),strlen(submatch(0)))/g

上面的命令允许我用 n 个四个空格替换每行开头的 n 个制表符。

现在我想反转它:在每行开头用n个制表符替换n个四空格,我认为命令应该是:%s/^\v( )*/\=repeat("\t",strlen(submatch(0)))/g,但是它不起作用:如果有一个四空格,它将被替换为四个执行命令后的选项卡(但我想让它只有一个选项卡)。

此外,是否可以获取 vim 的制表符长度,以便我可以执行如下命令?

:%s/^\v(\t)*/\=repeat(repeat(' ',getSizeOfTab()),strlen(submatch(0)))/g

标签: vim

解决方案


您可以通过在 Vimscript 中添加&. 所以,制表符的大小是&tabstop, 或&ts。还有&softtabstop&sts),选择你真正关心的。

虽然您需要将空格数乘以制表符的大小,但您需要除以制表符的数量。然后剩下的要处理。所以,首先设置你的tabstop

:set ts=4

然后你可以从制表符转换为空格,从空格转换为制表符,如下所示:

:%s/^\v(\t)*/\=repeat(repeat(' ',&ts),strlen(submatch(0)))/g

:%s#^\v( )*#\=repeat("\t",strlen(submatch(0))/&ts).repeat(' ',strlen(submatch(0))%&ts)#g

(将分隔符从 更改/#因为我需要/除法 :P )

但是...看来您在这里重新发明了轮子。:help :retab!:help 'expandtab'。先tabstop如上设置,然后:

:set et | ret!

:set noet | ret!

第一个将制表符更改为空格;第二个,空格到制表符,根据tabstop


推荐阅读