36

我通常在tw=80编辑文件时设置选项,尤其是 LaTeX 源。但是,比如说,我想在 Vim 中使用该tw=80选项撰写一封电子邮件,然后将其复制并粘贴到 Web 浏览器中。在我复制和粘贴之前,我想解开文本,这样每 80 个字符左右就没有换行符。我已经尝试过 tw=0then  gq,但这只是将文本包装为 80 个字符的默认宽度。我的问题是:如何解开文本,使我的电子邮件的每一段都显示为一行?有一个简单的命令吗?

4

3 回答 3

60

转到段落的开头并输入:

v i p J

(如果J不清楚,则为大写字母)

对于整个文档,将其与规范结合起来:

:%norm vipJ

此命令只会打开段落。我想这是你想要的行为。

于 2012-06-14T19:15:09.423 回答
11

由于使用普通模式命令连接段落行已经被另一个答案所涵盖,让我们考虑通过面向行的 Ex 命令来解决相同的问题。

假设光标位于段落的第一行。然后,要打开它,可以简单地将以下几行连接起来,直到该段落的最后一行。一种方便的方法是运行:join专门为此目的设计的命令。要定义命令操作的行范围,除了明显的起始行即当前行外,还需要指定结束行。可以使用匹配段落末尾的模式找到它,即一行中的两个换行符,或者等效地,一个换行符后跟一个空行。因此,将上述定义翻译成 Ex-command 语法,我们得到:

:,-/\n$/j

对于要展开的所有段落,请在每个段落的第一行运行此命令。一个有用的工具来跳过它们,重复给定的动作序列,是:global命令(或:g简称)。当:global从上到下扫描行时,下一段的第一行只是那些未处理的行中的第一个非空行。这个观察给了我们命令

:g/./,-/\n$/j

这比直接的普通模式对应物更有效。

于 2012-06-15T05:26:37.287 回答
5

问题:%norm vipJ在于,如果您的连续行少于 80 个字符,即使它们被空行分隔,它也会加入它们。例如下面的例子:

# Title 1

## Title 2

会变成:

# Title 1 ## Title 2

有了 ib 的回答,问题出在列表上:

- item1
- item2

变成:

- item1 - item2

多亏了这个论坛帖子,我发现了另一种实现这一目标的方法,我将它封装在一个对我来说效果更好的函数中,因为它没有做任何事情:

function! SoftWrap()
    let s:old_fo = &formatoptions
    let s:old_tw = &textwidth
    set fo=
    set tw=999999 " works for paragraphs up to 12k lines
    normal gggqG
    let &fo = s:old_fo
    let &tw = s:old_tw
endfunction

编辑:更新了方法,因为我意识到它不适用于 Linux 设置。删除包含fo此较新版本是否不适用于 MacVim 的行(我无法测试)。

于 2014-04-12T17:59:37.893 回答