# 变化之术：替换字符和多文本选中

前面学习了 `r` `c` 等可以修改文本的指令，再配合文本对象可以达到一个“快速”修改文本的效果，这里打双引号是因为，这些学过的修改替换文本，都是单个替换；而实际情况中，我们往往需要一次性修改多个地方的相同字符，比如修改一个变量名、函数名等；今天，我们就来了解一下选中和替换的操作。

## 替换

  多文本替换的操作指令是 `:substitute`，一般直接用 `:s`；替换的完整指令公式是：`:[range]s[ubstitute]/{pattern}/{string}/[flags]`；
 
### 公式
  - `[range]`：指范围，可以使用如下几个指令：
    * `%`：匹配全文，建议只记忆这个就可以了，比较常用
    * `$`：匹配到尾部；并非如 `$s` 这样使用，而是搭配下面的数字键，如 `:12,$s/[文本]/[文本]`，即匹配从 12 行到页面尾部
    * [number],[number]：匹配从 [number] 行到 [number] 行，如 `:10,12s/[文本]/[文本]`，即匹配从 10 行到 12 行

  - `{pattern}`：正则表达式
  - `[flags]`：
    * `g`：匹配所有符合的字符；由于在使用 `s` 来匹配字符时，默认是匹配每一行的第一个，所以如果需要匹配所有，则需要加上 `/g`
    * `c`：弹出对话框来确认每一个替换
  - visual mode 下输入 `:`，可以注意到命令栏会显示 `:'<,'>`，这其实是指从选中区域的开头到选中区域的结尾，相当于给我们划定了一个 [range]，这是我们接着输入 `s`，即可以选中文本进行替换
## 多选操作

  `gb` 命令可以选中与我们光标所在的单词相同的且未被选中的第一个单词；比如有：

  ```
  number number
  number
  ```

  如果我们的光标在第一个 number 里面，并按下 `gb`，则会选中第一个 number；如果我们此时再按多一个 `gb`，则会选中第二个 number；如此类推。选中多个之后，我们就可以使用 `d` `c` 等命令来多光标修改了。