在vim中打开文本

Ray*_*Ray 28 vim

当人们想要将文本从Vim复制到其他东西时,例如网络浏览器,下面的问题是相关的.

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

Fat*_*lan 47

转到您的段落的开头并输入:

v i p J

对于整个文档,它与规范相结合:

:%norm vipJ
Run Code Online (Sandbox Code Playgroud)

此命令仅解包段落.我猜这是你想要的行为.

  • 对于它的价值,你不需要去段落的开头.该命令中的"ip"点是它将抓住你所在的整个段落,无论你是否在开头. (3认同)
  • @Ray我编辑了我的答案并添加了执行整个文档的命令. (2认同)
  • 最好在这种情况下将`:normal`命令与`!`-specifier一起使用,以避免与自定义映射冲突。 (2认同)

ib.*_*ib. 10

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

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

:,-/\n$/j
Run Code Online (Sandbox Code Playgroud)

对于要解包的所有段落,请在每个段落的第一行运行此命令.跳过它们重复给定操作序列的有用工具是:global命令.由于:global扫描从上到下排列,段落的第一行只是剩余未处理的第一行中的非空行.这个观察给了我们命令

:g/./,-/\n$/j
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

# Title 1

## Title 2
Run Code Online (Sandbox Code Playgroud)

会变成:

# Title 1 ## Title 2
Run Code Online (Sandbox Code Playgroud)

对于 ib 的回答,问题在于列表:

- item1
- item2
Run Code Online (Sandbox Code Playgroud)

变成:

- item1 - item2
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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