我通常在编辑文件时使用tw=80
选项,特别是LaTeX源代码。但是,假设我想在Vim中使用tw=80
选项撰写电子邮件,然后将其复制并粘贴到Web浏览器中。在复制和粘贴之前,我想取消文本换行,以便每80个字符左右没有换行符。我尝试了tw=0
,然后使用gq
,但那只是将文本包装到默认宽度为80个字符。我的问题是:如何取消文本换行,使得我的每个电子邮件段落都显示为单行?是否有一个简单的命令可以实现这一点?
我通常在编辑文件时使用tw=80
选项,特别是LaTeX源代码。但是,假设我想在Vim中使用tw=80
选项撰写电子邮件,然后将其复制并粘贴到Web浏览器中。在复制和粘贴之前,我想取消文本换行,以便每80个字符左右没有换行符。我尝试了tw=0
,然后使用gq
,但那只是将文本包装到默认宽度为80个字符。我的问题是:如何取消文本换行,使得我的每个电子邮件段落都显示为单行?是否有一个简单的命令可以实现这一点?
回到段落开头并输入:
v i p J
(如果不清楚,J
是大写字母)
对于整个文档,请与norm命令结合使用:
:%norm vipJ
这个命令只会取消段落的包裹。我想这就是您想要的行为。
由于使用普通模式命令连接段落行已经在另一个答案中涵盖,让我们考虑通过基于行的Ex命令解决相同的问题。
假设光标位于段落的第一行。然后,要取消换行,可以简单地将以下行连接起来,直到该段落的最后一行。一种方便的方法是运行专门设计用于此目的的:join
命令。除了明显的起始行(即当前行),还需要指定结束行来定义命令要操作的行范围。可以使用匹配段落结尾的模式来找到它,也就是两个连续的换行符,或者等效地,一个换行符后面跟着一个空行。因此,将上述定义翻译成Ex命令语法,我们得到:
:,-/\n$/j
要将所有段落都解开,可以在每个段落的第一行上运行此命令。一个有用的工具来跳转到它们,重复一系列的动作,是:global
命令(或简称:g
)。由于:global
从上到下扫描行,下一个段落的第一行就是那些剩余未处理的行中的第一行非空行。这个观察结果给出了以下命令
:g/./,-/\n$/j
相对于其直接的正常模式(Normal-mode)对应物,这种方式更加高效。
:%norm vipJ
的问题在于,如果您有连续的行长度小于80个字符,它也会将它们连接起来,即使它们被空行分隔开。例如以下示例:
# Title 1
## Title 2
Will become:
# Title 1 ## Title 2
使用ib的答案后,问题出在列表上:
- item1
- item2
Becomes:
- 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环境下无法工作。如果这个新版本不能与MacVim一起使用(我没有测试的方法),请删除包含fo
的行。
!
说明符的:normal
命令,以避免与自定义映射发生冲突。 - ib.J
。我应该知道我可以用 Vim 来J
多个。更重要的是,你可以在之后进入下一个段落并按.
。 - young_souvlaki