# Vim 修炼秘籍之语法篇

Date: 2018-03-18  
Author: SimonAKing  
Categories: 工具  
Tags: 工具, Vim  
Source: https://simonaking.com/blog/grammar-of-vim-cultivation-cheats/

> Vim,工具

---
欲练此功，必先自宫。
## 前言
> 少年，我看你骨骼精奇，是万中无一的武学奇才，维护世界和平就靠你了，我这有本秘籍《Vim修炼秘籍》，见与你有缘，就十块卖给你了！ —— 本秘籍建议零售价：10元

如果你是一名 Vimer，那么恭喜你，你的 Vim 技能马上要升级了 😈！
如果你之前不了解过 Vim ，那么也没关系，本文就当成学英语语法了！
好，废话不多说，秘籍送上。
*ps: 建议先熟悉一遍 [Vim修炼秘籍之命令篇](https://simonaking.com/blog/order-of-vim-cultivation-cheats/)，本秘籍食用更佳*

## 正文
### 核心秘诀
Vim 功法之究极总结： **（操作次数）+ 操作行为 + 操作范围 **
下面，我会将此秘诀 亲自传授于你。

### 秘诀解析
先列一些常用的 Vim 招式给你瞧瞧，看你是否是传说的练武奇才：
```vim
c2w       ——  删除当前光标后紧邻的两个单词，并转换为普通模式
dip       ——  删除当前光标所处的一段内容
y3f{char} ——  从当前字符，一直复制到第三个 {char} 字符
>G        ——  当前行到结尾，整体缩进一个 <Tab>
v`{mark}  ——  从当前字符，选择到 {mark} 标记位置
cit       ——  删除当前光标所处标签中的内容
```
如果把招式看成语言，解析其语法，不难发现一个共同点：
> 每个招式必须包括 ** 谓语（操作行为） 与 宾语（操作对象）**

好，既然有了线索，我这就带你各个击破！
#### 谓语（操作行为）
众所周知，谓语是 动词词性的。

在 Vim 功法中，常用的动词如下：
1. `c`
  > 删除内容，进入普通模式
2. `d`
  > 删除
3. `y`
  > 复制
4. `v`
  > 选择
5. `>,<`
  > 缩进
6. `=`
  > 智能缩进
7. `gu,gU,g~`
  > 改变内容大小写

#### 宾语（操作对象）
宾语代表的是操作对象，而在 Vim 中，所需操作的对象即是 操作的范围。
而常用的操作范围命令如下：

1. `w`
  > 从当前位置，到下一个单词首字母，单词由特殊字符（".等）作为间隔

  内容： .main {xxx} , 光标处在字符 m
  招式：caw
  结果：. {xxx}

2. `W`
  > 从当前位置，到下一个单词首字母，单词由空格作为间隔

  内容： .main {xxx} , 光标处在字符 m
  招式：caW
  结果： {xxx}
3. `e`
  > 从当前位置，到本单词尾字母
4. `ge`
  > 从当前位置到上一个单词尾字母
5. `b`
  > 1. 通常代替括号中的内容
  2. 上一个单词首字母

6. `p`
  > 段落 paragraph

7. `s`
  > 句子 sentence

8. `t`
  > 标签中的内容

9. `B`
  > 通常代替花括号中的内容

10. `符号 {) "'<`
  > 代表的就是 该符号中的内容

11. `G,gg`
  > 结尾，开头

12. `j,k,h,l`
  > 上下左右

13. `/{word}<Enter>`
  > 从当前字符 到下一个word之间的内容

14. `f{char}`
  > 从当前字符到下一个 char 字符之间的内容

15. `mark
  > 从当前字符到mark标记 之间的内容

16. 双写动词，操作范围默认是当前行
  1. dd 删除当前行
  2. cc 删除当前行 并转换为普通模式
  3. \>> 缩进当前行
  4. v 动词例外，使用 V 选中当前行。
  5. gU 命令是一种特殊情况，可用 gUU 来使它作用于当前行。

#### 数词（操作次数）
假如现在有个任务，让你删除两个单词，你会怎么做？
1. d2w
  > 删除两个单词

2. 2dw
  > 执行两次删除单词的命令

虽然这两式结果相同，但意义却有所差别，
数词灵活多变，可放在 谓语（操作行为）前，又可放在 宾语（操作对象）前，
- 放在 谓语前，代表操作次数，
- 放在 宾语前，代表操作范围的扩张次数

#### 介词（修饰范围）
常用的介词就两个：i(inside) ， a(around)
举例说明：光标处在字符 c
`(main)(div class="vim-test" I am Vimer! div)(main)`

分别操作：
 - dab
  结果：`(main)(main)`
 - dib
  结果：`(main)()(main)`

顾名思义，i 就是内部的内容，a 就是连同包裹的内容 一起干掉。

### 招式实战
我已经教授了你 Vim 秘籍的基本功 ：**（操作次数）+ 操作行为 + 操作范围 **
现在，利用你所学，来实战巩固吧。
1. 将下面标签中的内容修改了: I am Vimer! (光标所处 字符 c )
> `(div class="vim-test")you are Bimer!(div)`

2. 修改下面字符串为 https://simonaking.com ！（光标所处 第一个 w 字符）
> https://www.simonaking.com

3. 将文件 所有内容格式化，写出 你认为的命令

4. 将下面字符串改为 I am Vimer （光标所处 I 字符）
> I am VIMER

5. 将下面字符串的每个字符替换为 '!'
> I love github and juejin

等待你的评论答案。

## 结束语

好的功夫是练出来的，请你以后务必勤加练习。

好了，Vim 语法先告一段落，希望本文能给你带来帮助。

如果你想了解 Vim 其他方面 如：Ex 命令，寄存器等，请关注我的后续文章。

欢迎转载本站文章，请注明作者和出处  [simonaking.com](http://simonaking.com)。
