一、移动光标
1.1、基础移动
快捷键 | 作用 |
---|---|
h j k l |
左/下/上/右移动 |
w |
跳到下一个单词开头 |
b |
跳到上一个单词开头 |
e |
跳到当前单词末尾 |
0 |
跳到行首 |
^ |
跳到行首第一个非空白字符 |
$ |
跳到行尾 |
gg |
跳到文件第一行 |
G |
跳到文件最后一行 |
:n |
跳到第 n 行(如 :10 跳第 10 行) |
1.2、屏幕滚动
快捷键 | 作用 |
---|---|
Ctrl+u |
向上滚动半屏 |
Ctrl+d |
向下滚动半屏 |
Ctrl+b |
向上滚动整屏 |
Ctrl+f |
向下滚动整屏 |
zz |
当前行居中显示 |
zt |
当前行置顶 |
zb |
当前行置底 |
二、编辑操作
2.1、插入模式
快捷键 | 作用 |
---|---|
i |
在光标前插入 |
a |
在光标后插入 |
I |
在行首插入 |
A |
在行尾插入 |
o |
在下方插入新行 |
O |
在上方插入新行 |
2.2、删除与修改
快捷键 | 作用 |
---|---|
x |
删除当前字符 |
dw |
删除当前单词 |
dd |
删除当前行 |
D |
删除到行尾 |
cw |
修改当前单词(删除并进入插入模式) |
cc |
修改整行 |
r |
替换单个字符 |
R |
进入替换模式(连续替换) |
2.3、复制粘贴
快捷键 | 作用 |
---|---|
yy |
复制当前行 |
yw |
复制当前单词 |
p |
粘贴到光标后 |
P |
粘贴到光标前 |
"ayy |
复制当前行到寄存器 a |
"ap |
粘贴寄存器 a 的内容 |
三、搜索与替换
3.1、搜索
快捷键 | 作用 |
---|---|
/keyword |
向前搜索 keyword |
?keyword |
向后搜索 keyword |
n |
跳转到下一个匹配项 |
N |
跳转到上一个匹配项 |
* |
搜索当前光标下的单词 |
3.2、替换
命令 | 作用 |
---|---|
:s/old/new |
替换当前行第一个 old |
:s/old/new/g |
替换当前行所有 old |
:%s/old/new/g |
替换全文所有 old |
:%s/old/new/gc |
替换全文并每次确认 |
4、分屏与窗口管理
4.1、分屏操作
快捷键 | 作用 |
---|---|
:sp |
水平分屏 |
:vsp |
垂直分屏 |
Ctrl+w h/j/k/l |
跳转到左/下/上/右窗口 |
Ctrl+w w |
循环切换窗口 |
Ctrl+w c |
关闭当前窗口 |
Ctrl+w o |
关闭其他窗口 |
4.2、窗口调整
快捷键 | 作用 |
---|---|
Ctrl+w + |
增加窗口高度 |
Ctrl+w - |
减少窗口高度 |
Ctrl+w > |
增加窗口宽度 |
Ctrl+w < |
减少窗口宽度 |
Ctrl+w = |
所有窗口等宽等高 |
五、宏与批量操作
快捷键 | 作用 |
---|---|
qa |
开始录制宏到寄存器 a |
q |
停止录制 |
@a |
执行寄存器 a 的宏 |
@@ |
重复执行上一次宏 |
:normal @a |
对选中行执行宏 a |
- 按 qa 开始录制 → 执行操作(如 dd 删除行)→ 按 q 结束录制
- 执行 @a 重复删除操作
六、效率技巧
组合操作:
dap
:删除整个段落cis
:修改当前句子
文本对象:
viw
:选中当前单词vip
:选中当前段落
重复操作:
10j
:向下移动 10 行5dd
:删除 5 行
七、操作符
Vim 的操作符遵循 "操作符 + 动作 = 操作" 的模式:
[次数] 操作符 [范围/文本对象]
例如:d2w 表示 “删除 2 个单词”。
7.1、内置操作符
操作符 | 作用 | 示例 | 说明 |
---|---|---|---|
d |
删除 (Delete) | dw 删除单词 |
内容会存入寄存器,可粘贴 |
y |
复制 (Yank) | y$ 复制到行尾 |
配合 p /P 粘贴 |
c |
修改 (Change) | ciw 修改当前单词 |
删除后自动进入插入模式 |
~ |
大小写切换 | ~ 切换当前字符 |
支持视觉模式选区 |
g~ |
反转选区大小写 | g~iw 反转单词 |
|
gu |
转为小写 | guw 单词转小写 |
|
gU |
转为大写 | gUw 单词转大写 |
|
> |
增加缩进 | >j 下一行缩进 |
通常结合 >> 缩进整行 |
< |
减少缩进 | <k 上一行缩进 |
通常结合 << 取消缩进整行 |
= |
自动缩进 | =ap 段落自动缩进 |
需设置 filetype indent on |
! |
通过外部命令过滤 | !}sort 段落排序 |
调用 sort 命令处理选区 |
gq |
文本重排 (Format) | gqap 重排段落 |
依赖 textwidth 设置 |
z |
折叠操作 | zfap 创建段落折叠 |
需启用折叠功能 |
7.2、操作符 + 文本对象(高效组合)
基础文本对象:
文本对象 | 作用 | 示例 | 说明 |
---|---|---|---|
iw |
当前单词 (inner word) | diw 删除单词 |
不包括空格 |
aw |
当前单词 + 空格 | daw 删除单词 |
包括相邻空格 |
i" |
引号内内容 | ci" 修改引号内容 |
光标需在引号间 |
a" |
引号及内容 | da" 删除引号及内容 |
|
i( / i) |
括号内内容 | di( 删除括号内容 |
适用于 [] , {} , <> 等 |
a( / a) |
括号及内容 | da( 删除括号及内容 |
高级文本对象:
文本对象 | 作用 | 示例 | 说明 |
---|---|---|---|
ip |
段落 (inner paragraph) | dip 删除段落 |
需设置 :set paragraph= |
ap |
段落 + 空行 | yap 复制段落 |
|
is |
句子 (inner sentence) | cis 修改句子 |
以 .!? 结尾为句子 |
as |
句子 + 空格 | das 删除句子 |
7.3、操作符进阶技巧
跨行操作:
d/pattern<CR> " 删除直到匹配 pattern 的位置
y?error<CR> " 复制到上一个 "error" 出现处
寄存器指定:
"aD " 删除到行尾并存入寄存器 a
"+yiw " 复制当前单词到系统剪贴板
重复操作符:
.. " 重复上一次修改(包括操作符动作)
& " 重复最近的 `:s` 替换操作
视觉模式配合:
用 v/V/Ctrl+v 选择区域
按操作符(如 d/y/>)执行
7.4、自定义操作符
通过 map-operator 创建自定义操作符(需 Vim 7.4+):
高亮选区:
" 定义操作符(输入 \h 高亮选区)
vnoremap <silent> <leader>h :<C-U>call HighlightSelection()<CR>
function! HighlightSelection()
execute "'<,'>s/\\%V\$.*\$\\%V/\\1/"
echom "选区已高亮"
endfunction
base64编码:
" 输入 \b 对选区进行 Base64 编码
vnoremap <silent> <leader>b :<C-U>call Base64Encode()<CR>
function! Base64Encode()
execute "'<,'>!base64"
endfunction
八、文本对象
文本对象是 结构化文本片段(如单词、句子、括号内容等),通过 操作符 + 文本对象
或 可视化模式 + 文本对象
实现高效操作。
语法:
i
+ 对象 → 操作 内部(不包含边界符号,如引号/括号)a
+ 对象 → 操作 整体(包含边界符号)
8.1、内置文本对象
基础对象:
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
iw /aw |
单词 (word) | diw 删除单词 |
aw 包含相邻空格 |
iW /aW |
大单词 (WORD) | ciW 修改连续非空白字符 |
以空格为分隔 |
is /as |
句子 (sentence) | yas 复制句子 |
以.!? 结尾为界 |
ip /ap |
段落 (paragraph) | dap 删除段落 |
以空行为分隔 |
i" /a" |
双引号内容 | ci" 修改引号内文本 |
适用于 ' ` `等同类符号 |
i( /a( |
括号内容 (圆括号) | di( 删除括号内内容 |
同样适用于 [] {} <> |
标签对象(HTML/XML):
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
it /at |
标签内部/整个标签 | cit 修改标签内容 |
需光标在标签内 |
i> /a> |
尖括号内容 | yi> 复制标签属性 |
适用于 <div class="..."> |
其它对象:
文本对象 | 作用范围 | 示例 | 说明 |
---|---|---|---|
i{ /a{ |
花括号块 (代码块) | va { 选中整个代码块 |
适用于 if /for 等代码块 |
i/a 缩进块 (indent) |
>i 增加缩进块 |
需开启 :set indentkeys |
|
i /a |
函数参数 (argument) | cia 修改函数参数 |
需插件如 vim-textobj-parameter |
8.2、操作符+文本对象
高效编辑:
ci" " 修改双引号内的内容(自动进入插入模式)
da{ " 删除花括号及内部代码块(包括换行)
yip " 复制当前段落
>ap " 增加段落缩进
复杂嵌套场景:
<!-- 修改嵌套标签内容 -->
<div>
<span>|光标在这里|</span>
</div>
cit
→ 修改<span>
内容dat
→ 删除整个<span>
标签2cit
→ 修改外层<div>
内容(需插件支持层级跳转)
8.3、自定义文本对象
基础自定义(.vimrc):
" 定义 XML 属性文本对象(选中 class="...")
xnoremap <silent> ix :<C-U>call SelectXMLAttr()<CR>
function! SelectXMLAttr()
execute "normal! /\\s\\w\\+=\\s*[\"']\\<CR>v/\\s\\w\\+=\\s*[\"']\\>\\zs<CR>"
endfunction
使用:vix 选中当前 XML 属性值。
通过插件扩展:
vim-textobj-user:创建自定义文本对象的框架
示例:定义 if 条件语句为文本对象:
call textobj#user#plugin('condition', {
\ 'if': {
\ 'select-a': 'aif',
\ 'select-i': 'iif',
\ 'pattern': '\<if\>.\{-}\<endif\>',
\ },
\ })
使用:diif 删除 if 条件块内容。
8.4、插件增强文本对象
vim-surround:
操作 | 效果 |
---|---|
ds" |
删除周围双引号 |
cs"' |
将双引号改为单引号 |
ysiw] |
给单词添加 [] 包围 |
vim-indent-object:
文本对象 | 作用 |
---|---|
ii /ai |
操作相同缩进层级的内容 |
dii " 删除当前缩进块(保留父级)
vim-textobj-line:
文本对象 | 作用 |
---|---|
il /al |
操作整行(非空白部分/全行) |
yal " 复制整行(包括换行符)
8.5、使用技巧
快速修复JSON键名:
{ "old_name": "value" }
光标定位到键名 → ci"new_name → 快速修改键名
代码块操作:
def foo():
|光标在这里|
return True
di → 删除函数体(需 indent 文本对象支持)
选取扩展:
在可视化模式中:
按 i 或 a 后输入文本对象(如 i")可动态调整选区范围
九、动作
动作是 移动光标或选择文本 的命令,可与 操作符(如 d/y/c)或 可视化模式 组合使用。
- 语法:[次数] + 动作
- 例如:d2w → 删除 2 个单词,v3j → 向下选择 3 行。
9.1、基础动作
字符级移动:
动作 | 作用 | 示例 |
---|---|---|
h |
左移 | dl 删除右侧字符 |
l |
右移 | ch 修改左侧字符 |
k |
上移 | 5k 上移 5 行 |
j |
下移 | vj 选择当前和下一行 |
单词级移动:
动作 | 作用 | 示例 |
---|---|---|
w |
跳到下一个单词开头 | dw 删除到下一单词 |
b |
跳到上一个单词开头 | cb 修改上一单词 |
e |
跳到当前单词末尾 | ge 跳到前一单词末尾 |
行级移动:
动作 | 作用 | 示例 |
---|---|---|
0 |
跳到行首 | d0 删除到行首 |
^ |
跳到行首非空白字符 | y^ 复制到行首 |
$ |
跳到行尾 | c$ 修改到行尾 |
+ |
跳到下一行首 | v+ 选择两行 |
- |
跳到上一行首 | d- 删除上一行 |
屏幕滚动:
动作 | 作用 |
---|---|
H |
跳到屏幕顶部(High) |
M |
跳到屏幕中间(Middle) |
L |
跳到屏幕底部(Low) |
Ctrl+u |
上翻半屏 |
Ctrl+d |
下翻半屏 |
9.2、高级动作技巧
搜索跳转:
动作 | 作用 | 示例 |
---|---|---|
f{char} |
跳到当前行下一个 {char} | df. 删除到句点 |
F{char} |
跳到当前行上一个 {char} | yF, 复制到逗号 |
t{char} |
跳到 {char} 前一个字符 | ct" 修改到引号前 |
/{pattern} |
全局搜索 | d/end<CR> 删除到 “end” |
标记跳转:
动作 | 作用 |
---|---|
m{a-z} |
设置标记(如 ma) |
`a | 精确跳转到标记 a |
'{a-z} |
跳到标记行的行首 |
代码块跳转:
动作 | 作用 | 示例 |
---|---|---|
% |
匹配括号跳转 | d% 删除括号间内容 |
[[ |
跳到上一个函数开头 | y[[ 复制函数 |
]] |
跳到下一个函数开头 | v]] 选择函数 |
9.3、动作+操作符
经典组合:
d2w " 删除 2 个单词
ci( " 修改括号内内容
yG " 复制到文件末尾
>} " 增加缩进到段落末尾
跨行操作:
d/function<CR> " 删除直到 "function" 出现处
y?end<CR> " 复制到上一个 "end" 位置
精准选区:
v3e " 选择当前单词和后 2 个单词(共 3 个)
vat " 选择整个 XML/HTML 标签
9.4、自定义动作
映射组合动作(.vimrc):
" 快速跳转到行尾并插入分号
nnoremap <leader>; A;<Esc>
通过插件扩展:
vim-easymotion:快速跳转到任意位置
<leader><leader>w " 高亮显示所有单词首字母,按字母跳转
vim-sneak:增强 f/t 动作
sxy " 跳转到下一个 "xy" 出现处
9.5、使用示例
快速修复代码:
def calculate(a, b):
result = a * b # |光标在此|
return result
- ciwsum → 修改 result 为 sum
- f(di( → 删除函数参数
批量缩进:
>j " 下一行增加缩进
3>> " 当前行和下两行缩进
跨文件标记:
- 在关键位置设置标记:mA
- 在其他文件跳回:`A