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

时间:2016-03-10 10:42:13

标签: vim

为了增加我的评论和/或文字笔记的视觉兴趣,我通常在每个字符部分之间放置1个空格,如下所示:

//////////////////////////////////////////
// VERY IMPORTANT NOTE
//////////////////////////////////////////

//////////////////////////////////////////
// V E R Y   I M P O R T A N T   N O T E
//////////////////////////////////////////

对于&#34;正常&#34;这很简单。编辑器(你只需按<right arrow> <space>直到单词/行的结尾),但现在我已经习惯了Vim,感觉很奇怪:必须有更好的方法。

同样在Vim中也不容易:我显然可以使用&#34; a <space> <esc> l&#34;创建一个宏,但它有点笨拙,特别是因为你必须计算你要重复多少次宏。 有没有办法直观地选择一行/单词/什么,并自动完成我需要做的事情?

我阅读了this answer here on S.O.,它基本上达到了我想要的正则表达式[%s/pattern/\=join(split(submatch(0),'\zs'), ' ')/g],但我无法想出一种使用我的视觉选择而不是特定模式的方法。

在开始考虑如何创建插件之前有任何想法? 谢谢!

2 个答案:

答案 0 :(得分:2)

怎么样:

:xnoremap µ s<c-r>=substitute(@", '.\ze.', '& ', 'g')<cr>

v_s剪切选区并将其放入默认注册@",然后您可以重新注入它,感谢i_CTRL-R=substitute()。如果您愿意,也可以使用split() + join(),但\ze.已经考虑在最后一个字符后添加额外的空格。

答案 1 :(得分:0)

作为参考,这是我采用的完整解决方案。

根据Luc Hermitte的回答,我最终以两种不同的模式进行映射。

视觉模式中的第一个:

vnoremap ç s<c-r>=substitute(@", '.\ze.', '& ', 'g')<cr><esc>

这仅仅适用于Luc的精彩解决方案,在所有选定的角色之间添加空格。

正常模式下的第二个:

nnoremap ç 0v$hs<c-r>=substitute(@", '.\ze.', '& ', 'g')<cr><esc>

这个,非常类似,在应用Luc的命令之前,在视觉模式中预先选择(使用0v$h)除最终换行符之外的当前行。

非常有用的东西,我在这个过程中学到了很多东西!

希望它有用,享受Vim:)