打造一个有感觉的vim(四)

时间:2022-12-28 06:40:02

今天要介绍的VIM插件的名字叫做surround,这个插件的主要作用是将一个VIM的tex-objects(文本对象)添加或者取消包裹(单引号,双引号,XML标签等等)
下载地址如下:
https://github.com/tpope/vim-surround
安装方式和其他的插件一样,下载对应的压缩包,解压后将surround.vim放在vimfiles/plugin文件夹,surround.txt放在vimfiles/doc文件夹。
完成后为了生成帮助需要在vim执行
:helptags c:\Program\ Files\ (x86)\Vim\Vimfiles\doc
来生成帮助标签,不过这一步不是使用surround必须的。完成之后可以在VIM中输入
:h surround
来查看surround的帮助。
下面来看看surround的简单使用,在VIM中我们有如下文本:

Hello *World!

*(星号)在这里代表了当前光标的位置。
在normal模式下输入:

ysis"

这条命令的意思是将整行用"(双引号包裹起来),结果如下所示

" Hello World"

我们也可以通过:cs"'
来将"(双引号)替换为'(单引号)

' Hello World'

最后的命令式ds,用来删除一个包裹:ds'

 Hello World

这三个命令ys,cs,ds就是surround所有的用法了,通过不同的参数的组合来实现不同的结果。而在surround,我们需要知道的参数就两种:surrounds(包裹标记",',<>,{},[]等),text-objects(文本对象)。
ys:you surround--用一个surrounds来包裹一个已被选择的text-objects(文本对象)。
所以它的语法是:ys[text-objects selection][surrounds]
=======================================我是文本对象的分割线=================================================
关于text-objects(文本对象),其实完全可以另写一篇博客来介绍,不过它不是本文的主角,所以这里只是简单的介绍。
Vim中的text-objects(文本对象)有w(word),s(sentence),p(paragraph),(),[],{},"",'',b(block),t(tag)等等。
而选择这些对象需要使用对象选择器:a(包含文本对象的首空格和尾空格),i(不包含文本对象的首空格和尾空格)。以及一个可选的可以出现在对象选择器之前的数字来表明选择该对象的次数。假设在VIM的Normal模式中有如下文本:

The *quieter you are,the more you are able to<a>hear</a>.

*(星号为光标位置)
按下v键进入可视模式(visual model)
分别输入:

aw,iw,as,is,2aw

你会看到不同的text-objects(文本对象)选择命令之间的区别。现在我们将光标移动到如下位置
The quieter you are,the more you are able to<a>h*ear</a>.
进入可视模式后输入:

it

标签a中的文本对象将被选择。
====================================================================================================
现在我们对文本对象的选择有了初步的理解,接着继续。
ys命令中我们选择了合适的文本对象之后,就可以在最后加上surrounds(包裹标记)来将选择的文本对象包起来。
所以开头提到的命令可以分解为:ys is "
对选择的sentence对象(is)用"(双引号)包起来(ys)

而cs后面跟一个将要被替换的surrounds和一个用于替换的surrounds
所以cs"'就是将第一个"(双引号)包裹替换为'(单引号)

ds后面跟一个将要删除的surrounds
ds"就是将第一个"(双引号)包裹删除。

最后还需要提一下surroud.vim的自定义功能,你可以将一个ASCII的Char定义为一个包裹
例如我们用如下设置,将a(ASCII=97)表示为一个<ai>包裹

:let g:surround_97 = "<ai>\r</ai>"

其中/r表示将要替换的被选择的文本对象。
对下面这段文本输入:ysisa

Hello *World!

*(星号)在这里代表了当前光标的位置。
你将得到以下结果

<ai>Hello World!</ai>

surround.vim的自定义功能还可以使用正则表达式,并且带输入参数,具体的用法可以通过

:help surroud

来查看。