vim:用另一个字符串

时间:2018-05-10 02:35:24

标签: vim

阅读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

1 个答案:

答案 0 :(得分:1)

您可以通过预先&获取Vimscript中的选项值。因此,标签的大小为&tabstop&ts。还有&softtabstop&sts),选择你真正关心的那个。

虽然您需要将空格数乘以tab的大小,但您需要除以标签的数量。然后还有剩下的人要照顾。所以,首先设置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!

第一个会将标签更改为空格;根据{{​​1}},第二个是空格到制表符。