如果想要将文本从Vim复制到其他内容,例如网络浏览器,则下面的问题是相关的。
编辑文件时,我通常会选择tw=80
选项,尤其是LaTeX文件。但是,假设我想在Vim中使用tw=80
选项撰写电子邮件,然后我想将其复制并粘贴到Web浏览器中。在复制和粘贴之前,我想打开文本,以便每80个字符左右没有换行符。我已尝试tw=0
然后gq
,但这只是将文本包装为默认宽度80个字符。我的问题是,如何解开文本,以便我的电子邮件的每一段都显示为一行?对此有简单的命令吗?
答案 0 :(得分:43)
转到段落的开头并输入:
v 我 P Ĵ
整篇文档将其与规范结合起来:
:%norm vipJ
此命令仅解包段落。我想这就是你想要的行为。
答案 1 :(得分:10)
由于使用正常模式命令加入段落行已经涵盖了 另一个答案,让我们考虑通过以下方式解决同一问题 面向行的Ex命令。
假设光标位于段落的第一行。然后到
打开它,可以简单地将下一行连接到最后一行
那一段。一种方便的方法是运行:join
命令
专为此目的而设计。定义命令的行范围
除了显而易见的起始线之外,它还可以进行操作
必须指定结束行。可以使用该模式找到它
匹配段落的最后一个,即后跟的换行符
一条空行。因此,我们将所述定义转换为Ex-command语法
获得:
:,-/\n$/j
对于要解包的所有段落,请在第一行上运行此命令
每一段。重复一个给定的跳过它们的有用工具
动作序列是:global
命令。当:global
扫描线时
从上到下,段落的第一行只是第一个非空行
其中未处理的。这个观察给了我们命令
:g/./,-/\n$/j
比其简单的普通模式对应物更有效。
答案 2 :(得分:4)
:%norm vipJ
的问题在于,如果连续的行短于80个字符,它们也会加入它们,即使它们被空行分隔。例如,以下示例:
# Title 1
## Title 2
将成为:
# Title 1 ## Title 2
有了ib的回答,问题在于列表:
- item1
- item2
变为:
- item1 - item2
感谢this forum post我发现了另一种实现这一目标的方法,我将其包含在一个对我来说效果更好的函数中,因为它不会执行任何操作:
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
的行。