我通常在tw=80
编辑文件时设置选项,尤其是 LaTeX 源。但是,比如说,我想在 Vim 中使用该tw=80
选项撰写一封电子邮件,然后将其复制并粘贴到 Web 浏览器中。在我复制和粘贴之前,我想解开文本,这样每 80 个字符左右就没有换行符。我已经尝试过 tw=0
then gq
,但这只是将文本包装为 80 个字符的默认宽度。我的问题是:如何解开文本,使我的电子邮件的每一段都显示为一行?有一个简单的命令吗?
3 回答
转到段落的开头并输入:
v i p J
(如果J
不清楚,则为大写字母)
对于整个文档,将其与规范结合起来:
:%norm vipJ
此命令只会打开段落。我想这是你想要的行为。
由于使用普通模式命令连接段落行已经被另一个答案所涵盖,让我们考虑通过面向行的 Ex 命令来解决相同的问题。
假设光标位于段落的第一行。然后,要打开它,可以简单地将以下几行连接起来,直到该段落的最后一行。一种方便的方法是运行:join
专门为此目的设计的命令。要定义命令操作的行范围,除了明显的起始行即当前行外,还需要指定结束行。可以使用匹配段落末尾的模式找到它,即一行中的两个换行符,或者等效地,一个换行符后跟一个空行。因此,将上述定义翻译成 Ex-command 语法,我们得到:
:,-/\n$/j
对于要展开的所有段落,请在每个段落的第一行运行此命令。一个有用的工具来跳过它们,重复给定的动作序列,是:global
命令(或:g
简称)。当:global
从上到下扫描行时,下一段的第一行只是那些未处理的行中的第一个非空行。这个观察给了我们命令
:g/./,-/\n$/j
这比直接的普通模式对应物更有效。
问题:%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 的行(我无法测试)。