# Dancing in VIM

Vim 作为最受欢迎的编辑器（之一），其中最强大的一点就是各式花样跳转。如果能把这些技能烂熟于心，你肯定会在 VIM 中凌波微步，随意穿越了。

# 文件内跳转

## 基本位置跳转

在这里先定义两种不同的行。第一种是文本行，就是从开始到下一个回车的全部字符。另一个是屏幕行, 指的是当一行超出了当前屏幕大小的时候自动折行之后的每一行是一个屏幕行(screen line)。如果不特别指出的话，就是指文本行。

### 字符跳转
其中最基本的跳转方式就是 hjkl 了，分别对应左下上右。于此相关联的另外两个命令是 `gj` 和 `gk`。他们在文字超过屏幕宽度被折行的时候完成屏幕行的上下移动。

### 单词跳转
然后是以单词为单位的前后移动 `w,W` 移动到下一个单词的开头, `e,E` 移动到下一个单词的结尾，`b,B` 退回到上一个单词的开头 , `ge,gE` 退回到上一个单词的结尾. 其中的小写字母和大写字母的区别是在 word 还是 WORD 间跳转。具体可以使用 `:h iskeyword` 查看他们之间的区别。

### 行内跳转


- `0` 跳到一行的最开始，
- `^` 跳到第一个非空字符
- `g_` 跳到本行最后一个非空字符
- `$` 跳到本行最后一个字符
- `g$` 跳到屏幕行的最后一个位置，在文字自动折行时使用。
- `[count]|` 跳到本行的第[count]列。
- `gm` 和 `gM` 是跳到本行的中间位置，
- 按`f`后再敲入另外一个字母。 跳转到下一个出现的该字母. 例如 `fa` 跳转到下一个出现的 a, `F` 则是向后面跳。`t` 和 `T` 跳到该字母的前面和后面。 这几个命令在拷贝删除的时候很有用。例如 `df)`, 是一直删除到下一个小括号。 `dt)` 删除到下一个小括号之前的字母。
- `;` `,` 重复上一次的 `f` 或 `t` 命令。

### 句子跳转

`(` 和 `)` 以句子为单位跳转。句子的定义可以查看 `:h sentence`. 通常是指以句号,问号，叹号结尾的地方。 在代码中，基本上和段落跳转 `{` 功能相同。


### 段落跳转

`{` 和 `}` 跳到上一段落和一下段落，通常是指有空行的地方

## 基于语法语义的跳转

### 小节跳转

`]]` `][` `[[` `[]` 在最外层的花括号之间跳转。在代码中通常是在函数体之间移动。

### 括号跳转

`[(` `[)` 跳转到前面或后面的小括号的位置，中间成对出现的括号会被跳过。 例如下面这个例子，如果光标在 1-2，或者 3-4 之间，按`[(` 就会跳到 1 处。如果光标在 2-3 之间，则会跳到 2 处。也就是说他会跳到包含当前光标位置的那个最小的括号范围。
- `[%` `]%` 跳到前面或后面的括号处，包括大中小括号

```js
       if( name === fullname.substr(1, 5) + lastname ) {    }
    //  1                                             2    3                    4      
```
相对应的`[{` 和 `[}` 则是在包含当前位置的花括号之间跳转。注意这个跟小节跳转是不一样的，`[[` 系列命令跳转的是最外层的花括号。

### 方法跳转
- `[m`, `]m` 跳转到上一个/下一个 方法的开始位置
- `[M`, `]M` 跳转到上一个/下一个 方法的结束位置

## 文件位置跳转
- `gg` 跳到文件第一行
- `G` 跳到文件最后一行
-`{count}G` 或者 `[count]gg` 跳到由 count 指定的行。例如 `42G` 跳转到文件的第 42 行。
-`{count}%` 跳转到 count 指定的百分比位置。 例如 `42%` 跳转到文件的百分之42的位置。
- `:{count}go` 跳转到从文件第一个字符开始算起的第 [count] 个字符。

## 屏幕位置
- `H`, `M`, `L` 跳转到当前屏幕的最上面，中间和最下面位置。 注意这个移动的是光标所在位置。文件本身不会出现滚动

与此相对应的命令是 `zt`, `zz`, `zb` 效果分别是滚动当前的光标所在行到屏幕最上方，中间，和最下方。光标还是停留在相同的文件位置

 
## 折叠跳转 (fold)

- `[z` 跳转到当前折叠块的开始位置
- `zj` `zk` 跳到下一个/上一个折叠块

## 标记 (marks)跳转
- <kbd>m</kbd> + character, m 后面跟一个小写字母，在当前 buffer 中标记一个位置。
- <kbd>`</kbd>{char}, 跳转到标记的位置。
- <kbd>'</kbd>{char}, 跳转到标记的位置的行首
- `]'` <kbd>]`</kbd> 跳转到下一个标记点

## 编辑点之间的跳转

- <kbd>`^</kbd> 跳转到上一个在插入模式的光标位置
- <kbd>`.</kbd> 跳转到最近一个编辑点。
- `g;`, `g,` 在历史修改位置间跳转


# Buffer 跳转

- `C-^`在最近操作的两个 buffer 之间跳转
- `{count} C-^` 如果前面加上数字可以跳转到指定的 buffer 
- `gf` 打开当前光标处的文件名


# 总结

VIM 最强大的地方就在于全键盘操作的方便快捷，但是这依赖于长时间练习形成的肌肉记忆。我的一个小经验是用便利贴把最近看到的新的快捷键贴在电脑上，时不时看一眼，强迫自己在相应的场合下使用，直到形成下意识的习惯。




