在Vim中的可视选择上的字符之间添加空格

在Vim中的可视选择上的字符之间添加空格,vim,Vim,为了给我的评论和/或文字注释增加视觉趣味,我通常在字符的每个部分之间留出1个空格,如下所示: ////////////////////////////////////////// // VERY IMPORTANT NOTE ////////////////////////////////////////// ////////////////////////////////////////// // V E R Y I M P O R T A N T N O T E /////////

为了给我的评论和/或文字注释增加视觉趣味,我通常在字符的每个部分之间留出1个空格,如下所示:

//////////////////////////////////////////
// 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%完美:)如果你想更新你的答案,或者你对它的现状感到满意,请告诉我。非常感谢你的帮助!