在Vim中的可视选择上的字符之间添加空格
为了给我的评论和/或文字注释增加视觉趣味,我通常在字符的每个部分之间留出1个空格,如下所示:在Vim中的可视选择上的字符之间添加空格,vim,Vim,为了给我的评论和/或文字注释增加视觉趣味,我通常在字符的每个部分之间留出1个空格,如下所示: ////////////////////////////////////////// // VERY IMPORTANT NOTE ////////////////////////////////////////// ////////////////////////////////////////// // V E R Y I M P O R T A N T N O T E /////////
//////////////////////////////////////////
// VERY IMPORTANT NOTE
//////////////////////////////////////////
//////////////////////////////////////////
// V E R Y I M P O R T A N T N O T E
//////////////////////////////////////////
使用“普通”编辑器(只需按
直到单词/行结束),这就足够简单了,但现在我已经习惯了Vim,感觉很奇怪:必须有更好的方法
在Vim中也不是那么容易:我显然可以创建一个带有“a l
”的宏,但这有点笨拙,特别是因为你必须计算你想要重复宏的次数。
是否有一种方法可以直观地选择一行/单词/任何东西,并自动执行我需要执行的操作
我读了一些基本上实现了我想要的正则表达式[%s/pattern/\=join(split(submatch(0),'\zs'),'')/g]
,但我想不出一种使用视觉选择而不是特定模式的方法
在我开始思考如何创建插件之前,有什么想法吗?
谢谢 那么:
:xnoremap µ s<c-r>=substitute(@", '.\ze.', '& ', 'g')<cr>
:xnoremapµs=替换(@“,”.\ze“,”和“,”g”)
v\u s
剪切所选内容并将其放入默认寄存器@“
,然后您可以通过i\u CTRL-R=
和substitute()
重新注入已转换的内容。如果愿意,您也可以使用split()
+join()
,但是\ze。
已经注意到在最后一个选定的字符后不添加额外的空格。如何:
:xnoremap µ s<c-r>=substitute(@", '.\ze.', '& ', 'g')<cr>
:xnoremapµs=替换(@“,”.\ze“,”和“,”g”)
v\u s
剪切所选内容并将其放入默认寄存器@“
,然后您可以通过i\u CTRL-R=
和substitute()
重新注入已转换的内容。如果愿意,您也可以使用split()
+join()
,但是\ze。
已经注意到在选择的最后一个字符后不添加额外的空格。作为参考,下面是我采用的完整解决方案
根据Luc Hermitte的回答,我最终以两种不同的模式进行了映射
第一个在视觉模式下:
vnoremapçs=substitute(@“,”.\ze“,”&“g”)
这只需应用Luc的出色解决方案,在所有选定字符之间添加空格
正常模式下的第二个:
nnoremapç0v$hs=substitute(@“,”.\ze“,”和“,”g')
这一个,非常类似地,在应用Luc的命令之前,在视觉模式下预先选择(使用0v$h
)当前行(最后一个换行符除外)
非常有用的东西,在这个过程中我学到了很多东西
希望它有用,请欣赏Vim:)作为参考,以下是我采用的完整解决方案 根据Luc Hermitte的回答,我最终以两种不同的模式进行了映射 第一个在视觉模式下:
vnoremapçs=substitute(@“,”.\ze“,”&“g”)
这只需应用Luc的出色解决方案,在所有选定字符之间添加空格
正常模式下的第二个:
nnoremapç0v$hs=substitute(@“,”.\ze“,”和“,”g')
这一个,非常类似地,在应用Luc的命令之前,在视觉模式下预先选择(使用0v$h
)当前行(最后一个换行符除外)
非常有用的东西,在这个过程中我学到了很多东西
希望它有用,请欣赏Vim:)这实际上非常接近,谢谢!!只有两个“缺陷”:它在选择之前添加了一个空格,并且[使用V命令]对所选行不起作用(我想问题在于换行符,它不会被替换跳过,因此您会得到
)。但是,嘿,你已经98%在那里了。。。。你能达到100%吗DAlso,为了更好地“包装它”,我在映射中添加了一个final。我在编辑中引入了一个回归,它应该是\ze。
对于另一个问题,我找到了一个愚蠢但有效的解决方案:我在正常模式下映射了命令,添加了一个“选择除换行字符以外的所有行”命令(0v$h)
,并将您的命令稍微更改为仅在可视模式下存在:vnoremapµs=substitute(@“,”.\ze.”,“&”,“g”)
nnoremapµ0v$hs=substitute(@“,”.\ze.”,“&”,“g”)
99.9%完美:)如果你想更新你的答案,或者你对它的现状感到满意,请告诉我。非常感谢你的帮助!这真的很接近,谢谢!!只有两个“缺陷”:它在选择之前添加了一个空格,并且[使用V命令]对所选行不起作用(我想问题在于换行符,它不会被替换跳过,因此您会得到
)。但是,嘿,你已经98%在那里了。。。。你能达到100%吗DAlso,为了更好地“包装它”,我在映射中添加了一个final。我在编辑中引入了一个回归,它应该是\ze。
对于另一个问题,我找到了一个愚蠢但有效的解决方案:我在正常模式下映射了命令,添加了一个“选择除换行字符以外的所有行”命令(0v$h)
,并将您的命令稍微更改为仅在可视模式下存在:vnoremapµs=substitute(@“,”.\ze.”,“&”,“g”)
nnoremapµ0v$hs=substitute(@“,”.\ze.”,“&”,“g”)
99.9%完美:)如果你想更新你的答案,或者你对它的现状感到满意,请告诉我。非常感谢你的帮助!