Vim 是一款功能强大、高度可定制的文本编辑器,以高效、轻量和跨平台著称。它基于 Unix 系统的 vi 编辑器开发,但扩展了更多现代功能,成为程序员和文字工作者的首选工具之一。Vim 的核心理念是“用键盘完成一切”,虽然上手需要时间,但一旦掌握,会成为提升生产力的利器。建议从基础命令开始,逐步探索插件和配置,最终形成自己的工作流
模式化操作
Vim 通过不同模式区分操作:
i 进入)v 进入):w、退出 :q)R)、Ex 模式(Q)等高效文本操作
dd 删除一行,yy 复制一行,p 粘贴,/ 搜索,:s/old/new/g 替换q 录制宏,重复复杂操作:vsplit、:split),方便对比或编辑多个文件轻量级与可扩展性
跨平台支持
hjkl 移动光标(左下右上),gg 跳到文件开头,G 跳到结尾i 插入文本,x 删除字符,u 撤销,Ctrl+r 重做/keyword 搜索,:1,10s/foo/bar/g 替换第1-10行的 foo 为 bar:w 保存,:q! 强制退出不保存,:wq 保存并退出= 命令对齐代码块)。:Explore),或集成插件(如 NERDTree)。:terminal),适合调试或运行命令。:help 命令内置详细帮助.vimrc 配置文件)在 Red Hat Linux 和 CentOS Linux 上,默认安装的 Vim 可能是一个最小功能的版本。虽然这个版本启动速度很快,但它缺少了很多对开发有用的功能,如语法加亮、Python 集成和图形界面。一般情况下,应至少安装更全功能版本的 Vim;如果能使用 X Window 的话,则应安装图形界面版本
可以通过下面的命令来查看已经安装的 Vim 版本:
# 查看已经安装的 Vim 版本
yum list installed | grep vim
# 输出如下
vim-common.x86_64 2:8.2.2637-21.el9 @appstream
vim-enhanced.x86_64 2:8.2.2637-21.el9 @appstream
vim-filesystem.noarch 2:8.2.2637-21.el9 @baseos
vim-minimal.x86_64 2:8.2.2637-21.el9 @baseos 如果输出只有下面这样的内容的话,就说明安装的 Vim 版本只有基本功能:
vim-minimal.x86_64 2:8.0.1763-13.el8 @System
建议使用 sudo yum install vim-X11 来安装图形界面的 Vim,或至少使用 sudo yum install vim-enhanced 来安装增强版本的 Vim
图形界面 Vim 的功能更丰富,并且即使你只在终端里使用 Vim,含图形界面支持的 Vim 会带剪贴板支持,跟整个图形环境的交互也就比较容易。但只是远程通过 SSH 使用 Vim 的话,那确实图形界面支持就没有意义了
在 macOS 中一般已经内置 vim,并提供了除图形界面外的较完整功能集。如果希望使用图形界面,则需要自行安装 MacVim:
使用 Homebrew 安装:
brew install macvim
# 升级的命令
brew upgrade macvim
# 卸载
brew uninstall macvim
mvim --version
# 使用
mvim /Users/XXX/Desktop/123.txt
# 启动 MacVim
mvimWindows 上默认是没有 Vim 的,可以从 Vim 的网站下载 Windows 下的安装包:https://www.vim.org/download.php#pc
安装界面会有一个选择组件的步骤,如下图所示:
<img src="https://zhangzhengyang.oss-cn-beijing.aliyuncs.com/images/202505211839129.png" alt="image-20250521183927377" style="zoom:50%;" />在界面中有几项可以关注一下:
然后点 下一步,不需要修改安装目标文件夹,完成安装即可。使用 gvim 命令打开图形界面,保存可使用 ZZ
图中的 • 表示,单个字母不是完整的命令,必须再有进一步的输入。比如单个 g 没有意义,而 gg 表示跳转到文件开头。一个键最多有三排内容:最底下是直接按键的结果,中间是按下 Shift 的结果(变大写),上面偏右的小字是按下 Ctrl 的结果。还用了一些特殊符号来表示操作的位置,如果你已经了解了这些命令的功能,你也自然就明白它们的意义了

