vim killer plugin surround.vim

What's surround.vim

这个插件主要可以用来处理一些标点和标签配对相关的删除(Delete)、修改(Change)和复制(Yank)操作,如``""''<>(){}[]<p></p><div></div>,所以在HTML、XML的配对标签编辑处理时尤其方便。

Install surround.vim

建议使用pathogen.vim或者是vundle.vim来管理vim插件:

 cd ~/.vim/bundle git clone git://github.com/tpope/vim-surround.git

Help manual

可以通过:h surround命令查看帮助手册,其中有在普通模式中命令操作举例说明,*是指光标所在字母上:

Old text Command New text
"Hello *world!" ds" Hello world!
[123+4*56]/2 cs]) (123+456)/2
if *x>3 { ysW( if ( x>3 ) {

Normal mode

当光标位于Hello world!的Hello这个单词字母上时,按组合命令ysiw]或者是ysiw[iw是一个text-object,下面另详细说明。结果分别如下,用[生成的配对标点带有空格:

[Hello] world![ Hello ] world!

在如上结果上执行命令cs]}或者是cs]{cs命令可以理解为Change Surround,结果如下,用{生成的配对标点带有空格:

{Hello} world!{ Hello } world!

使用yssb或者是yss)命令将整行记录用小括号包起来:

({ Hello } world!)

上面命令yssb中的b是指右半边小括号),另外还有字母Bra分别是指符号}]>

使用命令ds{ds)还原为原来的文本内容Hello world!

Hello world!

光标在单词Hello的任意一个字母上时,用命令ysiw<em>

<em>Hello</em> world!

光标在<em>Hello</em>任意字母上时,执行命令dst还原这个单词,t代表tag的意思。

普通模式中多行操作

当光标位于line1这行时,按下命令5ySS<ul>

line1line2line3line4line5

产生如下输出,会生成一个配对的ul标签包住这5行:

<ul>line1line2line3line4line5</ul>

再将光标移到line1所在行上,执行命令:.,+4norm yss<li>后回车:

<ul><li>line1</li><li>line2</li><li>line3</li><li>line4</li><li>line5</li></ul>

Visual mode

Shift+V进入linewise visual mode,光标从第一行line6上移到第五行line10,选中这5行记录,然后按命令gS<ul>

line6line7line8line9line10

得到的结果如下,与5ySS<ul>效果相同:

<ul>line6line7line8line9line10</ul>

In visual mode, a simple S with an argument wraps the selection.

v进入characterwise visual mode,选中line6line10所有行,然后按命令S<li>或者gS<li>,输出结果:

<ul><li>line6line7line8line9line10</li></ul>

characterwise visual mode,选中line6这5个字母,然后按命令S<span>,输出结果:

<ul><li><span>line6</span>line7line8line9line10</li></ul>

这个操作是最易记忆和使用的,如果上述S<span>操作不成功,需要查看一下S键的最后绑定情况:

:verbose vmap S

Insert mode

在vim的insert mode时,按一次<CTRL-s>组合键,然后输入<div>,得到结果为一行div配对标签:

<div></div>

如果是按<CTRL-s><CTRL-s>组合键,即二次<CTRL-s>组合键,然后输入<div>,输出3行代码,一个div配对标签,和一个光标定位的空行:

<div></div>

Action repeat

如果想让.操作对以上提到的dscsyssySS命令生效,需要安装另一个插件:repeat.vim.

Structure of an editing command

vim中编辑命令的格式如下:

<number><command><text object or motion>

一般的操作都是基于字母characters进行移动和编辑的,除了characters之外,vim还可以基于wordssentencesparagraphs这些单位进行移动和编辑,这些统称为text-object

Text objects commands

Type Command Operation
Words aw a word (includes surrounding white space)
Words iw inner word (does not include surrounding white space)
Sentences as a sentence
Sentences is inner sentence
Paragraphs ap a paragraph
Paragraphs ip inner paragraph

命令说明

cit = Change Inner Tagcip = Change Inner Paragraphdaw = Delete A Wordyaw = Yank A Word

基于text-object的常用命令

操作 结果
ci[ 删除一对[]中的所有字符并进入插入模式
ci( 删除一对()中的所有字符并进入插入模式
ci< 删除一对<>中的所有字符并进入插入模式
ci{ 删除一对{}中的所有字符并进入插入模式
ci" 删除一对引号字符 " 中所有字符并进入插入模式
ci' 删除一对引号字符 ' 中所有字符并进入插入模式
cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
ci 修改配对标点或者标签之间的文本
di 剪切配对标点或者标签之间的文本
yi 复制配对标点或者标签之间的文本
ca 同ci,但修改内容包括配对符号本身
da 同di,但剪切内容包括配对符号本身
ya 同yi,但复制内容包括配对符号本身

References

  1. surround.vim
  2. Vim Text Objects: The Definitive Guide
  3. Vim Plugins You Should Know About, Part I: surround.vim