16

假设您有以下文本:

name1 = "John"; age1 = 41;
name2 = "Jane"; age2 = 32;
name3 = "Mike"; age3 = 36;
...

并且您想将每一行分成两行以给出如下结果:

name1 = "John";
age1 = 41;
name2 = "Jane";
age2 = 32;
name3 = "Mike";
age3 = 36;
...

您将如何自动化此操作?

一些注意事项:

  1. 我已经尝试了以下方法:
    (1)选择virtual-vode中的文本,
    (2)执行:'<,'>:norm ^3f r^M***,
    但不能正常工作;它只分割了一半的行,因为在每一行被打破后,命令的下一次重复适用于断行的其余部分,而不是下一行!
  2. 这可以使用宏来实现,但我正在寻找更优雅的解决方案。


***顺序说明:

-norm在正常模式下执行以下命令
-^将光标移动到行首
-3f<space>将光标移动到行中的第三个空格
-用换行符r^M替换该空格

4

1 回答 1

37

要对整个文件进行操作,请使用以下命令:

:%s/; /;\r/

仅对选定文本进行操作,请使用以下命令:

:'<,'>s/; /\r/

英文翻译:

分号后跟换行符替换每次出现的 分号 后跟空格。”

解释:

%    -    operate on the entire file
s    -    substitute
/    -    symbol that separates search/replace terms
;    -    the character you're searching for (notice I added a space)
;\r  -    the replacement text (semi-colon followed by newline)

这与 Vi 中的替换一样基本。


更多极客:

对于这样的情况,我实际上在我的.vimrc文件中映射了以下内容:

"
" add a newline after each occurrence of the last search term
"
nnoremap SS :%s//&\r/<CR>

此命令在最后一个搜索模式第一次出现时拆分文件的每一行。

因此,对于您的用例,您可以这样做:

  1. 搜索;(您可能想要也可能不想包含空格……取决于您)
  2. 在正常模式下键入以下命令:SS

文件的每一行都将在第一个;符号处拆分。

为了澄清,您将使用以下 5 次击键:

/ ; ENTER S S

这对于快速格式化 XML、HTML 等非常方便……

于 2013-07-16T02:41:25.863 回答