在vim中的段落内加入行


13

假设您在vim中键入了一个长文档,并且自动换行了,所以所有的行都折断了,例如79个字符。您甚至可能已将格式设置应用于整个文档,以使该长度的所有行中断。

文档中的段落用空白行标出。

现在,您决定完全不需要段落中的换行符。

如何在不完全消除段落边界的情况下删除段落中的所有换行符?

我已经做出了这种快速而愚蠢的破解,但是我正在寻找正确的方法。

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

嘿,如果您的解决方案有效,请不要敲它。
— pdwalker

Answers:


12

我认为这可以满足您的要求:确保文件末尾有一个空行,然后加入每个段落(以空行终止)。

G:a

.
:g/^./ .,/^$/-1 join

说明:首先转到文件末尾,并用附加一个空行:a(也许有一种更优雅的方法;可以交互地,您可以用替换前三行o<ESC>)。然后,对于尚未考虑的所有非空白行(:g/^./),将join命令应用于从所选行(.)开始到下一个空行(/^$/-1)之前的一行的范围。

(可选):g/^$/d如果您不希望保留任何空白行(那么可以删除-1)。


谢谢。这对我来说非常接近,但是,它删除了段落之间的空白行。(我尝试了unix的fileformat并执行dos来查看它是否是Windows的东西)。另外,您可以翻译一下命令吗?G转到最后一行。:a根据帮助是“追加”,但我不确定这样做是什么。同样,您在那里的g / pattern / cmd也让我迷失了。命令是什么?
— dggoldst

@dggoldst:我更改了命令以保留空行。前三行只是在文件末尾添加一个空行(否则最后一段将不匹配)。最后一个命令是:g,它将命令应用到所有匹配的行;看看:help :g也许这个线程讨论:g删除换行符时的行为。
— 吉尔斯(Gillles)“所以别再作恶了”

:$pu _ 最后在黑洞寄存器中放置一个,这将在最后产生一个空白行。
— SergioAraujo

12

应该这样做:

:set tw=99999
gggqG

tw设置为至少与最长段落中的字符数一样大的值。gg将光标移到第一行;gq是重新格式化的命令;G将光标移动到最后一行,指示gq将格式从当前光标位置重新格式化到最后一行。


5
  1. 将光标置于所需的段落内

  2. 类型: vipJ

(vip突出显示当前段落,J连接所有行)


2

可能不是最干净的方法,但这是我要使用的方法:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

(在VIM 7.2中工作。)

取决于段落最初被格式化时的确切分割方式,您可能希望将gJ命令(不带空格的连接)替换为命令(不带空格的J连接)。

任意999计数仅需要至少是文件中的段落数-如果需要,您可以选择更大的数目,并且只损失处理器周期。假设段落之间只有一个空白行,则可以使用以下方法获得更准确的段落计数:

:%s/^$//gn     # returns "999 matches on 999 lines"

这对我有用。最好在开头添加“ gg”,将光标置于文件顶部。同样,使用J代替gJ不会导致单独的单词混为一词。仅当我的“ formatoptions”值出现这种情况时,这种情况才使我感到困惑。
— dggoldst 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.