将行合并到vim中的段落

时间:2017-04-30 17:38:54

标签: vim

我有很多行的文字。连续的行是一个段落的一部分。但是用空行分隔的行是单独段落的一部分。因此,以下文字包含2个段落的行:

%s/\n\n\@!//g

我使用以下代码将连续的行合并为段落:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.
second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

结果是:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.

second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

因此形成了段落,但它们没有用空行分隔。如果我再次运行我的命令,它们也会合并为一个段落。如何修改我的代码以在新制作的段落之间保留一个空行,以便输出如下:

while(current.parent != null)
{
      solution.Add(current.move);
      current = current.parent;
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

这个有效(与Manuel Schmidt的回答非常相似):

:%s/[^\n]\zs\n\ze[^\n]//

一些解释:

  • 将在\zs\ze之间移除的内容(回车\n
  • [^\n]表示:任何字符,但回车

所以命令意味着:请删除一个回车符,但只有当它在两个非回车字符之间时

编辑:来自melpomene的更好的解决方案:

:%s/.\zs\n\ze.//

答案 1 :(得分:1)

:%s/\([^\n]\)\n\([^\n]\)/\1\2/g

完成工作。

您在这里使用替换组。你搜索

  • 非新行字符(稍后用\ 1打印)
  • 新行字符(稍后省略)
  • 非新行字符(稍后用\ 2打印)

答案 2 :(得分:1)

考虑到这是一个vim问题,这里是一个vim答案(而不是RegEx答案)。

vim将每个行块视为段落,因此您可以从段落中的任何位置输入:

vipgJ

这会直观地选择段落(vip)并连接所有行而不添加或删除空格(gJ)。

这是创建一个加入当前段落的宏的一种方法,然后移动到下一个宏,准备再次运行:

qqvipgJjjq

现在使用@q运行宏。如果您知道要运行它的次数,则可以使用该数字5@q作为前缀,或者只输入一个巨大的数字以将其应用于文档的其余部分。

对于一个非常酷的技巧,你甚至可以编写宏来递归调用自己。它将一直调用自己,直到它不再进行更改 - 在这种情况下它到达文档的末尾(确保您的q注册表在开始之前是空的,否则您将应用现有的宏写下新的 - 只需输入qqq)即可清除它:

qqvipgJjj@qq@q

说明:

  • qq:开始将宏录制到注册表中" q"。
  • vipgJ:加入当前段落。
  • jj:向下移动2行到下一段。
  • @q运行宏" q" (录音时无效,因为注册" q"为空)。
  • q:停止录制宏。
  • @q:运行宏。