vim - 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
解决方案
您可以通过在 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
。
推荐阅读
- monitoring - 监控异构基础设施的推荐解决方案是什么?
- javascript - 过滤数据并映射唯一接收到的数据
- hadoop - hdfs 删除正在写入的文件
- javascript - 如何将用户输入的日期时间转换为 UTC 并在 Javascript 中使用远程服务器存储在数据库中
- javascript - allowEdit 属性不适用于 Cordova 应用程序中的 iOS 相机
- docker - 如何正确连接docker中的工作节点?
- ios - 将数据保存在特定用户 ID iOS - Alamofire, Json
- azure - 在 Microsoft Azure 中托管的网站上使用 Google Analytics
- angular - Angular 和 Iframe 不会重定向正确的窗口
- javascript - 添加事件侦听器后的javascript发出调用函数