vim入门使用手册
- [vim 自带的教程](#vim 自带的教程)
- [vim 的模式](#vim 的模式)
- [vim 的交换文件](#vim 的交换文件)
-
- [1. 交换文件是什么?](#1. 交换文件是什么?)
- [2. 交换文件的生成与位置](#2. 交换文件的生成与位置)
- [3. 恢复与处理交换文件](#3. 恢复与处理交换文件)
- [4. 交换文件相关命令与配置](#4. 交换文件相关命令与配置)
-
- 查看与删除交换文件
- [常用配置选项(可在 `~/.vimrc` 中设置)](#常用配置选项(可在
~/.vimrc中设置))
- [5. 交换文件与备份文件、撤销文件的区别](#5. 交换文件与备份文件、撤销文件的区别)
- [6. 最佳实践与注意事项](#6. 最佳实践与注意事项)
- 移动光标
- 操作
- 缓冲区(Buffer)
-
- [1. 缓冲区是什么?](#1. 缓冲区是什么?)
- [2. 缓冲区的基本操作](#2. 缓冲区的基本操作)
- [3. 缓冲区的状态与保存](#3. 缓冲区的状态与保存)
- [4. 缓冲区的高级用法](#4. 缓冲区的高级用法)
-
- 缓冲区列表导航
- [缓冲区参数列表(Argument List)](#缓冲区参数列表(Argument List))
- [缓冲区与快速修复列表(Quickfix List)](#缓冲区与快速修复列表(Quickfix List))
- [5. 缓冲区相关配置](#5. 缓冲区相关配置)
- [6. 缓冲区与标签页、窗口的协作](#6. 缓冲区与标签页、窗口的协作)
- [7. 最佳实践](#7. 最佳实践)
- 窗口
- 标签页
- [目录浏览器 Netrw](#目录浏览器 Netrw)
vim 自带的教程
bash
$ vimtutor zh
vim 的模式
Vim 是一个模态编辑器,这意味着它在不同的模式下有不同的行为。理解并熟练切换这些模式是高效使用 Vim 的关键。Vim 主要有三种核心模式,每种模式都有其特定的用途和操作方式。
1. 正常模式(Normal Mode)
正常模式是 Vim 的默认启动模式,也是你执行大多数命令和导航操作的模式。在这个模式下:
- 所有按键都对应着编辑命令 ,而不是输入字符。例如,按
x会删除光标下的字符,按dd会删除整行。 - 你可以使用
h、j、k、l等键在文本中快速移动光标。 - 组合键可以形成强大的编辑操作,例如
d2w会删除两个单词,c$会修改从光标到行尾的内容并进入插入模式。 - 按
Esc键可以从其他模式返回到正常模式。
提示:大部分时间你应该停留在正常模式,只在需要输入文本时才进入插入模式,完成输入后立即返回正常模式。这种"编辑-移动"的循环是 Vim 哲学的核心。
2. 插入模式(Insert Mode)
插入模式类似于传统文本编辑器的编辑状态,在这个模式下:
- 你可以直接输入文本,按键会像在普通编辑器中一样插入字符。
- 从正常模式进入插入模式有多种方式:
i:在光标前插入(insert before cursor)a:在光标后插入(append after cursor)I:在行首插入A:在行尾插入o:在当前行下方新建一行并插入O:在当前行上方新建一行并插入
- 在插入模式下,你可以使用方向键移动光标,但更高效的方式是按
Esc返回正常模式,然后用 Vim 的移动命令快速定位。
3. 可视化模式(Visual Mode)
可视化模式用于选择文本块,然后对选中的文本执行操作。Vim 提供了三种可视化子模式:
-
字符可视化模式(Character-wise Visual Mode)
- 按
v进入,用于选择任意连续的字符。 - 选中后,可以执行删除(
d)、复制(y)、替换(r)等操作。
- 按
-
行可视化模式(Line-wise Visual Mode)
- 按
V(大写)进入,用于选择整行文本。 - 适合对整行进行操作,如复制多行、删除多行等。
- 按
-
块可视化模式(Block-wise Visual Mode)
- 按
Ctrl + v进入,用于选择矩形文本块。 - 特别适合对多行代码的同一列进行操作,例如同时注释多行、在多行前添加相同字符等。
- 按
其他重要模式
除了上述三种核心模式外,Vim 还有几个有用的模式:
- 命令行模式(Command-line Mode) :按
:进入,用于执行 Ex 命令(如保存:w、退出:q、搜索替换:%s/old/new/g)。 - 替换模式(Replace Mode) :按
R进入,直接覆盖现有文本,而不是插入新文本。 - 选择模式(Select Mode) :类似于可视化模式,但更接近 GUI 编辑器的选择行为,按
gh进入。
模式切换总结
text
正常模式 (Esc) <--> 插入模式 (i, a, I, A, o, O)
正常模式 (v, V, Ctrl+v) --> 可视化模式 (Esc 返回正常模式)
正常模式 (:) --> 命令行模式 (执行命令后自动返回正常模式)
正常模式 (R) --> 替换模式 (Esc 返回正常模式)
掌握这些模式及其切换方式,能让你在 Vim 中游刃有余地进行高效编辑。# vim 的交换文件
vim 的交换文件
Vim 的交换文件(Swap File) 是一个重要的安全机制,用于在编辑过程中保护你的工作免受意外中断(如系统崩溃、SSH 连接断开、Vim 进程异常退出等)的影响。理解交换文件的工作原理和管理方式,能让你在遇到意外时从容恢复数据,并避免因交换文件残留导致的编辑冲突。
1. 交换文件是什么?
- 定义 :交换文件是 Vim 在编辑文件时自动创建的临时文件,通常以
.文件名.swp的形式保存在与原文件相同的目录下(例如编辑example.txt时会生成.example.txt.swp)。 - 作用 :它实时保存你对文件所做的未保存的修改。Vim 会定期(默认每 200 个字符或 4 秒无输入时)将缓冲区中的更改写入交换文件,而不是直接写入原文件。
- 恢复原理:当 Vim 非正常退出后再次打开同一文件时,它会检测到交换文件的存在,并提示你进行恢复操作,从而最大程度地减少数据丢失。
2. 交换文件的生成与位置
- 自动生成:只要用 Vim 打开一个文件进行编辑,交换文件就会在后台生成。
- 文件命名 :默认情况下,交换文件以
.开头,后接原文件名和.swp后缀(隐藏文件)。你也可以通过:set directory选项自定义交换文件的存放目录,例如将其统一放到~/.vim/swap/目录下,避免污染项目文件夹。 - 多个交换文件 :如果同时用多个 Vim 实例编辑同一个文件,Vim 会为每个实例生成不同的交换文件(如
.example.txt.swo、.example.txt.swn等),以防止冲突。
3. 恢复与处理交换文件
当你重新打开一个存在交换文件的文件时,Vim 会显示类似下面的提示:
text
Found a swap file by the name ".example.txt.swp"
owned by: username dated: Wed May 14 22:30:00 2026
file name: ~/project/example.txt
modified: YES
user name: username host name: mypc
process ID: 12345
While opening file "example.txt"
dated: Wed May 14 22:25:00 2026
(1) Another program may be editing the same file.
(2) An edit session for this file crashed.
If this is the case, be careful not to end up with two
different instances of the same file when making changes.
Swap file ".example.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
此时你有几个选择:
[O]pen Read-Only:以只读方式打开文件,查看内容但不进行编辑。适合确认文件内容是否是你需要的。(E)dit anyway:忽略交换文件,直接编辑原文件。危险:如果另一个 Vim 实例正在编辑该文件,可能导致数据冲突或丢失。(R)ecover:从交换文件中恢复未保存的更改。Vim 会将交换文件中的内容与当前文件内容合并,并打开一个恢复后的缓冲区。恢复后,你可以用:diffthis对比恢复内容与原文件的差异,然后决定保留哪些修改。(D)elete it:删除交换文件。通常在确认该交换文件是旧的、不再需要时使用(例如上次编辑已正常保存退出,但交换文件未被自动删除)。(Q)uit或(A)bort:退出打开操作。
4. 交换文件相关命令与配置
查看与删除交换文件
-
在 Vim 内查看当前交换文件信息:
:swapname -
手动删除交换文件(在终端中):
bashrm .example.txt.swp或删除所有交换文件:
bashrm -f .*.swp
常用配置选项(可在 ~/.vimrc 中设置)
vim
" 禁用交换文件(不推荐,失去崩溃恢复能力)
set noswapfile
" 将交换文件集中存放到指定目录,避免污染项目目录
set directory=~/.vim/swap//
" 注意:末尾的 // 表示使用绝对路径,避免文件名冲突
" 设置交换文件更新频率(默认 'updatecount' 为 200,即每输入 200 个字符保存一次)
set updatecount=500
" 设置无输入后的等待时间(默认 'updatetime' 为 4000 毫秒)
set updatetime=3000
5. 交换文件与备份文件、撤销文件的区别
- 交换文件(Swap File):实时保存未提交的修改,用于崩溃恢复。编辑结束后通常会自动删除(如果 Vim 正常退出)。
- 备份文件(Backup File) :在覆盖原文件前创建的副本,默认以
文件名~形式保存。由:set backup控制。 - 撤销文件(Undo File) :持久化保存撤销历史,即使关闭 Vim 再重新打开,仍能撤销之前的操作。由
:set undofile启用,文件通常为文件名.un~。
6. 最佳实践与注意事项
- 不要轻易禁用交换文件:除非你确信编辑环境非常稳定(如本地编辑小文件),否则保留交换文件是保护数据的重要措施。
- 定期清理旧交换文件 :如果项目目录下出现大量
.swp文件,可能是之前异常退出残留的。可以用rm -f .*.swp清理,但务必先确认这些文件对应的编辑会话已经结束。 - 遇到恢复提示时谨慎选择 :优先选择
(R)ecover恢复数据,然后仔细对比差异。如果不确定,可以先[O]pen Read-Only查看内容。 - 团队协作时注意:如果多人通过共享目录编辑同一文件,交换文件机制无法解决并发冲突,建议使用版本控制系统(如 Git)来管理文件变更。
掌握交换文件的管理,能让你在享受 Vim 高效编辑的同时,无惧意外中断,确保工作成果的安全。
移动光标
h -> 向左移动
l -> 向右移动
k -> 向上移动
j -> 向下移动
w -> 向前移动单词(3w 向前移动 3 个单词)
b -> 向后移动单词
e -> 向前移动到最近一个单词的结尾
{ -> 向上移动一个段落(2 段文字之间的空行称为段落)
} -> 向下移动一个段落
操作
c -> 修改操作(c + 移动操作 删除移动的内容,并且进入插入模式)
d -> 删除操作(d + 移动操作 删除移动的内容)
cc -> 删除整行,并且进入插入模式
dd -> 删除整行
x -> 删除单个字符
r -> 替换单个字符
缓冲区(Buffer)
在 Vim 中,缓冲区(Buffer) 是文件在内存中的内部表示。理解缓冲区是掌握 Vim 多文件编辑能力的基础。每个打开的文件(无论是从磁盘加载还是新建的未保存文件)都会对应一个缓冲区。缓冲区允许你在不关闭 Vim 的情况下同时编辑多个文件,并在它们之间高效切换。
1. 缓冲区是什么?
- 定义 :缓冲区是 Vim 用来存储文件内容的内存区域。当你用
:e filename打开一个文件时,Vim 会将其内容读入一个新的缓冲区。 - 与文件的关系 :缓冲区是文件在内存中的"副本"。你对缓冲区的修改不会立即写入磁盘,直到你执行保存命令(
:w)。 - 与窗口的关系 :窗口是查看缓冲区的"视口"。一个缓冲区可以在多个窗口中同时显示(例如用
:split分割窗口查看同一文件的不同部分),而一个窗口一次只能显示一个缓冲区。
2. 缓冲区的基本操作
列出所有缓冲区
bash
:ls " 列出所有缓冲区
:buffers " 同上,:ls 的别名
输出示例:
text
1 %a "example.txt" line 1 # % 表示当前窗口显示的缓冲区,a 表示激活(active)
2 "main.py" line 0 # 未激活的缓冲区
3 "README.md" line 1
状态标志说明:
%:当前窗口中显示的缓冲区a:激活的缓冲区(已加载且可编辑)h:隐藏的缓冲区(已加载但未在任何窗口中显示)+:缓冲区已被修改(有未保存的更改)-:缓冲区不可修改(例如以只读模式打开)=:只读缓冲区
切换缓冲区
bash
:b 2 " 切换到编号为 2 的缓冲区
:b main.py " 切换到文件名为 main.py 的缓冲区
:b# " 切换到上一个缓冲区(在最近两个缓冲区之间快速切换)
:bn " 切换到下一个缓冲区(buffer next)
:bp " 切换到上一个缓冲区(buffer previous)
关闭/删除缓冲区
bash
:bd " 删除当前缓冲区(buffer delete),如果缓冲区有未保存的修改会提示
:bd! " 强制删除当前缓冲区,丢弃所有未保存的修改
:bd 2 " 删除编号为 2 的缓冲区
:1,3bd " 删除编号 1 到 3 的缓冲区
注意:关闭缓冲区只是将其从缓冲区列表中移除,并不会关闭 Vim 或窗口。如果该缓冲区是窗口中显示的最后一个缓冲区,窗口会显示空白。
新建缓冲区
bash
:enew " 新建一个空缓冲区(edit new)
:new filename " 新建一个窗口并在其中编辑新文件(同时创建新缓冲区)
3. 缓冲区的状态与保存
查看缓冲区状态
bash
:file " 显示当前缓冲区的文件名和状态
:ls! " 显示更详细的缓冲区信息,包括完整路径
保存缓冲区
bash
:w " 保存当前缓冲区到文件
:w newname " 另存为 newname
:1,5w output.txt " 将第 1 到第 5 行写入 output.txt
放弃修改
bash
:e! " 重新加载磁盘上的文件,丢弃所有未保存的修改
:q! " 强制退出,丢弃所有未保存的修改
4. 缓冲区的高级用法
缓冲区列表导航
Vim 提供了快速导航缓冲区列表的快捷键(需在正常模式下使用):
text
:ls " 先列出所有缓冲区
:buffer N " 切换到编号 N 的缓冲区(N 从 :ls 列表中获取)
更高效的方式是使用插件(如 vim-bufferline)在状态栏显示缓冲区标签,或使用 Ctrl-^(即 Ctrl+6)在最近两个缓冲区之间切换。
缓冲区参数列表(Argument List)
参数列表是缓冲区的子集,通常用于关联的一组文件(例如同一个项目的多个源文件)。
bash
:args *.py " 将所有 .py 文件加入参数列表
:args " 显示参数列表
:next " 切换到参数列表中的下一个文件
:prev " 切换到上一个文件
:first " 切换到第一个文件
:last " 切换到最后一个文件
缓冲区与快速修复列表(Quickfix List)
快速修复列表(:copen)和位置列表(:lopen)也使用缓冲区来显示搜索结果、编译错误等信息。这些特殊缓冲区是只读的,但你可以用 :cbuffer 或 :lbuffer 命令将当前缓冲区的内容载入快速修复/位置列表。
5. 缓冲区相关配置
在 ~/.vimrc 中可以自定义缓冲区行为:
vim
" 允许隐藏已修改的缓冲区(即使有未保存的更改,也能切换到其他缓冲区)
set hidden
" 设置缓冲区切换时自动保存(默认 off)
" set autowrite
" 在状态栏显示缓冲区编号和文件名
set laststatus=2 " 总是显示状态栏
set statusline=%n:\ %f " 状态栏格式:缓冲区编号: 文件名
" 使用更友好的缓冲区切换快捷键
nnoremap <Leader>b :ls<CR>:b<Space> " <Leader>b 列出缓冲区并提示输入编号
nnoremap <C-n> :bn<CR> " Ctrl+n 下一个缓冲区
nnoremap <C-p> :bp<CR> " Ctrl+p 上一个缓冲区
6. 缓冲区与标签页、窗口的协作
- 缓冲区 vs 窗口 :窗口是查看缓冲区的界面。你可以用
:split或:vsplit创建新窗口来查看同一个缓冲区的不同部分,或者用:sbuffer N在新窗口中打开指定缓冲区。 - 缓冲区 vs 标签页:标签页是窗口的集合。每个标签页可以包含多个窗口,每个窗口显示一个缓冲区。不同标签页可以显示相同的缓冲区(即同一个文件可以在多个标签页中同时打开)。
7. 最佳实践
- 使用
:ls定期查看缓冲区列表,避免打开过多缓冲区导致内存占用过高。 - 善用
:bd清理不再需要的缓冲区,保持工作区整洁。 - 启用
set hidden:这样即使缓冲区有未保存的修改,也能切换到其他缓冲区,不会频繁提示保存。 - 结合参数列表处理相关文件 :例如
:args src/*.c然后:argdo %s/old/new/g批量替换。 - 使用缓冲区编号而非文件名切换 :当有同名文件在不同目录时,使用
:b N更准确。
掌握缓冲区的概念和操作,能让你在 Vim 中轻松管理多个文件,实现真正的高效多任务编辑。
窗口
vim 将缓冲区加载到窗口中。一个屏幕可以同时显示多个窗口,它们将屏幕分割成几块。
bash
:split animals/cat.py
split 命令可以简写为 sp
垂直方向分割
bash
:vsplit animals/cat.py
vsplit 命令可以简写为 vs
多个窗口之间的切换
ctrl+w
方向:
h -> 左
l -> 右
k -> 上
j -> 下
也可以使用键盘的方向键
窗口的移动
ctrl+w
方向:
H -> 左
L -> 右
K -> 上
J -> 下
标签页
vim 标签页
新建标签页
bash
:tabnew
切换标签页
- 切换到下一个标签页 gt 或者 :tabnext
- 切换到上一个标签页 gT 或者 :tabprevious
关闭标签页
bash
:tabclose
移动标签页
:tabmove N
bash
:tabmove 0
目录浏览器 Netrw
Netrw 是 vim 的内置文件管理器,支持对目录和文件的浏览,和操作系统下的文件管理器类似
bash
:Explore
或者简写
bash
:Ex
相关操作
- Enter 键用于打开目录或者文件
- -键进入上一层目录
- D 键删除一个文件或者目录
- R 键重命名一个文件或者目录