Vim 编辑器入门指南
# Vim 编辑器入门指南
Vim 是 Linux 上使用最广泛的文本编辑器,具有程序编辑能力,可以主动以字体颜色辨别语法正确性,方便程序设计。
# 📖 快速开始
# 什么是 Vim?
Vim (Vi IMproved) 是一个高度可配置的文本编辑器,以高效的文本编辑著称。它是 Unix 系统中 Vi 编辑器的改进版本。
# 学习路径
- 新手入门:使用内置教程
vimtutor学习基础操作(强烈推荐) - 配置优化:通过
~/.vimrc文件自定义配置 - 插件扩展:使用插件管理器安装插件增强功能
# vimtutor - 交互式教程
vimtutor 是 Vim 内置的交互式教程,最适合新手学习。
使用方法:
# 直接在终端运行
vimtutor
# 或指定语言
vimtutor zh # 中文教程
2
3
4
5
学习内容:
- 移动光标
- 插入和删除文本
- 保存和退出文件
- 搜索和替换
- 基本编辑技巧
学习建议
vimtutor 教程需要 30-60 分钟完成,建议一次性完成并反复练习。
# 🎯 Vim 模式
Vim 有多种模式,这是它区别于其他编辑器的核心特性:
| 模式 | 说明 | 进入方式 | 退出方式 |
|---|---|---|---|
| 普通模式 | 默认模式,用于导航和执行命令 | 启动 Vim 时 | - |
| 插入模式 | 编辑文本 | i, a, o 等 | Esc |
| 可视模式 | 选择文本 | v, V, Ctrl+v | Esc |
| 命令行模式 | 执行命令 | :, /, ? | Enter 或 Esc |
# 1. 普通模式(Normal Mode)
这是 Vim 的默认模式,用于导航和执行命令。
# 1.1 光标移动
基础移动:
| 命令 | 说明 |
|---|---|
h | 左移一个字符 |
j | 下移一行 |
k | 上移一行 |
l | 右移一个字符 |
行内移动:
| 命令 | 说明 |
|---|---|
0 | 移动到行首 |
^ | 移动到本行第一个非空字符 |
$ | 移动到行尾 |
g0 | 移动到屏幕行行首 |
g^ | 移动到屏幕行第一个非空字符 |
g$ | 移动到屏幕行行尾 |
单词移动:
| 命令 | 说明 |
|---|---|
w | 移动到下一个单词开头 |
W | 移动到下一个单词开头(忽略标点) |
e | 移动到下一个单词末尾 |
E | 移动到下一个单词末尾(忽略标点) |
b | 移动到上一个单词开头 |
B | 移动到上一个单词开头(忽略标点) |
字符查找:
| 命令 | 说明 |
|---|---|
f{char} | 移动到本行下一个 {char} 字符处 |
F{char} | 移动到本行上一个 {char} 字符处 |
nf{char} | 移动到本行第 n 个 {char} 字符处 |
; | 重复上次 f/F 查找 |
, | 反向重复上次 f/F 查找 |
行跳转:
| 命令 | 说明 |
|---|---|
gg | 跳转到文件第一行 |
G | 跳转到文件最后一行 |
{n}G | 跳转到第 n 行 |
{n}gg | 跳转到第 n 行 |
:n | 跳转到第 n 行 |
屏幕移动:
| 命令 | 说明 |
|---|---|
H | 跳转到屏幕顶部 |
M | 跳转到屏幕中间 |
L | 跳转到屏幕底部 |
zt | 当前行移到屏幕顶部 |
zz | 当前行移到屏幕中间 |
zb | 当前行移到屏幕底部 |
Ctrl+f | 向下翻页 |
Ctrl+b | 向上翻页 |
其他移动:
| 命令 | 说明 |
|---|---|
% | 匹配括号移动 (), {}, [] |
* | 查找光标所在单词的下一个 |
# | 查找光标所在单词的上一个 |
gj | 移动到段落内下一行 |
gk | 移动到段落内上一行 |
+ / Enter | 移到下一行第一个非空字符 |
- | 移到上一行第一个非空字符 |
# 1.2 删除操作
| 命令 | 说明 |
|---|---|
x | 删除光标后一个字符 |
dw | 删除一个单词 |
d{n}w | 删除 n 个单词 |
dd | 删除整行 |
{n}dd | 删除 n 行 |
d$ 或者 D | 删除到行尾 |
d0 | 删除到行首 |
dG | 删除到文件末尾 |
dH | 删除到屏幕顶部 |
df{char} | 删除到下一个 {char} 字符, 包含. F 表示向前删除 |
dt{char} | 删除到下一个 {char} 字符, 不包含, T 表示先前删除 |
diw | 删除光标所在单词 |
di" | 删除双引号内的内容(不删引号本身) |
di' | 删除单引号内的内容(不删引号本身) |
di( | 删除圆括号内的内容(不删括号本身) |
di{ | 删除花括号内的内容(不删括号本身) |
:1,2d | 删除第 1-2 行 |
:5,$d | 删除第 5 行到文件末尾 |
:%d | 删除文件所有内容 |
d 命令的组合规则
dfvsdt:df{char}删除到字符并包含该字符,dt{char}删除到字符但不包含该字符(t = till)di= delete inside:删除包裹内容,保留外层引号/括号。对应的da= delete around,会连同引号/括号一起删除- 示例:光标在
"hello world"的h上,di"结果为"",da"则整个删除
# 1.3 复制粘贴
复制(yank):
| 命令 | 说明 |
|---|---|
yw | 复制一个单词 |
yy | 复制整行 |
y$ | 复制到行尾 |
{n}yy | 复制 n 行 |
:31,100y | 复制第 31-100 行 |
粘贴(paste):
| 命令 | 说明 |
|---|---|
p | 在光标后粘贴 |
P | 在光标前粘贴 |
复制多行示例:
" 方法 1:使用行号
" 复制第 1-100 行
gg " 跳到第一行
V " 进入可视行模式
100G " 选择到第 100 行
y " 复制
p " 粘贴
" 方法 2:使用命令
:1,100y " 复制第 1-100 行到寄存器
2
3
4
5
6
7
8
9
10
# 1.4 其他操作
| 命令 | 说明 |
|---|---|
u | 撤销 |
Ctrl+r | 恢复撤销 |
. | 重复上次操作 |
cw | 删除单词并进入插入模式 |
# 2. 插入模式(Insert Mode)
从普通模式进入插入模式的方式:
| 命令 | 说明 |
|---|---|
i | 在光标前插入 |
I | 在行首插入 |
a | 在光标后插入 |
A | 在行尾插入 |
o | 在下一行插入 |
O | 在上一行插入 |
s | 删除光标字符并插入 |
S | 删除整行并插入 |
常用组合
i/a:最常用,分别在光标前/后插入o/O:快速创建新行A:快速跳到行尾插入
# 3. 可视模式(Visual Mode)
用于选择文本块:
| 命令 | 说明 |
|---|---|
v | 字符可视模式 |
V | 行可视模式 |
Ctrl+v | 块可视模式 |
可视模式操作:
" 选择并操作
V " 进入行可视模式
5j " 向下选择 5 行
y " 复制选中内容
d " 删除选中内容
> " 向右缩进
< " 向左缩进
2
3
4
5
6
7
# 4. 命令行模式(Command Mode)
# 4.1 帮助
:help或者:h进入命令行模式:h quickref: 最基础的命令列表- 查特定的键
:h x: 查 x 键是干嘛的
- 查组合键
CTRL键用c-表示::h c-w(查看窗口切换相关的快捷键)。ALT/Option键用m-表示::h m-a
- 查模式特定键
:h v_u: 可视模式下的快捷键:h i_ctrl-w: 插入模式下的快捷键
# 4.2 文件操作
| 命令 | 说明 |
|---|---|
:w | 保存 |
:w! | 强制保存 |
:w {file} | 另存为 |
:saveas {file} | 另存为 |
:q | 退出 |
:q! | 强制退出(不保存) |
:wq | 保存并退出 |
:x | 保存并退出 |
:qa! | 退出所有文件(不保存) |
:e {file} | 打开文件 |
:e! | 放弃修改,重新加载 |
# 4.3 搜索
基本搜索:
| 命令 | 说明 |
|---|---|
/{pattern} | 向下搜索 |
?{pattern} | 向上搜索 |
n | 下一个匹配 |
N | 上一个匹配 |
/\<word\> | 精确匹配单词 |
* | 搜索光标所在单词 |
# | 反向搜索光标所在单词 |
搜索技巧:
" 统计匹配次数
:%s/\<word\>/&/gn
" 统计单词数
:%s/\a\+/&/gn
" 统计非空字符数
:%s/\S\+/&/gn
" 查找配对括号
%
2
3
4
5
6
7
8
9
10
11
# 4.4 替换
基本语法:
:[range]s/{pattern}/{replacement}/{flags}
常用替换:
| 命令 | 说明 |
|---|---|
:s/old/new/ | 替换当前行第一个 |
:s/old/new/g | 替换当前行所有 |
:%s/old/new/gc | 替换所有(需确认) |
:%s/old/new/ | 替换每行第一个 |
:%s/old/new/g | 替换所有 |
:%s/old/new/gi | 替换所有(忽略大小写) |
:#,#s/old/new/g | 替换指定行范围 |
:.,+2s/foo/bar/g | 当前行及接下来 2 行 |
实用示例:
" 删除行首空白
:%s/^\s*//g
" 删除行尾空白
:%s/\s\+$//g
" 删除空行
:g/^$/d
" 每行行尾添加分号
:%s/$/;/g
2
3
4
5
6
7
8
9
10
11
# 4.5 退出/关闭帮助
:q: 关闭当前窗口(最常用)。:bd: 删除该文档缓存并关闭。:only: 只保留当前窗口,关闭其他所有(包括报错窗口或多个帮助窗口)。
# 4.5 其他命令
显示设置:
| 命令 | 说明 |
|---|---|
:set nu | 显示行号 |
:set nonu | 隐藏行号 |
:set nu! | 切换行号显示 |
:set ic | 忽略大小写 |
:set noic | 区分大小写 |
Ctrl+G | 显示文件信息 |
# 4.6 粘贴模式
:set paste: Vim 会进入一个特殊的 “粘贴模式”。在这个模式下,Vim 会暂时禁用以下所有干扰项
- 禁用 自动缩进 (autoindent)、智能缩进 (smartindent) 等。
- 禁用 插入模式下的某些特殊快捷键和映射 (mappings)。
- 禁用 自动换行等格式化功能。
# 4.7 执行外部命令
:!{command} " 执行外部命令
:!ls " 列出文件
:!python % " 执行当前 Python 文件
2
3
# 5. 多文件编辑
# 5.1 分割窗口
| 命令 | 说明 |
|---|---|
:sp {file} | 水平分割打开文件 |
:vsp {file} | 垂直分割打开文件 |
Ctrl+w Ctrl+w | 切换窗口 |
Ctrl+w h/j/k/l | 切换到指定方向窗口 |
Ctrl+w = | 窗口等宽等高 |
Ctrl+w + | 增加窗口高度 |
Ctrl+w - | 减少窗口高度 |
:q | 关闭当前窗口 |
# 5.2 标签页
| 命令 | 说明 |
|---|---|
:tabe {file} | 新标签页打开文件 |
:tabn | 下一个标签页 |
:tabp | 上一个标签页 |
:tabc | 关闭当前标签页 |
gt | 下一个标签页 |
gT | 上一个标签页 |
# 5.3 缓冲区
| 命令 | 说明 |
|---|---|
:e {file} | 打开文件到缓冲区 |
:bnext / :bn | 下一个缓冲区 |
:bprev / :bp | 上一个缓冲区 |
:bd | 关闭当前缓冲区 |
:buffers / :ls | 查看所有缓冲区 |
# 6. 高级搜索(vimgrep)
vimgrep 用于在多个文件中搜索,结果保存在 Quickfix 列表中。
# 6.1 基本用法
语法:
:vimgrep /{pattern}/ {files}
示例:
" 在当前文件搜索
:vimgrep /TODO/ %
" 在所有 .txt 文件中搜索
:vimgrep /error/ **/*.txt
" 在当前目录及子目录的所有 .py 文件中搜索
:vimgrep /function/ **/*.py
2
3
4
5
6
7
8
# 6.2 Quickfix 操作
| 命令 | 说明 |
|---|---|
:copen | 打开 Quickfix 窗口 |
:cclose | 关闭 Quickfix 窗口 |
:cn / :cnext | 下一个匹配 |
:cp / :cprev | 上一个匹配 |
:cc | 跳到指定匹配 |
:cfilter {pattern} | 过滤 Quickfix 列表 |
# 6.3 vimgrepadd
vimgrepadd 将搜索结果追加到 Quickfix 列表,而不是替换。
" 第一次搜索
:vimgrep /error/ *.log
" 追加搜索结果
:vimgrepadd /warning/ *.log
" 查看所有结果
:copen
2
3
4
5
6
7
8
对比:
| 命令 | 行为 |
|---|---|
vimgrep | 替换 Quickfix 列表 |
vimgrepadd | 追加到 Quickfix 列表 |
# 6.4 正则表达式技巧
" OR 搜索(注意 | 需要转义)
:vimgrep 'aaaa\|bbbb' %
" 复杂模式
:vimgrep '\[17474.*\(Report\.PMMReport\]\|PlayTimeHelper\]\)' *.log
" 搜索连续两行包含相同内容
:vimgrep '.*onReallyStart\n.*onReallyStart' *.log
2
3
4
5
6
7
8
# 7. 插件管理
# 7.1 vim-plug(推荐)
安装 vim-plug:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
2
配置 ~/.vimrc:
" 插件列表开始
call plug#begin('~/.vim/plugged')
" 插件示例
Plug 'preservim/nerdtree' " 文件树
Plug 'yssl/QFEnter.vim' " Quickfix 增强
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim' " 模糊查找
" 插件列表结束
call plug#end()
2
3
4
5
6
7
8
9
10
11
插件管理命令:
| 命令 | 说明 |
|---|---|
:PlugInstall | 安装插件 |
:PlugUpdate | 更新插件 |
:PlugClean | 清理未使用插件 |
:PlugStatus | 查看插件状态 |
# 7.2 推荐插件
QFEnter - Quickfix 增强:
" 在 .vimrc 中添加
Plug 'yssl/QFEnter.vim'
" 运行安装
:PlugInstall
" 使用
:QFEnter " 打开新 Quickfix 窗口
:QFEnter <number> " 切换 Quickfix 窗口
2
3
4
5
6
7
8
9
# 8. 配置文件(.vimrc)
创建或编辑 ~/.vimrc 文件来自定义 Vim:
" 基础设置
set number " 显示行号
set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set showcmd " 显示命令
set showmatch " 显示括号匹配
" 缩进设置
set tabstop=4 " Tab 宽度
set shiftwidth=4 " 缩进宽度
set expandtab " Tab 转空格
set autoindent " 自动缩进
set smartindent " 智能缩进
" 搜索设置
set ignorecase " 搜索忽略大小写
set smartcase " 智能大小写搜索
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
" 外观设置
syntax on " 语法高亮
set background=dark " 深色背景
colorscheme desert " 配色方案
" 其他设置
set mouse=a " 启用鼠标
set encoding=utf-8 " 编码
set nobackup " 不创建备份文件
set noswapfile " 不创建交换文件
" 快捷键映射
" 快速保存
nnoremap <C-s> :w<CR>
" 快速退出
nnoremap <C-q> :q<CR>
" 清除搜索高亮
nnoremap <Esc><Esc> :noh<CR>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
配置文件参考:vimrc configuration guide (opens new window)
# 9. 实用技巧
# 9.1 复制问题
问题:启用行号后,在可视模式复制可能包含空格。
解决方法:
" 方法 1:临时关闭行号
:set nu! " 关闭行号
" 复制后再开启
:set nu!
" 方法 2:使用寄存器复制
" 选择文本后直接 y 复制到寄存器
" 然后 :e file 打开其他文件
" 使用 p 粘贴
" 方法 3:使用系统剪贴板
set clipboard=unnamedplus " 在 .vimrc 中设置
2
3
4
5
6
7
8
9
10
11
12
# 9.2 从标准输入读取
# 通过管道将命令输出用 Vim 打开
command | vim -
# 示例
cat file.txt | vim -
ls -la | vim -
2
3
4
5
6
# 9.3 快速帮助
:help quickfix " Quickfix 帮助
:help pattern " 正则表达式帮助
:help usr_toc " 用户手册目录
:h {keyword} " 查询关键字帮助
2
3
4
# 10. 常用场景速查
# 场景 1:快速编辑文件
vim file.txt " 打开文件
i " 进入插入模式
# 编辑内容
Esc " 返回普通模式
:wq " 保存并退出
2
3
4
5
# 场景 2:批量替换
vim file.txt
:%s/old/new/gc " 全局替换(需确认)
# 按 y 确认,n 跳过,a 全部替换
:wq
2
3
4
# 场景 3:多文件搜索
vim
:vimgrep /TODO/ **/*.py " 搜索所有 Python 文件
:copen " 打开结果窗口
# Enter 跳转到匹配位置
:cn " 下一个结果
2
3
4
5
# 场景 4:对比文件
# 使用 vimdiff
vimdiff file1.txt file2.txt
2
# 场景 5:批量编辑
vim *.txt " 打开所有 txt 文件
:%s/old/new/g " 替换当前文件
:wnext " 保存并打开下一个
# 重复上述操作
2
3
4
# 11. 生态工具
# 11.1 vimdiff
- 基础移动与跳转
]c: 跳到 下一个 差异点 (Next Change)[c: 跳到 上一个 差异点 (Previous Change)
- 块级同步 (Normal 模式)
dp: Diff Put - 把当前窗口的内容“推”给另一个窗口do: Diff Obtain - 从另一个窗口“拿”内容到当前窗口
- 局部同步 (Visual 模式) - 重点!
注意:在
V(Visual Line) 模式下,直接按d会触发删除。此时必须使用冒号命令:
:'<,'>diffput: 仅将选中的行 推 过去:'<,'>diffget: 仅将选中的行 拉 过来 (等同于:diffget)
- 折叠管理 (Folding)
zo: Open - 展开当前折叠zc: Close - 关闭当前折叠zr: Reduce - 展开全文所有折叠zm: More - 关闭全文所有折叠
- 状态修复与排障
:diffupdate: 强制刷新。当手动编辑后高亮没及时跟上时使用。:diffthis: 检查模式是否关闭。若某个窗口变白,进入该窗口输入此命令重新加入对比。:set diff?: 检查当前窗口是否处于 diff 模式(返回diff或nodiff)。:set wrap/:set nowrap: 开启或关闭折行(对比长代码时很有用)。
- 多文件保存与退出
:wa: 保存所有窗口 (Write All):qa: 退出所有窗口 (Quit All):wqa: 保存并退出所有窗口 (Write & Quit All)
💡 进阶:配置优化 (建议加入 ~/.vimrc)
如果觉得每次输入 :diffput 太麻烦,可以在配置文件中加入映射,实现 Visual 模式下按 g 拉取,按 p 推送:
" 在 Visual 模式下,按 g 执行拉取,按 p 执行推送
vmap g :diffget<CR>
vmap p :diffput<CR>
2
3
# 11.2 vimgrep
# 12. Vim 寄存器 (Registers) 深度指南
Vim 的寄存器可以看作是多个剪贴板的集合。当你执行删除(d)、复制(y)或粘贴(p)时,Vim 其实是在操作这些特定的内存空间。
# 1. 基础操作逻辑
- 指定寄存器:在执行
y或p之前,按"(双引号) 加上 寄存器名。 - 命令格式:
"{register}{action}- 示例:
"*y(复制到系统剪贴板) - 示例:
"ap(粘贴寄存器a中的内容)
- 示例:
# 2. 常用寄存器分类
| 寄存器类型 | 名称 | 描述 |
|---|---|---|
| 无名寄存器 | "" | 默认寄存器。任何 d, c, s, x, y 的内容都会存入此处。 |
| 系统剪贴板 | "* 或 "+ | 与操作系统剪贴板交互(macOS/Windows 通常用 *)。 |
| 有名寄存器 | a - z | 用户自定义存储。例如 "ay 会永久保存内容直到你覆盖它。 |
| 黑洞寄存器 | "_ | 彻底删除。执行 "_dd 内容不会覆盖任何寄存器,直接消失。 |
| 搜索寄存器 | "/ | 存储上一次搜索的关键词。 |
| 表达式寄存器 | "= | 在插入模式按 Ctrl-R = 可以进行数学计算并插入结果。 |
# 3. 核心场景:对接系统剪贴板
为了解决 Vim 与 macOS 之间“数据不互通”的痛点,主要依赖以下两个寄存器:
*寄存器:在 macOS/Linux 中通常指向 Primary Selection(即鼠标选中的内容)。+寄存器:指向系统的 Clipboard(即Cmd+C复制的内容)。
高频操作:
- 复制到系统:进入 Visual 模式选中文本,依次按下
"*y。- 从系统粘贴:在 Normal 模式依次按下
"*p。
# 4. 自动化配置 (进阶)
如果你不想每次都输入 "*,可以在 ~/.vimrc 中开启自动同步:
" 将默认寄存器与系统剪贴板关联
set clipboard=unnamed
" 如果上面的不行,试试这个(针对特定 Linux/Unix 环境)
" set clipboard=unnamedplus
2
3
4
5
配置后的变化: 所有的 y 操作都会直接进入系统剪贴板,所有的 p 都会读取系统剪贴板。
方案2: 如果你不想改变 Vim 的默认行为,可以映射一个更爽的快捷键。在 ~/.vimrc 加入:
# Visual 模式下,按 F 把选中内容传给系统剪贴板
vmap F "*y
2
# 5. 管理与查看
如果你忘记了寄存器里存了什么,可以使用以下命令:
:reg:列出所有寄存器及其当前内容。:reg a:只查看寄存器a的内容。Ctrl + r+{name}:在 插入模式 (Insert Mode) 下,直接把某个寄存器的内容打出来。
# 📚 学习资源
# 官方文档
# 教程资源
- Vim Search in File (opens new window)
- 知乎 - 精通 Vim (opens new window)
- Vim Pattern 文档 (opens new window)
# 插件资源
- vim-plug 官方 (opens new window)
- vim-plug 中文教程 (opens new window)
- Vim 插件分享 (opens new window)
- Quickfix 和 Location List (opens new window)
# 💡 学习建议
- 从 vimtutor 开始:这是最好的入门教程
- 每天练习:Vim 需要肌肉记忆,每天使用才能熟练
- 逐步学习:不要一次学太多,先掌握基础移动和编辑
- 使用插件:合适的插件能大幅提升效率
- 自定义配置:根据个人习惯配置 .vimrc
- 查阅帮助:遇到问题使用
:help命令
# 🎯 快捷键速查表
# 必记快捷键
| 功能 | 命令 |
|---|---|
| 进入插入模式 | i |
| 退出插入模式 | Esc |
| 保存 | :w |
| 退出 | :q |
| 保存并退出 | :wq 或 :x |
| 强制退出 | :q! |
| 撤销 | u |
| 重做 | Ctrl+r |
| 复制行 | yy |
| 粘贴 | p |
| 删除行 | dd |
| 搜索 | /pattern |
| 替换 | :%s/old/new/g |
开始你的 Vim 之旅吧!🚀
- 02
- VisiData 终极生存指南(vd)04-27
- 03
- macOS 定时任务实现:Git 仓库状态自动同步方案04-26