surround 插件可以快速编辑围绕在内容两端的字符(pairs of things surrounding things),比如成对出现的括号、引号,甚至HTML/XML标签等。
推荐您使用vim-plug或Vundle等插件管理器,来安装GitHub上的surround插件。
以下将利用实例来介绍surround插件的主要功能,请注意:
在常规模式、插入模式和可视化模式下,可以分别使用ys
和S
命令来新增环绕字符:
模式 | 目标 范围 | 新增 内容 | 原始文本 | 命令 | 更改效果 |
---|---|---|---|---|---|
常规模式 | 单词 | 字符 | Hello World | ysiw* | Hello *World* |
单词 | 标签 | Hello World | ysiwt<strong> | Hello <strong>World</strong> | |
单词 | 括号 | print var1, var2 | ys3w) | print (var1, var2) | |
行尾 | 括号 | print var1, var2 | ys$) | print (var1, var2) | |
查找 | 标签 | William Shakespeare said, "Brevity is the soul of wit." | ysf"t<em> | William Shakespeare said, <em>"Brevity is the soul of wit."</em> | |
整行 | 字符 | Hello World | yss" | "Hello World" | |
整行 | 标签 | Hello World | ysst<p> | <p>Hello World</p> | |
整行 | 新行 | Hello World | ySS" | " Hello World " | |
插入模式 | 引号 | <CTRL-g>s" | "" | ||
标签 | <CTRL-g>S<html> | <html> </html> | |||
字符可视化模式 | 选中的文本 | 括号 | print var1, var2 | veeS) | print (var1, var2) |
行可视化模式 | 选中的文本 | 标签 | The passion to save humanity is a cover for the desire to rule it. | VjS<p> | <p>The passion to save humanity is a cover for the desire to rule it.</p> |
块可视化模式 | 选中的文本 | 标签 | Item 1 Item 2 Item 3 | <Ctrl-Q>$jjS<li> | <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> |
请注意:
使用cs
命令可以修改环绕字符:
目标范围 | 替换内容 | 原始文本 | 命令 | 更改效果 |
---|---|---|---|---|
单词 | 引号 | "Hello World" | cs"' | 'Hello World' |
单词 | 标签及新行 | 'Hello World' | cS'<p> | <p> Hello World </p> |
单词 | 标签 | <p>Hello World</p> | cst<h1> | <h1>Hello World</h1> |
单词 | 引号 | Hello World! | csw' | Hello 'World'! |
单词及标点 | 引号 | Hello World! | csW' | Hello 'World!' |
单词 | 括号 | (1,2,3) | cs)] | [1,2,3] |
单词 | 括号及空格 | (1,2,3) | cs)[ | [ 1,2,3 ] |
使用ds
命令可以删除环绕字符:
目标范围 | 新增内容 | 原始文本 | 命令 | 更改效果 |
---|---|---|---|---|
单词 | 引号 | 'Hello World' | ds' | Hello World |
单词 | 括号 | (123+4*56)/2 | ds( | 123+4*56/2 |
单词 | 标签 | <div>Hello</div> | dst | Hello |
surround插件主要提供以下命令:
ys | 添加环绕字符 |
yS | 添加环绕字符并拆分新行 |
yss | 为整行添加环绕字符 |
ySS | 为整行添加环绕字符并拆分新行 |
cs | 修改环绕字符 |
cS | 修改环绕字符并拆分新行 |
ds | 删除环绕字符 |
surround插件可以识别并处理以下目标实体:
( )
{ }
[ ]
< >
`
"
'
t
(标签)w
(单词)如果查看surround插件的源码,将会发现快捷键逐一定义在surround.vim文件中:
也就是说,我们可以直接在vimrc配置文件中,重置或取消插件预定义的快捷键:
" 不定义任何快捷键
let g:surround_no_mappings = 1
" 从plugin/surround.vim复制快捷键定义
” 并按需要进行修改
nmap ds <Plug>Dsurround
nmap cs <Plug>Csurround
nmap cS <Plug>CSurround
nmap ys <Plug>Ysurround
nmap yS <Plug>YSurround
nmap yss <Plug>Yssurround
nmap ySs <Plug>YSsurround
nmap ySS <Plug>YSsurround
" 取消不需要的快捷键
"xmap S <Plug>VSurround
"xmap gS <Plug>VgSurround
"imap <C-S> <Plug>Isurround
imap <C-G>s <Plug>Isurround
imap <C-G>S <Plug>ISurround
假设需要输入以下包含多个环绕字符的文本:
{{ nginx_root }}
由于surround插件并不支持.
重复命令,如果想要新增多个成对字符,那么需要安装额外的repeat.vim插件。而死板繁琐的替代方案是,自定义快捷键来重复执行命令:
nmap <C-J> ysiw}lysiw{
使用以下命令,可以查看插件的帮助文件:
:help surround
一,舍本逐末。为了输入环绕字符的小需求,而发明碾压一切的大轮子。颇有些杀鸡用牛刀的意味。而且平白多出来的快捷键和命令,不但冗长而且别扭,操作起来总有种有苦难言的感觉。
二,盛名之下,其实难副。对于一个被不断被提及的知名插件,从功能和体验上都差强人意,着实让人失望。也许,这就是见面不如闻名吧。
以上,皆为一家之言,还请自行斟酌。