在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.