vim-surrounding 插件可以轻松的一次性修改成对出现的,比如 (), [], {}, 双引号,XML 标签等等。提供了

  • 增加
  • 删除
  • 修改

包围内容的方法。

首先放上链接:

Installation

Plugin 'tpope/vim-surrounding'

Usage

用下面的例子做 demo

print("hello world")

光标定位在 hello world 包括引号,那么使用如下的命令可以实现双引号替换成单引号:

cs"'

change surrounding

Change surroundings is cs. 接受两个参数,目标,和替换内容

cs"'            # change " to '
cs"<q>          # change " to <q>
cs)]            # change ) to ]

如果要替换标签的内容,比如说将 h1 替换为 h2,则需要用到 t

<h1>Title</h1>

则需要 cst<h2>,同理要将 <h1> 替换成双引号,则 cst"

假如有一行内容

<h1>This is a title</h1>

cs 还有一个变种 cS,效果则是将变化的内容放到新行中。

add surrounding

给 hello 增加 <h2>

hello

那么可以使用 csw<h2>,简单记忆成 change surrounding of word <h2> ,给 word 增加 <h2> 标记

可以看到 cs 接受两个参数,会用后一个参数替换前一个。

delete surrounding

比如删除双引号,delete + surrounding + “

ds"             # delete surrounding "
ds(             # delete surrounding (
dst             # delete surrounding tags

dscs 都将 target 作为第一个参数,所有的 target (text-objects) 目前都是一个字符。

(), [], {}, <>
b, r, B, a 分别对应上面括号
', ", `
t 表示 HTML 或者 XML 标签
w, W, s 分别是 word, WORD, sentence
p 表示 paragraph

ys 给 surrounding 增加标记

给 hello 增加 <h2>

hello

使用更加复杂一点的 you surrounding inside word with <h2>

ysiw<h2>

ys 接受 vim motion 或者 text object 作为一个 object

如果要对整行操作可以使用 yss 后接修改的内容,比如给整行增加花括号

yssB

cS 一样,ys 也有变种版本 ySySS,会在新行添加内容,比如给 paragraph 添加双引号

ySS"

Visual mode

在选择模式下可以使用 S + 需要添加的内容,来看快速对选择的内容增加 surroundings。

比如我想要给下面这一行中的一部分内容,比如说 main title 增加一个 <h1> 标记。

This is the main title  sub title`

那么只需要将 This is the main title 使用 v 选中,然后按下 S<h1>Enter 回车之后前后就加上了 h1 标签。

在单行选择模式下, surroundings 会添加在行中,在 blockwise 选择模式,每一行都会 surround。

a = testa
b = testb
c = testc

加入上面的三行内容,想要给后面的内容增加双引号,那么可以使用列选选择然后 S + " 就可以快速添加。

Conclusion

Normal mode
-----------
ds  - delete a surrounding
cs  - change a surrounding
ys  - add a surrounding
yS  - add a surrounding and place the surrounded text on a new line + indent it
yss - add a surrounding to the whole line
ySs - add a surrounding to the whole line, place it on a new line + indent it
ySS - same as ySs

Visual mode
-----------
s   - in visual mode, add a surrounding
S   - in visual mode, add a surrounding but place text on new line + indent it