2. vi/vim 编辑器
vi 是 Unix/Linux 系统中基于终端的最经典的文本编辑器,诞生于 1976 年(由 Bill Joy 开发)。
Vim(Vi IMproved)是 vi 的增强版, 于 1991 年发布(由 Bram Moolenaar 开发)。
Vim 完全兼容 vi 编辑器,在 vi 的基础上扩充了功能。
特点:
- vi 体积小,功能强大,几乎所有的系统都预装 vi编辑器,是编辑配置文件,编写 Shell 脚本的首选,尤其在服务器环境中普遍存在。
- Vim 功能更强,在 vi 的基础上还支持语法高亮,代码折叠,多重撤销等功能。
- Vim 支持各种插件来扩展功能。如:代码补全。Git 集成等。
- Vim 在 Linux/UNIX(MacOS)系统中可用,在 Windows 系统中也可以安装基于图形用户界面(GUI)的版本(
GVim)。 - vi / Vim 学习难度比 nano 高,但他是嵌入式开发、服务器运维,Linux/UNIX 下 C/C++ 开发人员的首选。
Ubuntu 24.04 没有预装 Vim 编辑器,需要使用 apt 命令安装,安装命令如下:
sudo apt install vim
vi/Vim 启动命令:
vi [文件名]
vim [文件名]
如:
weimingze@mzstudio:~$ vim hello.py
vi 编辑器界面如下:

左下角的 "hello.py" 是正在编辑的文件的名字。
文件名后的 2L,23B 是指你正在编辑的这个文件共 2 行,共 23 字节。
后面的 2,0-1 是指示当然光标所在的位置,
右下角的 全部 指当前向内容已经全部显示。
vi/Vim 编辑器的三种模式
- 命令模式
- 输入模式
- 末行模式
刚进入 vi 时是在 命令模式 下,如图:

在 命令模式 下,你的任何按键都是命令,不能输入内容。
我们先来学习如何退出 vi/Vim。
在命令模式下输入英文的冒号(:),这个冒号会出现在左下角的最后一行,此时进入末行模式:
print("hello world!")
~
~
~
:
此时输入 :q! 后 回车 则不保存退出 vi。输入 :wq 后 回车 则保存后退出 vi,如果在末行模式下 按下 ESC 键则回到命令模式。
重新进入 vi,我们再来说一下 编辑模式。在 命令模式 下,输入 i、a、o中的任意一个按键则进入 编辑模式,在编辑模式下,你输入的任何按键都是文档的内容,当你编辑完成后需要按 ESC 键返回到 命令模式 才能进行保存退出。
尝试一下吧!至此你已经学会了 vi/Vim 的基本用法。
下面我们来学习他的高级用法。
进入编辑模式的命令
iIaAoOcwc$c^进入插入状态后,左下角会显示 -- INSERT -- 提示,如:
print("hello world!")
~
~
-- INSERT -- 1,22 All
在编辑模式下编辑 C 语言程序时,使用快捷键
Control + n可以调出自动补全功能。这个是我用了很多年的功能,咱们可以试试。
我常用的末行命令
在命令模式下,输入英文的冒号就进入末行模式了。末行模式需要用回车键进行确认。按 ESC 则取消末行模式,返回到命令模式。以下是我用过的末行模式。
:w:w 文件路径名:wq:q:q!:e 其他文件路径名:e! 其他文件路径名:e#:r 其他文件路径名:! 命令:r! 命令:set nu:set nonu:数字:20 跳转到第 20 行。:sp 或 :sp 其他文件路径名Control + w + w 可以在窗口内切换光标。:vs 或 :vs 其他文件路径名Control + w + w 切换光标。
:sp和:vs可以将窗口无限细分,如果你的电脑屏幕足够大,那真是太爽了。
我就想起这么多,以后想起来的再补充。
下面我来说一下命令模式下的命令。
在任何模式下,只要按下 ESC 键就会回到命令模式。
命令模式下常用的命令
命令模式下光标相关的命令:
h 或 左方向键(←)l 或 右方向键(→)k 或 上方向键(↑)j 或 下方向键(↓)Control + f 或 Page UpControl + b 或 Page DownControl + uControl + d^ 或 Home$ 或 Endwbegg 或 1GG命令模式下删除、复制、粘贴相关的命令:
xdddwded$d^Jyyywy$y^p删除命令删除的内容都会进入
vi缓冲区,可以使用p命令进行粘贴。
命令模式下撤销/重做操作
uUControl + r字符串查找操作
在命令模式下用 / 或 ? 进入末行模式进行查找。
/查找字符串?查找字符串nN字符串替换操作
在命令模式下用 : 进入末行模式进行查找。
:%s/old/new/gc(y/n/a/q/l/^E/^Y)?,y替换当前,n不替换(跳过),a替换所有,q退出替换。l替换当前匹配后退出,^E(Control+E)向下滚动屏幕,^Y(Control+Y)向上滚动屏幕。:s/old/new:s/old/new/g:#,#s/old/new/g:%s/old/new/g:s/old/new/c块操作
Vim 在命令模式下使用 ^V(Control + V) 可以进行块操作。下面介绍一个我常用的块操作。在 Python 或 Shell 中都没有多行注释,我们要在每一行的行首插入井号(#)我们可以使用块操作组合键实现上述功能,方法是 Control + v 再用j/k上下移动方向键,在输入大写的I(shift + i),然后输入一个井号(#),再按下 ESC 结束输入回到命令模式。此时所有块光标前都多了一个井号。
使用 Control + V 进入块模式还可以剪切、复制和粘贴,挺方便的。
关于 vi/Vim 的操作远不止这些。如果你想了解更多,请使用 末行命令 :help 查看帮助。
关于 vi/Vim 编辑器的笔记我先记下到这里,虽然有很多常用的命令要记住,但他确实很强大,如何你是码农,你会爱上他。当使用 vi/Vim 时,你会发现你的手根本不用离开主键盘就可以快速完成一切任务,简直是码农必备之神器。
如果你想玩点 Linux/UNIX 下更高级的编辑器,请尝试 emacs。
练习:
- 使用 vi 或 vim 编辑文件
hello.cpp,写入内容如下并保存。
#include <iostream>
using namespace std;
int main(int argc, char * argv[]) {
cout << "hello world!" << endl;
return 0;
}