Appearance
继续深入:什么是文本对象?
在前面的训练中,我们学习了(比较)快速的删除 X
S
,以及选中文本 v
等指令,但在日常更多的使用中,我们常常是需要
- 删除某些多余的变量
- 复制某个单词
- 删除被特定符号中包裹的某些内容,如
()
{}
[]
这些符号 - 删除一段内容
- ...等等等等
这时候之前的指令明显就不够用了。那就需要来认真认识一下 vim 的文本对象了。
文本对象
在 vim 中,文本是结构化的存在,即 文本对象(text—object);而 vim 对于文本对象,专门有一部分语法,用于快速对文本对象进行编辑操作。
语法结构
文本对象的操作语法:operater + 范围(内 / 外)+ 文本对象
- 内部:
i
,意指 inner - 外部:
a
,英文单词 a,一个的意思
可能看到这里,你会有点迷糊,没关系,我们下面会举例说明。
对象
vim 中的文本对象主要有这一些:
(
或)
:一对()
b
:一对()
{
或}
:一对{}
B
:一对{}
[
或]
:一对[]
<
或>
:一对<>
t
:tag (HTML 或 XML)标签'
或'
:一对''
"
或"
:一对""
`
或`
:一对``
w
:一个单词s
:一个句子;以.
!
?
结尾即为一个句子p
:一个段落;以一个换行符间隔即为一个段落
组合举例
看了列举出来的文本对象后,可能你会更迷糊,那我们可以先来举个例子:
viw
:v
是指选中,i
指内部,w
指一个单词,这个指令可以快速选中光标所在的单词,无论光标是在单词的前中后,都可以起效vi(
:(
指一个中括号,如果光标在一对括号里面,这个指令可以快速选中括号的内部内容(不包括括号本身),如('test')
中的'test'
;同样的,vi)
或vib
也是一样的效果va(
: 这个指令也可以选中括号内部的内容,并且会把括号本身也选中,如这('test')
中使用这个指令,则会选中('test')
;这就是前面a
被解释为外部的原因
相信看完这个例子,你应该大概能明白文本对象的使用方式了;对了,以上的 v
也可以换成 d
c
等操作符;这样下来,日常的使用中就更丝滑了!
vim-textobj-arguments & vim-textobj-entire
在开始让你练习前,再提多一个内容:vim-textobj-arguments 与 vim-textobj-entire: 这是两个 vim 的插件,额外提供了两个文本对象 a
和 e
,使用方式和上面提到的一样;a
具体的功能如下:
// Examples:
// 删除一个参数
function(arg1, ch) // 在第二个参数(即 “ ch”)中输入 daa
function(arg1|) // 就会变成这样,| 代表这时光标所在位置;如果这时再输入 daa
function(|) // 就会变成这样
// 修改一个参数
function(arg1, ch) // 在第二个参数(即 “ ch”)中输入 cia
function(arg1, |) // 就会变成这样,| 代表这时光标所在位置
以上可以看到在 文本对象 a 中,在他的前面接上表示范围的指令 a 和 i 时,它们的区别是是否包括前面的空格和符号(即当前参数外的内容)。所以规则如下:
ia
:不包含分隔符aa
:包含分隔符
e
在这里代表 entire ,即所有的意思;顾名思义,会针对当前文件所有内容左操作;规则如下:
ae
:当前文本所有内容ie
:当前文本所有内容,但不包括前面和后面的 blank 字符
所以当我们要选中当前文件所有内容时,就可以直接用 vie
,其他删除复制也如此类推。
小练习
把以下被符号包裹的内容复制到符号外
'single quotation mark'
"double quotation mark"
[square bracket]
{curly bracket}
<angel bracket>
`backquote`
```