---
title: Vim
date: 2023-09-21 15:00:20
tags:
---

# Vim 的工作模式

vim 有6种工作模式。

- 普通模式：使用 vim 打开一个文件时默认模式。也叫命令模式，运行用户通过各种命令浏览代码、滚屏等操作。
- 插入模式：也可以叫做编辑模式，在普通模式下敲击i、a 或 o 就进入插入模式，允许用户通过键盘输入、编辑。
- 命令行模式：在普通模式下，先输入冒号`:`，接着输入命令 ，就可以通过配置命令对 vim 进行配置了，如改变颜色主题、显示行号等，这些配置命令也可以保存到/etc/vim/vimrc配置文件中，每次打开默认配置执行。
- 可视化模式：在普通模式下敲击键盘上的 v 键，就进入可视化模式，然后移动光标就可以选中一块文本，常用来完成文本的复制、粘贴、删除等操作。
- 替换模式：如果我们想修改某个字符，不需要先进入插入模式，删除，然后再输入新的字符，直接在普通模式下，敲击`R`键就可以直接替换。
- EX模式：类似于命令行模式，可以一次运行多个命令。

vim 的各种工作模式可以通过不同的键进行切换，用户统一使用`ESC`键返回到普通模式。

## 命令模式

**用户刚刚启动vim，便进入里命令模式**

此状态下敲击键盘动作会被 Vim 识别为命令，而非输入字符，比如我们此时按下`i`，并不会输入一个字符，`i`被当作了一个命令。

以下是普通模式常用的几个命令:

- `i` -- 切换到输入模式，在光标当前位置开始输入文本。
- `x` -- 删除当前光标所在处的字符。
- `:` -- 切换到底线命令模式，以在最底一行输入命令。
- `a` -- 进入插入模式，在光标下一个位置开始输入文本。
- `o` -- 在当前行的下方插入一个新行，并进入插入模式。
- `O` -- 在当前行的上方插入一个新行，并进入插入模式。
- `dd` -- 删除当前行。
- `yy` -- 复制当前行。
- `p`（小写）-- 粘贴剪贴板内容到光标下方。
- `P`（大写）-- 粘贴剪贴板内容到光标上方。
- `u` -- 撤销上一次操作。
- `Ctrl + r` -- 重做上一次撤销的操作。
- `:w` -- 保存文件。
- `:q` -- 退出 Vim 编辑器
- `:q!` -- 强制退出 Vim 编辑器，不保存修改。

若要编辑文本，只需要启动 Vim，进入了命令模式，按下`i`切换到输入模式即可。

命令模式只有一些最基本的命令，因此仍要依靠**底线命令行模式**输入更多命令。

## 输入模式

在命令模式下按下`i`就进入了输入模式，使用`Esc`键可以返回到普通模式。

在输入模式中，可以使用以下按键：

- **字符按键以及Shifi组合**，输入字符
- **ENTER**，回车键，换行
- **BACK SPACE**，退格键，删除光标前一个字符
- **DEL**，删除键，删除光标后一个字符
- **方向键**，在文本中移动光标
- **HOME/END**，移动光标到行首/行尾
- **Page Up/Page Down**，上/下翻页
- **Insert**，切换光标输入为输入\替换模式，光标将变成竖线/下划线
- **ESC**，退出输入模式，切换到命令模式

## 底线命令模式

在命令模式下按下`:`（英文冒号）就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令，可用的命令非常多。

在底线命令模式中，基本的命令有（已经省略了冒号）：

- :w: 保存文件
- :q: 退出 Vim 编辑器
- :wq: 保存文件并退出 Vim 编辑器
- :q!: 强制退出 Vim 编辑器，不保存修改

按`ESC`键可随时退出底线命令模式。

简单的说，我们可以将这三个模式想成底下的图标来表示：

![img](https://www.runoob.com/wp-content/uploads/2014/07/vim-vi-workmodel.png)

# Vim 的按键说明

## 第一部分：命令模式可用的光标移动、复制粘贴、搜索替换等

<center>
<table>
    <thead>
    	<tr>
        	<th colspan="2">移动光标的方法</th>
        </tr>
    </thead>
    <tbody>
		<tr>
            <td>h 或 向左箭头键(←)</td>
            <td>光标向左移动一个字符</td>
        </tr>
        <tr>
        	<td>j 或 向下箭头键(↓)</td>
            <td>光标向下移动一个字符</td>
        </tr>
        <tr>
        	<td>k 或 向上箭头键(↑)</td>
            <td>光标向上移动一个字符</td>
        </tr>
        <tr>
        	<td>l 或 向右箭头键(→)</td>
            <td>光标向右移动一个字符</td>
        </tr>
        <tr>
        	<td colspan="2">如果你将右手放在键盘上的话，你会发现 hjkl 是排列在一起的，因此可以使用这四个按钮来移动光标。如果想要进行多次移动的话，例如向下移动 30 行，可以使用 "30j" 或 "30↓" 的组合按键，亦即加上想要进行的次数(数字)后，按下动作即可!</td>
        </tr>
        <tr>
        	<td>Ctrl + f</td>
            <td>屏幕『向下』移动一页，相当于 Page Down 按键 (常用)</td>
        </tr>
        <tr>
        	<td>Ctrl + b</td>
            <td>屏幕『向上』移动一页，相当于 Page Up 按键 (常用)</td>
        </tr>
        <tr>
        	<td>Ctrl + d</td>
            <td>屏幕『向下』移动半页</td>
        </tr>
        <tr>
        	<td>Ctrl + u</td>
            <td>屏幕『向上』移动半页</td>
        </tr>
        <tr>
        	<td>+</td>
            <td>光标移动到非空格符的下一行</td>
        </tr>
        <tr>
            <td>-</td>
			<td>光标移动到非空格符的上一行</td>
        </tr>
        <tr>
        	<td>n『空格』</td>
            <td>那个 n 表示『数字』，例如 20 。按下数字后再按空格键，光标会向右移动这一行的 n 个字符。例如 20『空格』 则光标会向后面移动 20 个字符距离。</td>
        </tr>
        <tr>
        	<td>0 或功能键[Home]</td>
            <td>这是数字『 0 』：移动到这一行的最前面字符处 (常用)</td>
        </tr>
        <tr>
        	<td>$ 或功能键[End]</td>
            <td>移动到这一行的最后面字符处(常用)</td>
        </tr>
        <tr>
        	<td>H</td>
            <td>光标移动到这个屏幕的最上方那一行的第一个字符</td>
        </tr>
        <tr>
        	<td>M</td>
            <td>光标移动到这个屏幕的中央那一行的第一个字符</td>
        </tr>
        <tr>
        	<td>L</td>
            <td>光标移动到这个屏幕的最下方那一行的第一个字符</td>
        </tr>
        <tr>
        	<td>G</td>
            <td>移动到这个档案的最后一行(常用)</td>
        </tr>
        <tr>
        	<td>nG</td>
            <td>n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)</td>
        </tr>
        <tr>
        	<td>gg</td>
            <td>移动到这个档案的第一行，相当于 1G 啊！ (常用)</td>
        </tr>
        <tr>
        	<td>n『 Enter 』</td>
            <td>n 为数字。光标向下移动 n 行(常用)</td>
        </tr>
    </tbody>
    <thead>
    	<tr>
        	<th colspan="2">搜索替换</th>
        </tr>
    </thead>
</table>
    </center>

