# 模式与寄存器

## 普通模式

### 浏览与跳转 (motion)

`j`，`k`，`l`，`h`
`w`，`b`，`e`
`f`，`t`
`^`，`0`，`$`
`gg`，`G`，`200G`，`<C-u>`，`<C-d>`

### 撤销，重做

`u`，`<C-r>`

撤销单元：
1. 一个内容操作
2. 一次离开普通模式并重新进入普通模式期间产生的变化

### 操作符待决模式

**操作符 + 动作指令 = 操作**

`d{motion}`，`y{motion}`，`c{motion}`

### 复制 (yank)

`yy`，`yj`，`yh`
`yt,`，`yf,`
`yaw`，`yiw`，`y2w`，`y2aw`，`2yaw`

### 内容编辑

#### 更新

`d{motion}`，`c{motion}`，`x`，`r`，`R`，`gR`

#### 缩进

`>{motion}`，`<{motion}`

#### 切换大小写

`gu{motion}`，`gU{motion}`，`~`

#### 数字操作

`<C-a>`，`78<C-x>`

## 插入模式

`<C-w>` 删除一个单词
`<C-u>` 删除光标前的内容
`<C-a>` 移动到行首（需要配置）
`<C-e>` 移动到行尾（需要配置）

`<C-r>` 粘贴寄存器的内容，0，=。
`<C-o>` 进入插入-普通模式

## 可视模式

`o` 切换选择边界
`gv` 重新选择
`viw` 选择一个单词
`V` 选择多行
`<C-v>` 块选择，`A` 或 `I` 为选中的多行同时增减内容
`<C-g>` 进入选择模式

## 命令行模式

### 如何触发

在普通模式或可视模式下 `:`，`/`，`?`，在插入模式下 `<C-r>=`。
在普通模式下在`q:` 或在命令行模式下`<C-f>`调出历史记录。

### 常用命令

`w` 保存，`q` 退出，`q!` 强制退出，`wq` 保存并退出
`!ls` 执行 shell 命令 ls，`r!date` 插入当前日期，`r! date "+\%s"` 插入时间戳

## 寄存器

`""` 无名寄存器
`"0` 复制寄存器
`"a` - `"z` 有名寄存器
`"=` 表达式寄存器
...

`<C-r>{register}` 在插入模式下插入寄存器的内容
`"0p` 粘贴复制寄存器的内容
`""p` 等价于 `p`
`"adaw` 删除一个单词并存储到有名寄存器 a
