Vim 是一个高度可配置的文本编辑器,旨在实现高效的文本编辑。它是大多数 UNIX 系统中分发的 vi 编辑器的改进版本。
Vim 通常被称为“程序员的编辑器”,对于编程非常有用,以至于许多人认为它是一个完整的 IDE。但这不仅仅适用于程序员。Vim 非常适合各种文本编辑,从撰写电子邮件到编辑配置文件。
安装
你可以在Linux终端中输入下面的命令来查看是否安装了
vim --version如果出现一大串版本信息,说明 Vim 已经在了。 如果提示 Command 'vim' not found,就安装一下:
sudo apt update && sudo apt install vim -y安装完后再用 vim --version 确认即可。
基本操作
创建并打开文件
我们创建一个叫hello.txt的文件来练习:
vim hello.txt回车后,你的终端会变成 Vim 的界面,大概长这样:
~
~
~
"hello.txt" [New File]此刻你处于普通模式(Normal Mode),这是 Vim 的“默认状态”,所有按键都被理解成命令,而不是输入文字。
编辑文件
想往文件里写内容,必须先进入插入模式(Insert Mode)。按一下键盘上的 i 键(小写字母 i)。你会看到屏幕底部出现 -- INSERT -- 字样,说明现在可以像普通记事本一样打字了。试试输入下面这段文字(可以随意改内容):
Hello, Vim!
This is my first step.
I'm not afraid anymore.随意换行,就像平常一样。写完内容后,按一下 Esc 键(键盘左上角那个键)。你会发现底部的 -- INSERT -- 消失了,这就回到了普通模式。在普通模式下,键盘上的字母又变回了命令。
核心认知:在 Vim 里,你要么在“打字模式”,要么在“命令模式”,大脑要时刻清楚自己在哪种模式里。这是新手最难适应但最重要的一点。
保存文件
然后需要保存文件。保存文件需要在普通模式下输入 : 进入“命令行模式”,然后输入 w(代表 write)并回车。
操作序列:
- 确认你已经在普通模式(看不到
--INSERT--)。 - 按
:键(冒号,需要组合Shift + ;)。 - 屏幕底部会出现一个
:提示符。 - 接着输入
w。 - 按
Enter回车。
你会看到底部显示类似:
"hello.txt" [New] 3L, 60B written这表示文件已保存(写入了 3 行,60 字节)。
退出文件
保存之后,我们想退出。还是在普通模式下:
- 输入
:(冒号) - 输入
q(代表quit) - 按
Enter
Vim界面消失,回到终端提示符,说明你已经安全退出。输入
cat hello.txt查看我们刚刚编辑的文件,如果看到刚刚输入的文字,说明编辑成功。
假设我们修改了文件内容,但是又不想保存,直接退出,再打开文件
vim hello.txt这次按 i 进入插入模式,胡乱加一些内容,然后按 Esc 回到普通模式,输入 :q 回车。Vim会报错:
E37: No write since last change (add ! to override)意思是文件被修改过,但没保存,我们输入 :q! 回车强制退出,不保存。你会直接退回终端,刚才的修改不会保存。
命令总结
我们可以在普通模式下输入 :wq 回车,意思是保存并离开
| 操作 | 命令 | 说明 |
|---|---|---|
| 从终端打开/创建文件 | vim 文件名 | 进入 Vim |
| 进入插入模式 | i | 屏幕底部出现 --INSERT-- |
| 退出插入模式 | Esc | 回到普通模式 |
| 保存 | :w | 冒号+w,回车 |
| 退出(无修改时) | :q | 冒号+q,回车 |
| 强制退出不保存 | :q! | 放弃修改,直接退出 |
| 保存并退出 | :wq 或 :x | 保存后离开 |
移动的艺术
请先用 vim 打开一个文件,我们边看边练:
vim practice.txt然后按 i 进入插入模式,把下面这段示例文本一字不差地打进去(或复制粘贴也行,但要确认粘贴成功)。这段文本是我们全章的练习场:
The quick brown fox
jumps over the lazy dog.
It was the best of times,
it was the worst of times.
Hello, Vim World!按 Esc 回到普通模式,我们开始移动。
常见移动方式
基础移动 h j k l
h—— 向左(←)j—— 向下(↓)k—— 向上(↑)l—— 向右(→)
词间移动 w b e
w—— 跳到下一个单词的开头(word)b—— 跳到上一个单词的开头(back)e—— 跳到当前(或下一个)单词的末尾(end)
行内精准移动 0 ^ $
0—— 跳到这一行的绝对开头(第 0 列)^—— 跳到这一行第一个非空白字符$—— 跳到这一行的末尾
文件级跳跃 gg G
gg—— 跳转到文件的第一行G—— 跳转到文件的最后一行
数字 + G可以跳到指定行,比如3G跳转到第 3 行。
屏幕级滚动 Ctrl-u Ctrl-d Ctrl-f Ctrl-b
Ctrl + u—— 向上翻半页(up)Ctrl + d—— 向下翻半页(down)Ctrl + f—— 向前翻一整页(forward)Ctrl + b—— 向后翻一整页(backward)
为了验证效果,我们可以把刚刚的内容多复制几遍,尽量超过一页
命令总结
| 移动范围 | 命令 | 动作 |
|---|---|---|
| 字符 | h / j / k / l | 左 / 下 / 上 / 右 |
| 单词 | w | 下一个单词开头 |
| 单词 | b | 上一个单词开头 |
| 单词 | e | 当前/下一个单词末尾 |
| 行内 | 0 | 行首(绝对) |
| 行内 | ^ | 行首(第一个非空字符) |
| 行内 | $ | 行尾 |
| 文件 | gg | 文件第一行 |
| 文件 | G | 文件最后一行 |
| 文件 | 数字G | 跳到指定行号 |
| 屏幕 | Ctrl+u / Ctrl+d | 上半页 / 下半页 |
| 屏幕 | Ctrl+f / Ctrl+b | 下整页 / 上整页 |
操作符与动作组合
操作符 (Operator) 是“做啥”:
d删除,c修改,y复制动作 (Motion) 是“对哪做”:
w一个词,$到行尾,gg到文件头
把它们组合起来,就是一句话。比如 “删除一个单词” 就是 d + w = dw。
常见操作
删除操作符 d
dw—— 删除一个单词d$—— 删除到行尾dd—— 删除整行dG—— 删除到文件尾
修改操作符 c—— 删除并进入插入模式
c 和 d 的动作范围一模一样,但它多做了一个动作:删完后自动按了 i,让你进入插入模式开始写新东西。
cw—— 修改一个单词(从当前位置删除一个词,并进入插入模式)c$—— 修改到行尾(从当前位置一直删除到行尾,并进入插入模式)cc—— 修改整行(删除整行并进入插入模式)
复制操作符 y
yw—— 复制一个单词yiw—— 复制光标下整个词,iw是个文本对象,代表 "inner word",它会精准选中光标下的整个单词,不论光标在词的首尾还是中间。yy—— 复制整行y$—— 复制到行尾
粘贴操作符 p / P
p—— 粘贴到光标后(下方)P—— 粘贴到光标前(上方)
撤销操作符 u
u—— 撤回上一步
搜索、替换与撤销
创建一个练习文件:
vim chapter4.txt进入插入模式,输入以下文本:
The quick brown fox.
jumping jackrabbits jump joyfully.
This fox is very fast.
The fox and the dog are friends.
Foxes are everywhere.
A quick fox jumps over the quick fox.
The QUICK brown Fox.
quick quick QUICK QuIcK搜索
在 Vim 里搜索不需要先按冒号,在普通模式直接按 / 或 ? 即可。
/—— 正向搜索(从光标位置向文件尾方向找)?—— 反向搜索(从光标位置向文件头方向找)
按 gg 回到文件开头。按 /,你会看到屏幕左下角出现一个 / 提示符。输入 fox,然后按 Enter 回车。光标立刻跳到第一个 fox 上。现在按 n —— 跳到下一个匹配项(next)。再按 n 几次,一直跳到文件末尾的 fox。现在按 N(大写,即 Shift+n)—— 跳回上一个匹配项。用 n 和 N 在匹配项之间来回穿梭几趟。
按 ?,输入 fox,回车。Vim 会从光标位置向上搜索。按 n 和 N 的跳跃方向也会随之反转。
Vim 默认是区分大小写的。搜索 /fox 不会匹配到 Fox。如果你想忽略大小写搜索,可以临时加 \c,比如 /fox\c 会匹配 fox、Fox、FOX 等。\C 则强制区分大小写。
搜索完后,所有匹配的词可能都被高亮了。如果这些高亮干扰了阅读,可以暂时关掉:输入 :nohlsearch 或简写 :noh,回车。高亮就消失了。下次你再搜索时,高亮会自动恢复。
替换
Vim 的替换命令是经典的 :s 命令,格式为:
:[range]s/pattern/replacement/[flags]替换当前行第一个匹配项
- 把光标移动到第二行 Jumping jackrabbits jump joyfully.
- 输入
:s/jump/leap/然后回车。 - 你会发现这行里第一个 jump 变成了 leap,但后面的 jump 没变。
替换当前行所有匹配项
- 按
u撤销上一步。 - 输入
:s/jump/leap/g然后回车。 - 这次整行里所有的 jump 都变成了 leap。末尾的 g 是 global 的意思,代表整行范围。
指定行的替换
如果你想对第 3 行到第 6 行做替换:输入 :3,6s/fox/cat/g 回车。观察文件:只有第 3 行到第 6 行的 fox 变成了 cat,其他行不受影响。
全文件替换
输入 :%s/fox/cat/g 回车。% 代表整个文件,这条命令会把文件里所有的 fox 替换成 cat。做完后请按 u 撤销回来,我们还要练下面的。
确认式替换
批量替换有时很危险,你不想全自动改,而是想看一个、决定一个。加 c 确认标志即可。输入 :%s/fox/cat/gc 回车。光标会跳到第一个 fox,底部出现提示:
replace with cat (y/n/a/q/l/^E/^Y)?y—— 改这一个n—— 不改,跳到下一个a—— 全改(all),放弃确认q—— 不改了,直接退出替换l—— 改完这一个就直接退出
撤销与重做
u—— 撤销(undo)Ctrl + r—— 重做(redo)
Vim 的撤销不像普通编辑器那样“Ctrl+Z 再 Ctrl+Y 就没了”,它有一个撤销树,我们暂时只感受线性部分:
- 任意删除一行(
dd)。 - 修改一个词(
cw输入新词后Esc)。 - 粘贴一行(
p)。 - 现在连续按
u几次,观察文件一步步退回之前的状态。 - 再连续按
Ctrl + r,一步一步把撤销掉的操作重新“做”回来。
命令总结
| 操作 | 命令 | 说明 |
|---|---|---|
| 正向搜索 | /关键词 | 用 n / N 跳下一个/上一个 |
| 反向搜索 | ?关键词 | 方向与 / 相反 |
| 关闭高亮 | :noh | 暂时关闭搜索结果高亮 |
| 当前行替换 | :s/old/new/ | 只替换该行第一个匹配项 |
| 当前行全局替换 | :s/old/new/g | 替换该行所有匹配项 |
| 指定行范围替换 | :3,6s/old/new/g | 对第3到第6行进行全局替换 |
| 全文替换 | :%s/old/new/g | 替换整个文件 |
| 确认式替换 | :%s/old/new/gc | 每个匹配项都询问是否替换 |
| 撤销 | u | 撤销上一步操作 |
| 重做 | Ctrl+r | 重做被撤销的操作 |
多文件与窗口管理
为了这次练习,我们需要先准备两个文件。请退出 Vim,在终端里执行:
echo -e "apple\nbanana\ncherry\ndate\nelderberry" > fruits.txt
echo -e "red\nyellow\npink\nbrown\npurple" > colors.txt缓冲区
你打开一个文件,Vim 就在内存里为它创建一个“缓冲区”(buffer)。你可以同时打开好几个缓冲区,只在需要时切换显示。
跟着做:
vim fruits.txt你现在打开了 fruits.txt,这是缓冲区列表里的第一个。
在 Vim 里,用下面命令打开第二个文件:
:e colors.txt(意思是 edit 一个新文件)。现在你看到的是 colors.txt,但 fruits.txt 的缓冲区还在后台。
查看缓冲区列表:输入::ls(或 :buffers、:files,都是同一个命令)
你会看到类似:
1 # "fruits.txt" line 1
2 %a "colors.txt" line 1%表示当前正在显示的文件a表示激活的缓冲区#表示上一个访问的缓冲区
切换缓冲区
按 Ctrl + ^。这个操作会在“当前文件”和“上一个文件”之间来回跳。按一次跳回 fruits.txt,再按一次跳回 colors.txt。这是最快的两个文件互切方式。
按编号或名字切换:
:b 1切换到编号为 1 的缓冲区:b fruits甚至能支持模糊匹配,只要打出部分名字,按 Tab 自动补全
窗口分割
在 colors.txt 界面里,输入
:spilt fruits.txt简写(:sp fruits.txt)
屏幕被水平分割成上下两半,上面是 colors.txt,下面是 fruits.txt。
Ctrl + w然后按j—— 跳到下面的窗口Ctrl + w然后按k—— 跳到上面的窗口- 规律是:
Ctrl+w开启窗口命令模式,然后再按方向键(我们就用hjkl)
垂直分割
输入::vsplit(或 :vsp),把当前窗口左右再分成两半。如果你还没打开新文件,分割出来的两个窗口会显示同一个缓冲区,可以在其中一个用 :e 换文件。
Ctrl + w 再按 =,所有窗口立刻均分屏幕空间。
关闭当前窗口
:q 正常关闭(或者 Ctrl + w 再按 q)
标签页
创建标签页
- 输入
:tabnew,会打开一个空白的新标签页,里面只有一个窗口 - 在新标签页里,用
:e fruits.txt打开文件
切换标签页
gt—— 跳到下一个标签页gT—— 跳到上一个标签页数字+gt—— 跳到指定的标签页(比如1gt跳到第一个标签页)
关闭标签页
:tabclose或:tabc
文件浏览
打开当前目录的文件浏览器
:Explore(简写 :Ex)。你会看到一个文件列表,用 j k 上下移动,回车打开文件或者进入目录,如果想看上层目录,光标移到 ../ 上回车即可。
窗口间复制粘贴
场景:把 fruits.txt 里的内容,逐行复制到 colors.txt 的每一行前面。
- 用
:sp fruits.txt水平分割,上下各一个文件。 - 在上面窗口(
colors.txt)定位到第一行。 - 按
Ctrl + w再按j跳到下面窗口。 - 光标放在
apple上,按yy复制整行。 - 按
Ctrl + w再按k跳回上面窗口。 - 按
P(大写)将 apple 粘贴到当前行之前。 - 然后按
j下移一行,再按Ctrl+w j跳下去复制 banana,如此循环。
命令总结
| 类别 | 命令 | 说明 |
|---|---|---|
| 打开文件 | :e 文件名 | 在缓冲区打开文件 |
| 缓冲区列表 | :ls | 列出所有缓冲区 |
| 切换缓冲区 | Ctrl+^ | 在最近两个缓冲区间切换 |
| 切换缓冲区 | :b 编号/名字 | 按编号或名字切换 |
| 水平分割 | :sp 文件名 | 上下分屏 |
| 垂直分割 | :vsp 文件名 | 左右分屏 |
| 窗口间跳转 | Ctrl+w j/k/h/l | 按方向跳窗口 |
| 均分窗口 | Ctrl+w = | 窗口等大 |
| 关闭窗口 | Ctrl+w q | 关闭当前窗口 |
| 新建标签页 | :tabnew | 创建空白标签页 |
| 切换标签 | gt / gT | 下一个/上一个标签 |
| 文件浏览 | :Ex | 打开内置文件浏览器 |
高效定制
编辑 .vimrc 文件
Vim 的配置都写在一个叫 .vimrc 的文件里,它就在你的用户主目录下。
在终端里输入:
vim ~/.vimrc如果文件已经存在(有些系统会预装一个示例),你可以先备份一下:
cp ~/.vimrc ~/.vimrc.backup现在用 Vim 打开它,我们一起写几行。
基础设置
在 ~/.vimrc 里输入以下内容
" 基础设置
set number " 显示行号
set relativenumber " 显示相对行号(配合跳转很好用)
set autoindent " 自动缩进
set smartindent " 更智能的缩进(比如换行自动对齐)
set tabstop=4 " Tab 键宽度为 4 个空格
set shiftwidth=4 " 自动缩进时使用 4 个空格
set expandtab " 把输入的 Tab 自动转成空格(写代码常用)
set cursorline " 高亮当前行
set hlsearch " 搜索时高亮所有匹配项
set incsearch " 输入搜索词时即时匹配
set ignorecase " 搜索时默认忽略大小写
set smartcase " 但如果搜索词包含大写字母,就区分大小写
set showcmd " 在屏幕右下角显示正在输入的命令
set showmode " 在屏幕左下角显示当前模式(-- INSERT -- 等)
set ruler " 显示光标所在行号和列号
set laststatus=2 " 始终显示状态栏
set wildmenu " 命令行补全时显示增强菜单
set mouse=a " 启用鼠标支持(选文本、调窗口大小等,适合新人过渡)保存并退出(:wq)。重新打开 Vim,你就可以看到设置生效了。你可以试试新的变化。或者在不退出的情况下,在任意打开的文件里执行:
:source ~/.vimrc创建快捷键映射
Vim 允许你把常用的组合键映射成更方便的快捷键。我们会改的都是普通模式下的映射。在 ~/.vimrc 里继续添加:
" 快捷键映射
" <Leader> 键默认是反斜杠 \,可以自定义为空格
let mapleader = "\<Space>"
" 用 <Leader> + w 快速保存
nnoremap <Leader>w :w<CR>
" 用 <Leader> + q 快速退出
nnoremap <Leader>q :q<CR>
" 用 <Leader> + x 保存并退出
nnoremap <Leader>x :wq<CR>
" 用 Ctrl + j/k 在窗口间快速切换(代替 Ctrl+w j/k)
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
" 用 H/L 快速跳到行首/行尾(省去按 Shift)
nnoremap H ^
nnoremap L $
" 用 J/K 一次移动 5 行(实现“快速滚动”)
nnoremap J 5j
nnoremap K 5k
" 用 <Leader> + / 清除搜索高亮
nnoremap <Leader>/ :noh<CR>注意:
nnoremap表示只在普通模式下生效,且不会递归映射。这是安全且推荐的做法。
重新加载配置(:source ~/.vimrc)
安装插件管理器
Vim 社区有无数插件,能让编辑器支持语言补全、文件树、模糊搜索等等。我们需要一个插件管理器来管理它们。这里推荐 vim-plug,因为它简单、快、支持异步安装。
安装 vim-plug:
在终端里运行这一条命令(它会把 plug.vim 下载到正确位置):
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim配置 ~/.vimrc 以使用插件
打开 ~/.vimrc,在文件里合适的位置加入插件定义块:
" 插件管理
call plug#begin('~/.vim/plugged')
" 一个超好用的注释插件:gc 注释/取消注释
Plug 'tpope/vim-commentary'
" 状态栏美化(可选,新手友好)
Plug 'vim-airline/vim-airline'
" 文件树浏览器(可选,类似 IDE 侧边栏)
Plug 'preservim/nerdtree'
call plug#end()保存文件并重新加载(:source ~/.vimrc 或重启 Vim),然后执行:
:PlugInstall你会看到 vim-plug 自动下载并安装这几个插件。等它们装好后,我们立刻体验一个:vim-commentary。
体验第一个插件 —— vim-commentary
这个插件提供了一个非常符合 Vim 哲学的功能:用 gc 动作来注释或取消注释代码/文本。
创建一个 test.py,随意写一些代码,在普通模式下:
- 按
gcc—— 注释/取消注释当前行 - 按
gc然后按j—— 注释当前行及下一行(gc+ 动作) - 选中一段文字(用
V进入可视行模式,然后j选几行),再按gc—— 注释选中的多行
它支持大量文件类型(貌似.txt文件不支持,好像文本文件本身就不能注释),自动判断用 //、# 还是 " 等注释符。
命令总结
| 操作 | 命令/设置 | 说明 |
|---|---|---|
| 编辑配置文件 | vim ~/.vimrc | 所有配置的入口 |
| 重新加载配置 | :source ~/.vimrc | 不用重启 Vim |
| 显示行号 | set number | 绝对行号 |
| 相对行号 | set relativenumber | 方便看到跳几行 |
| Tab 转空格 | set expandtab | 写 Python/YAML 必开 |
| 高亮当前行 | set cursorline | 定位更直观 |
| 搜索忽略大小写 | set ignorecase | 配合 smartcase 使用 |
| 设置 <Leader> | let mapleader = "\<Space>" | 把 Leader 改成空格键很流行 |
| 定义快捷映射 | nnoremap 键 动作 | 只在普通模式生效 |
| 安装 vim-plug | 见上方 curl 命令 | 一次性安装 |
| 声明插件 | Plug '作者/插件名' | 写在 plug#begin/end 块内 |
| 安装插件 | :PlugInstall | 安装块内所有插件 |
| 注释插件使用 | gc + 动作/文本对象 | vim-commentary 插件 |
总结
Vim 的基本使用差不多就是以上这些,如果还需要深入学习,可以自行上网搜索。比如说可视化模式、宏操作等。


