插入一些空格替换

时间:2014-01-19 15:33:47

标签: regex vim

我有一长串代码需要分成不同的行:

Method(new Namespace::ClassName(LongParameterName1, LongParameterName1, LongParameterName3));

我想通过以下方式拆分它:

Method(new Namespace::ClassName(LongParameterName1,
                                LongParameterName1,
                                LongParameterName3));

正则表达式将如下:

s:, :,\r                         :

如何设置使用的空格数(如果可以的话)?

注意:我有相当多的这样的行,这就是我想使用正则表达式的原因。

3 个答案:

答案 0 :(得分:2)

您可以在以下行中计算要开始变量名称的位置,并使用带表达式的替换命令,如:

:let c = strridx(getline('.'), '(')
:s/\v(,)/\=submatch(1) . "\r" . printf("%" . c . "s", " ")/g

我在两条指令中写了它们以避免Markdown滚动,但你可以用管道符加入它们。

第一条指令搜索最后一个开括号的位置(从结尾开始的第一个)。第二条指令使用printf()在换行符之后插入该数量的空格。

它产生:

Method(new Namespace::ClassName(LongParameterName1,
                                LongParameterName1,
                                LongParameterName3));

要多次重复此任务,您可以将这些指令包装在函数中,并从:g命令调用它们。我希望你明白这一点。

答案 1 :(得分:1)

我该怎么做:

  • 设置一个宏(qa')搜索下一个','(<escape>\,),跳转到编辑模式并按Enter(i<enter>),退出录制宏( q
  • 非常快地重播该宏,直到我完成该行(@a然后@@
  • 替换第二行上的光标并开始录制新的宏(qa'):I然后按<space>直到您的参数被充分标记,并移至下一行替换第一个角色(<escape>j^)上的光标,退出录制宏(q
  • 并重播最后一个宏,如第一个(@a然后@@

看起来不像正则表达式那么优雅,但恕我直言,当它完成任务时,是时候完成任务了:)

答案 2 :(得分:1)

我先使用正则表达式然后缩进。例如......

s:, :,\r:g
V?Method<cr><cr>8>

在实际操作中,我可能会使用>.......代替8>,因为它可以让您看到缩进的数量。