这张图里没有写出 Vim 的命令行命令,此时应该已经掌握了以下这些:
| 命令 | 描述 |
|---|---|
:q! | 退出 Vim(不保存) |
:wq | 存盘并退出 Vim |
:s | 执行替换 |
:! | 执行外部命令 |
:edit | 编辑文件(可缩写为 :e) |
:w | 写文件(保存) |
:r | 读文件 |
:help | 查看帮助 |
Ctrl-D | 命令行补全(向下补全) |
Tab | 命令行补全 |
进入 Vim 后默认状态下键入的字符并不会插入到所编辑的文件之中,Vim 有以下四种主要模式:
: 即可进入该模式;使用斜杠(/)和问号(?)开始搜索也算作命令行模式。命令行模式下的命令要输入回车键(Enter)才算完成Vim 里的大部分操作会在正常模式下完成。如果你做编辑工作时有超过几秒的停顿,就应当考虑按下 Esc 键,回到正常模式
使用 Vim 里的标准键描述方式来讲解。根据 Vim 的一般习惯,使用尖括号来描述特殊的输入序列。下面我会提供一个列表,给出常用键的表示方式及在动图中的显示方式。这部分内容不需要记住,你用的时候作为参考就行
<Esc> 表示 Esc 键;显示为“⎋”<CR> 表示回车键;显示为“↩”<Space> 表示空格键;显示为“␣”<Tab> 表示 Tab 键;显示为“⇥”<BS> 表示退格键;显示为“⌫”<Del> 表示删除键;显示为“⌦”<lt> 表示 < 键;显示为“<”<Up> 表示光标上移键;显示为“⇡”<Down> 表示光标下移键;显示为“⇣”<Left> 表示光标左移键;显示为“⇠”<Right> 表示光标右移键;显示为“⇢”<PageUp> 表示 Page Up 键;显示为“⇞”<PageDown> 表示 Page Down 键;显示为“⇟”<Home> 表示 Home 键;显示为“↖”<End> 表示 End 键;显示为“↘”<F1> - <F12> 表示功能键 1 到 12;显示为“F1”到“F12”<S-…> Shift 组合键;显示为“⇧”(较少使用,因为我们需要写 ! 而不是 <S-1>;和特殊键组合时仍然有用)<C-…> Control 组合键;显示为“⌃”<M-…> Alt 组合键;显示为“⌥”(对于大部分用户,它的原始键名 Meta 应该只具有历史意义)<D-…> Command 组合键;显示为“⌘”(Mac 键盘)现在回到前面的模式部分,提到的 Esc、Enter、v、V 和 Ctrl-V,按现在的描述惯例,以后就会写成 <Esc>、 <CR>、 v、 V 和 <C-V>。这也是以后在 Vim 里对键进行重映射的写法
这里我要强调一下,对“ <”的特殊解释仅在描述输入时生效。在描述命令行和代码时,我们写“ <CR>”仍表示四个字符,而非回车键。特别是,如果我们描述的命令行首是“:”,表示这是一个输入 : 开始的 Vim 命令行模式命令(以回车键结束);如果行首是“/”或“?”,表示这是一个输入 / 或 ? 开始的搜索命令(以回车键结束);如果行首是“ $”,表示这是一个在 shell 命令行上输入的命令(以回车键结束),“ $”(和后面的空格)不是命令的一部分,通常后续行也不是命令的一部分,除非行尾有“\”或“^”字符,或行首有“ $”字符
也就是说,下面的命令是在 Vim 里输入“ :set ft?<CR>”(用来显示当前编辑文件的文件类型):
# 在 vim 命令行输入 :set ft?,显示当前编辑文件的文件类型
:set ft?在终端输入 which vim(用来检查 vim 命令的位置):
$ which vim
/usr/local/bin/vim在配置文件中加入下面的代码。根据 Unix 下的惯例,Vim 的配置文件放在用户的主目录下,文件名通常是 .vimrc;而它在 Windows 下名字是 _vimrc
set enc=utf-8
set nocompatible
source $VIMRUNTIME/vimrc_example.vim上面三行代码完成了下列功能:
如果 ~/.vimrc 不存在,可以通过以下命令创建并编辑:
touch ~/.vimrc # 创建文件
vim ~/.vimrc # 用 Vim 编辑不产生备份文件,但保留跨会话撤销编辑的能力;因为有了撤销文件,备份其实也就没有必要了。同时,把撤销文件放在用户个人的特定目录下,既保证了安全,又免去了其他目录下出现不必要文件的麻烦
要达到这个目的在 Linux/macOS 下会这么写:
set enc=utf-8
source $VIMRUNTIME/vimrc_example.vim
set nobackup " 禁用传统备份文件(.bak)
set nowritebackup " 写入文件时不创建临时备份
set noswapfile " 禁用交换文件(.swp)
if has('persistent_undo')
set undofile
set undodir=~/.vim/undodir
if !isdirectory(&undodir)
call mkdir(&undodir, 'p', 0700)
endif
endif在 Windows 下这么写:
set enc=utf-8
source $VIMRUNTIME/vimrc_example.vim
set fileencodings=ucs-bom,utf-8,gb18030,latin1
set nobackup
if has('persistent_undo')
set undofile
set undodir=~/.vim/undodir
if !isdirectory(&undodir)
call mkdir(&undodir, 'p', 0700)
endif
endifset nobackup这条配置的作用是禁用 Vim 的备份文件(.swp 和 .bak 文件)
验证方法:打开 Vim 并编辑一个文件:
vim test.txt在 Vim 中输入一些内容并保存(:w)。
检查当前目录是否生成 .swp 或 .bak
ls -a # 查看隐藏文件.swp 或 .bak 文件~/.vimrc 是否被正确加载(见下文排查方法)undodir 和自动创建目录这条配置的作用是:
~/.vim/undodir。0700)检查目录是否存在:
ls -ld ~/.vim/undodirmkdir 命令生效:w,尝试撤销操作(:u 或 u)undodir 配置生效(即使目录为空,Vim 也会按需创建撤销文件)根据运行环境动态启用鼠标支持
if has('mouse') " 检查 Vim 是否支持鼠标功能
if has('gui_running') || (&term =~ 'xterm' && !has('mac')) " 条件判断
set mouse=a " 启用所有鼠标操作(a=所有模式)
else
set mouse=nvi " 仅允许在普通模式(n)、可视模式(v)、插入模式(i)中使用鼠标
endif
endif在 Vim 中运行输出应为 mouse=a 或 mouse=nvi
:set mouse?Vim 的运行支持文件在不同的平台上有着相似的目录结构。以 Vim 9.2 为例,它们的标准安装位置分别在:
Unix 下面:/usr/share/vim/vim92macOS Homebrew 下:/usr/local/opt/macvim/MacVim.app/Contents/Resources/vim/runtimeWindows 下:C:\\Program Files (x86)\\Vim\\vim92在安装目录下面有很多子目录,如 autoload、colors、doc、pack、plugin、syntax 等等。这些子目录下面就是分类放置的 Vim 支持文件。最常用的子目录应该是下面这几个:
syntax:Vim 的语法加亮文件doc:Vim 的帮助文件colors:Vim 的配色方案plugin:Vim 的“插件”,即用来增强 Vim 功能的工具在图形界面的 Vim 里,可以通过“语法 > 在菜单中显示文件类型”来展示 Vim 的所有文件类型,然后可以选择某一类型来对当前文件进行设置。这里的菜单项,跟 syntax 目录下的文件就基本是一一对应
使用图形界面,可以在操作系统的资源管理器里进入到合适的目录,然后逐个使用 Vim 来打开文件。可以直接把文件拖拽到 Vim 里、使用 “文件 > 打开” 菜单当然也是一种选择。
使用这几种编辑方式的话,可以把需要粘贴的内容放到操作系统的剪贴板里,然后在图形界面的 Vim 里用以下方法之一粘贴进去:
"+P(意义我们后面再解释)<D-V>(提醒:这是我们对 ⌘V 的标记方式;仅适用于 macOS)或 <S-Insert>(PC 键盘)注意,如果你通常使用 Ctrl-V 键粘贴的话,这个快捷键在 Vim 里并不适用。即使你使用的是图形界面的 Vim 也是如此,因为这个键在 Vim 里有其他用途。顺便说一句,这个键在 Unix 终端上也一样是不能用作粘贴的。
如果直接把图形界面下的基本步骤,翻译成终端 Vim(非图形界面)的用法的话,应该是这样子的:
vim 文件名 来逐一打开需要编辑的文件gg 命令跳转到开头i 进入插入模式<S-Insert>)来粘贴内容<Esc> 回到正常模式并用 :wq 保存退出对每个文件单独使用一个 Vim 会话来编辑,很容易出现冲突的情况,迟早会遇到“已经存在交换文件!”(Swap file “…” already exists!)的错误提示。出现这个提示,有两种可能的原因:
原因不同,处理的策略自然也不相同。当进程 ID(process ID)后面没有 “STILL RUNNING” 这样的字样时,那就是情况 1;否则,就是情况 2
r(Recover)恢复编辑 → 保存后 → 再次打开时按 d(Delete)删除旧交换文件d 删除交换文件后重新打开(放弃未保存内容)q/a 放弃当前编辑(少数情况用 o 只读查看)e)需谨慎(仅确认无冲突时使用)