阅读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
答案 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}},第二个是空格到制表符。