# 继续深入：什么是文本对象？
  
  在前面的训练中，我们学习了（比较）快速的删除 `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` 具体的功能如下：

  ```js
  // 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` ，其他删除复制也如此类推。
  
## 小练习
  
  把以下被符号包裹的内容复制到符号外

  ``````js
  'single quotation mark'
  "double quotation mark"
  [square bracket]
  {curly bracket}
  <angel bracket>
  `backquote`
  ```