Vim 快捷键手册
模式说明
- 普通模式(Normal):默认模式,用于导航和命令执行
- 插入模式(Insert):输入文本
- 可视模式(Visual):选择文本
- 命令模式(Command):执行命令
键盘布局

一、基础操作
模式切换
i 进入插入模式(光标前)
a 进入插入模式(光标后)
I 在行首插入
A 在行尾插入
o 在下方新建行插入
O 在上方新建行插入
ESC 返回普通模式
v 进入字符可视模式
V 进入行可视模式
Ctrl+v 进入块可视模式
: 进入命令模式
保存退出
:w 保存文件
:wq 保存并退出
:x 保存并退出(仅当修改时)
:q 退出(无修改时)
:q! 强制退出不保存
ZZ 保存并退出(普通模式)
ZQ 不保存退出(普通模式)
二、光标移动
基本移动
h 左移
j 下移
k 上移
l 右移
0 移动到行首
^ 移动到行首非空白字符
$ 移动到行尾
gg 移动到文件首行
G 移动到文件末行
5G 移动到第5行
单词移动
w 移动到下一个单词开头
e 移动到当前单词结尾
b 移动到上一个单词开头
ge 移动到上一个单词结尾
W/E/B 按空格分隔的单词移动(忽略标点)
屏幕滚动
Ctrl+f 向下翻页
Ctrl+b 向上翻页
Ctrl+d 向下半页
Ctrl+u 向上半页
H 移动到屏幕顶部
M 移动到屏幕中间
L 移动到屏幕底部
搜索跳转
/pattern 向前搜索(n下一个,N上一个)
?pattern 向后搜索
* 向前搜索光标下单词
# 向后搜索光标下单词
% 跳转到匹配的括号
三、编辑操作
删除
x 删除当前字符
X 删除前一个字符
dd 删除当前行
dw 删除到单词结尾
d$ 或 D 删除到行尾
d0 删除到行首
3dd 删除3行
diw 删除当前单词(包括空格)
daw 删除当前单词(含周围空格)
复制粘贴
yy 复制当前行
yw 复制到单词结尾
y$ 复制到行尾
p 在光标后粘贴
P 在光标前粘贴
"ayy 复制到寄存器a
"ap 粘贴寄存器a的内容
撤销重做
u 撤销
Ctrl+r 重做
U 撤销整行修改
. 重复上一次修改
替换
r 替换单个字符(如:r a)
R 进入替换模式(覆盖)
s 删除字符并进入插入模式
S 删除整行并进入插入模式
cw 修改单词(删除并插入)
ciw 修改当前单词
c$ 或 C 修改到行尾
四、可视模式操作
选择文本
v 字符选择
V 行选择
Ctrl+v 块选择
o 切换选择端点
操作示例
1. 按v选择文本,然后:
y 复制选中内容
d 删除选中内容
c 修改选中内容
> 向右缩进
< 向左缩进
2. 块操作示例:
Ctrl+v 进入块选择
移动光标选择多列
I 在每行选择区域前插入
输入内容,按ESC生效
d 删除选中列
五、查找替换
替换命令
:s/old/new 替换当前行第一个old
:s/old/new/g 替换当前行所有old
:%s/old/new/g 替换全文所有old
:%s/old/new/gc 替换全文,每次确认
:1,5s/old/new/g 替换1-5行的old
搜索设置
:set hlsearch 高亮搜索结果
:set incsearch 实时搜索高亮
:nohlsearch 临时取消高亮
:set ignorecase 忽略大小写
:set smartcase 智能大小写匹配
六、窗口管理
窗口分割
:split 水平分割
:vsplit 垂直分割
Ctrl+w s 水平分割当前窗口
Ctrl+w v 垂直分割当前窗口
窗口切换
Ctrl+w w 循环切换窗口
Ctrl+w h 切换到左侧窗口
Ctrl+w j 切换到下方窗口
Ctrl+w k 切换到上方窗口
Ctrl+w l 切换到右侧窗口
Ctrl+w = 等分所有窗口
窗口调整
Ctrl+w + 增加窗口高度
Ctrl+w - 减小窗口高度
Ctrl+w > 增加窗口宽度
Ctrl+w < 减小窗口宽度
Ctrl+w _ 最大化窗口高度
Ctrl+w | 最大化窗口宽度
七、高级技巧
标记和跳转
m{a-z} 设置标记(如:ma)
`{mark} 跳转到标记位置
`a 跳转到标记a
`` 跳转到上次位置
`. 跳转到上次修改位置
:marks 查看所有标记
宏录制
qa 开始录制宏到寄存器a
q 停止录制
@a 执行寄存器a的宏
@@ 重复执行上一次宏
寄存器使用
:reg 查看所有寄存器
"ayy 复制到寄存器a
"ap 粘贴寄存器a内容
"+y 复制到系统剪贴板
"+p 从系统剪贴板粘贴
八、配置相关
常用设置
:set number 显示行号
:set relativenumber显示相对行号
:set wrap 自动换行
:set nowrap 不自动换行
:set autoindent 自动缩进
:set tabstop=4 设置Tab为4空格
:set expandtab 将Tab转为空格
九、实用命令组合
批量操作示例
1. 删除HTML标签内的内容:
vit 选择标签内容
c 修改
2. 复制多行到文件末尾:
:10,20t$ 复制10-20行到末尾
3. 交换两行:
ddp 删除当前行并粘贴到下一行
4. 大小写转换:
gUiw 当前单词转大写
guiw 当前单词转小写
5. 格式化代码:
gg=G 全文件自动缩进
插件管理示例(vim-plug)
1. 安装插件:
:PlugInstall
2. 更新插件:
:PlugUpdate
3. 清理插件:
:PlugClean
十、常用配置示例
基础.vimrc配置
vimrc
" 显示设置
set number
set relativenumber
set cursorline
set showcmd
" 缩进设置
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
" 搜索设置
set hlsearch
set incsearch
set ignorecase
set smartcase
" 其他设置
set mouse=a
set backspace=indent,eol,start
syntax on
filetype plugin indent on
提示 :使用 :help <命令> 查看详细帮助,如 :help w 查看w命令的完整文档。
shell
PS C:\Users\14292> ssh root@192.168.159.105
The authenticity of host '192.168.159.105 (192.168.159.105)' can't be established.
ECDSA key fingerprint is SHA256:p//724CpvDfOcv8+Q0ySVq64rXfTgIlSBbxyCDMf2Ks.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.159.105' (ECDSA) to the list of known hosts.
root@192.168.159.105's password:
Last login: Thu Apr 2 15:16:08 2026 from 192.168.159.1
[root@c005 ~]# hostname
c005
[root@c005 ~]# exit
登出
PS C:\Users\14292> ssh 192.168.159.105
14292@192.168.159.105's password:
Permission denied, please try again.
PS C:\Users\14292> test@192.168.159.105
test@192.168.159.105 : 无法将"test@192.168.159.105"项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼
写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ test@192.168.159.105
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (test@192.168.159.105:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\Users\14292> ssh test@192.168.159.105
test@192.168.159.105's password:
-bash: ulimit: open files: 无法修改 limit 值: 不允许的操作
-bash: ulimit: max user processes: 无法修改 limit 值: 不允许的操作
[test@c005 ~]$ exit
登出
Connection to 192.168.159.105 closed.
PS C:\Users\14292> ssh test@192.168.159.105 hostname
test@192.168.159.105's password:
c005
PS C:\Users\14292> ssh test@192.168.159.105 id
test@192.168.159.105's password:
uid=1000(test) gid=1000(test) 组=1000(test) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023