在vim中打开文本

时间:2012-06-14 18:53:09

标签: vim

如果想要将文本从Vim复制到其他内容,例如网络浏览器,则下面的问题是相关的。

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

3 个答案:

答案 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的行。