【问题标题】:Match and substitute whole visual range in vim在vim中匹配和替换整个视觉范围
【发布时间】:2011-10-02 23:47:12
【问题描述】:

我想在视觉上标记几行,然后用

包围整个范围。经过大量的摆弄,我想出了这个可以正常工作的替代命令:

:'<,'>s/^\(\_.*\)\%V/<p>\1<\/p>/

有没有更好的方法可以做到这一点,或者有人可以解释它为什么有效吗?

\_. 匹配每个字符,包括行尾。 ^(行首)和\%V(匹配视觉范围)接缝表现得很奇怪。例如,文档建议您使用两个 \%V 来包围您的表达式,但这并不是必需的。不使用 \%V 或在开始时只有一个匹配整个缓冲区。删除^ 会导致最后一行被单独匹配和替换。最后接缝处的$ 也是不必要的。

【问题讨论】:

    标签: regex vim substitution


    【解决方案1】:

    1。使用环绕vim

    您可以在可视模式下使用surround.vim

    s<p回车

    例如vat(视觉选择“环绕”标签),s<p 环绕 <p>...</p>

    细分:

    • vat(视觉选择一个标签;做任何你想要的视觉选择)
    • sp

    2。使用带有范围标记的 ex 命令

    编辑:没有环绕你也可以

    :C-u'i输入<p> Esc

    :'>a输入</p>Esc

    3。使用 yank 和 XML 文件类型插件插入寄存器内容:

    或者更简单:

    dO<p>1C-r"Esc

    请注意,在 1 我的 XML filtetype 插件(我认为它是默认的)自动提供了结束标记 (</p>),因此我们可以插入 yanked 使用 C-r" 的内容 --- 甚至不离开插入模式!

    【讨论】:

    • 也添加了非环绕替代方案:IMO 在使用插件进行扩展之前最好了解类似 vim 的方法。这样,你可以做插件不为你做的事情:)
    • 非常感谢!我正准备将带有标题和段落的文本文档转换为 HTML。环绕.vim 接缝工作得很好。只有两个问题,首先我得到了surround.vim: Visual mode s has been removed in favor of S,所以我改用S。其次,有没有办法不在前后插入新行,也不像S那样缩进?
    • @MattiasWadman:我认为:he vgS 应该可以满足您的需求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2010-11-16
    • 1970-01-01
    • 2020-09-29
    • 2014-11-24
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多