1 min read

Surround.vim

如下的一段代码,如果要删除得只剩下内容该如何:

<div class="vim">
    <p>
        <em>hi this is surround.vim from tim tpope<em>
    </p>
</div>

如果在 vim 里,可以这样操作:先定位到

行,然后按 2dd,之后再定位到

行,再 2dd,然后剩下 em 一对标签。

这一对 em 看着不太好删。

这时,如果有安装 surround.vim 的话,只要按 dst 就可以轻松删除一对 em 标签。

Surround.vim 是一个 Vim 插件,用于管理 () [] <> “” ” 及 html、xml 标签等成双成对出现的符号。用它可以很方便地删除/修改/增加这些符号,譬如上面所述的例子。

显然,上面的例子可以通过按三次的 dst 来删除,但那样显然不够高效,因为要按 9 次字母键,如果能 3dst 这样配合数字使用就很简单。又或者调用 Vim 的重复命令按键 “.” (点号)。但目前来看,这个插件并不支持配合数字的操作,可能是意义不大,毕竟所举的案例其实很偏门;另外,Vim 里点号所重复的命令只是重复最后一次原生命令,而无法重复映射过的“整”命令。

于是,Tim Tpope 还写了一个 repeat.vim 的插件,解决点号重复命令的问题。

于是上述案例的解决办法变成,先按一次 dst,然后两次点号,这回按了 5 次按键。

修改符号

以下例子中 * 表示光标位置。

“hello w*orld” → cs"' → ‘hello world’

可以把 cs 理解为 change surround,把 ” 修改为 ‘。

‘hello wor*ld’ → cs‘hello world

hello *worldcst" → “hello world”

cst 表示 change surround tag,t 表示 xml/html 成对出现的标签。

删除符号

类于修改符号,删除只是换个按键,把 c 换成 d。则要删除包围的双引号可以用 ds” – delete surround “,要删除标签对,则用 dst – delete surround tag。

增加符号

如果要增加符号,比如字符串 hello,要用双引号包围,则可以按 ysiw",按 surround.vim 帮助说明,可以把 y 记忆成 you,于是 ysiw" 意指 you surround inner word “,同理,要用标签对的话则是按 ysiw

,另外,surround.vim 还提供包围整行的方法,yss" – you surround sentence “;至于在增加 [] () <> 这样的符号时,有一点小小区别,比如 hello 这个单词,ysiw[ 会生成 [ hello ],ysiw] 会成生 [hello],hello 前后少一个空格,删除、修改亦然。

如果要包围单行里的两个单词甚至更多,则可以使用可视模式,先进入 vim 的可视化模式选中要包围的单词,然后按 S" 就可以把这些单词用双引号包围。

非常便利。

扩展阅读

  1. vim 插件安装的便利方法
  2. Tim Tpope 的各种其他 vim 插件
报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo