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是指右半边小括号),另外还有字母B,r,a分别是指符号},],>。
使用命令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
Swith an argument wraps the selection.
按v进入characterwise visual mode,选中line6到line10所有行,然后按命令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
如果想让.操作对以上提到的ds,cs,yss,ySS命令生效,需要安装另一个插件:repeat.vim.
Structure of an editing command
vim中编辑命令的格式如下:
<number><command><text object or motion> |
一般的操作都是基于字母characters进行移动和编辑的,除了characters之外,vim还可以基于words,sentences,paragraphs这些单位进行移动和编辑,这些统称为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,但复制内容包括配对符号本身 |