进入插入模式
NORMAL–>INSERT
1. 光标前插入 i
2. 光标后插入 a
3. 在下面新建一行插入 o
4. 在行首插入 I
5. 在行尾插入 A
6. 在上面新建一行插入 O
7. 快速回到后一次编辑的地方,并进入插入模式 gi
进入视图模式
NORMAL–>VISUAL
1. 批量选择字符 v (VISUAL)
2. 批量选择整行 V (VISUAL LINE)
3. 批量选择区块 ctrl+v (VISUAL BLOCK)
进入普通模式
INSERT–>NORMAL
1. ESC
2. ctrl+c (不推荐)
3. ctrl+[ (常用备选)
4. 自定义映射
进入命令模式
NORMAL–>COMMAND
1. 冒号 :
2. 正斜杠 /
3. 问号 ?
分屏
COMMAND
1. 竖分屏 :vs
2. 横分屏 :sp
vs--vertical split
sp--split
替换
COMMAND
全局替换 :% s/before/after/g
g--global
界面操作
COMMAND
设置行号 :set nu
快速排错
INSERT
1. 删除上一个字符 ctrl+h
2. 删除上一个单词 ctrl+w
3. 删除当前行 ctrl+u
快速移动
NORMAL
1. 移动到下一个以非空格分隔的单词开头 w
2. 移动到下一个以空格分隔的单词开头 W
3. 移动到下一个以非空格分隔的单词结尾 e
4. 移动到下一个以空格分隔的单词结尾 E
5. 移动到上一个以非空格分隔的单词开头 b
6. 移动到上一个以空格分隔的单词开头 B
行间搜索移动(当前行范围内)
NORMAL
1. 向后跳转到要查找的字符上 f+char
2. 向后跳转到要查找的字符前面 t+char
3. 向前跳转到要查找的字符上 F+char
<分号; 跳到下一个结果>|<逗号,跳到上一个结果>
水平移动
NORMAL
1. 移动到行首第一个字符 0
2. 移动到行尾后一个字符 $
3. 移动到行首第一个非空字符 ^
4. 移动到行尾后一个非空字符 g_
垂直移动
NORMAL
1. 移动到上一句 (
2. 移动到下一句 )
3. 移动到上一段落 {
4. 移动到下一段落 }
页面移动
NORMAL
1. 移动到整个文件开头 gg
2. 移动到整个文件结尾 G
3. 返回到上一个位置 ctrl+o
4. 跳转到屏幕开头 H
5. 跳转到屏幕中间 M
6. 跳转到屏幕结尾 L
7. 向上翻页 ctrl+u
8. 向下翻页 ctrl+f
9. 将当前行置于屏幕正中间 zz
快速增删改查
增:
INSERT
直接写入内容
删:
NORMAL
1. 删除一个字符 x
2. 删除一个单词 dw/daw
3. 删除一个单词保留空格 diw
4. 删除当前行 dd
5. 删除到char之前 dt+char
d和x可以配合数字多次执行
VISUAL
视图模式配合x/d 实现批量删除
改:
NORMAL
1. 替换一个字符 r
2. 不断向后替换字符 R
3. 删除一个字符,并进入INSERT模式 s
4. 删除整行,并在行首进入INSERT模式 S
5. 删除一个单词,并进入INSERT模式 cw/caw
6. 删除整行,并在光标处进入INSERT模式 C
7. 删除一个单词,保留空格,并进入INSERT模式 ciw
8. 删除到char前,并进入INSERT模式 ct+char
查:
COMMAND
1. 向后搜索 /
2. 向前搜索 ?
NORMAL
3. 下一个结果 n
4. 上一个结果 N
5. 当前单词的下一个位置 *
6. 当前单词的上一个位置 #
搜索替换
COMMAND
替换命令 :<range> s /before/after/<flags>
替换范围<range>
% 全部
start,end 从第start行开始,匹配到end行结束
替换标志<flags>
g 全局范围内执行替换
c 交互执行,确认是否执行y/n
n 不替换,只统计匹配到的次数
正则匹配
:% s/\<before\>/after/g
多文件操作
- Buffer 打开的一个文件的内存缓冲区
1. Vim打开一个文件后会加载内容到缓冲区
2. 所有修改针对缓冲区,并不会直接保存到文件
3. 使用:w命令,才会把修改写入文件
4. 使用:ls列举当前缓冲区,使用:b n跳转到第n个缓冲区
5. :bpre上一个 :bnext下一个 :bfirst第一个 :blast后一个
6. :b 缓冲区名称(可用tab补全)
7. 打开不同的缓冲区 :e 文件名
- Window 窗口 Buffer可视化的分割区域
1. 一个缓冲区可分割成多个窗口,每个窗口可以打开不同的缓冲区
2. 打开多个相同缓冲区,修改其中一个buffer会对所有的buffer生效
3. 水平分割(上下分屏) ctrl+w+s 或者 :sp
4. 垂直分割(左右分屏) ctrl+w+v 或者 :vs
5. 每个窗口可以无限的继续分割
切换窗口
1. <ctrl+w> +w 循环切换
2. <ctrl+w> +h 切换到左边窗口
3. <ctrl+w> +j 切换到下边窗口
4. <ctrl+w> +k 切换到上边窗口
5. <ctrl+w> +l 切换到右边窗口
移动窗口
1. <ctrl+w> +H 当前窗口移动到左边窗口
2. <ctrl+w> +J 当前窗口移动到下边窗口
3. <ctrl+w> +K 当前窗口移动到上边窗口
4. <ctrl+w> +L 当前窗口移动到右边窗口
- Tab 标签页 可以组织Window变成一个工作区
1. 容纳一系列窗口的容器,类似虚拟桌面
2. 使用较多不好管理,通常多开2个
----
1. 在新标签页中打开(edit)文件 :tabe 文件名
2. 将当前窗口移动到一个新的标签页 <ctrl+w> +T
3. 关闭(close)标签页和其中所有窗口 :tabc
4. 只保留(only)活动标签页,关闭其他标签页 :tabo
----
1. 切换到编号为N的标签页 :tabn N 或 Ngt
2. 切换到下一个标签页 :tabn 或 gt
3. 切换到上一个标签页 :tabp 或 gT
文本对象
Text Object
<number> + <command> + <text object>
次数 + 命令 + 文本对象
1. iw 选中单词不包括空格 inner
2. aw 选中单词和后边的空格 around
类推到 W,s,p对象中
基本文本对象:
w: word 单词([a-zA-Z0-9_])
W: WORD 字串(以空格分隔的单词)
s:sentence 句子
p:paragraph 段落
扩展文本对象:
() 圆括号代码块,显然对于编辑函数的参数,无论形参还是实参都很有用。
{} 用于编辑 C 系风格的代码块,非常合适。
[] 用于编辑数组或列表中的元素,非常合适。
<> 用于编辑比如 C++,Java 等的模板或者泛型参数,是非常合适。或者编XML(HTML)开始标签。
<tagName></tagName> 显然是用来编辑 XML(HTML)标签的。此文本对象以字符 t
表示。
i: 选中对象里的内容,但不包括对象本身
a: 选中对象里的内容和对象本身
举例:
i(或者i) 选中( )中的内容,不包括小括号
a(或者a) 选中( )中的内容和括号本身
复制粘贴
NORMAL
1. 复制 + 粘贴 y + p
2. 剪切 + 粘贴 d + p
3. 配合VISUAL批量复制粘贴
4. 配合文本对象复制粘贴单词和句子等
5. 复制一个单词yiw 复制一行 yy
INSERT
1. 复制 ctrl+c 粘贴ctrl+v
2. vimrc中设置了autoindent会导致粘贴格式出错
3. 使用:set paste和:set nopaste
寄存器
1. 默认使用d删除和y复制的内容放到"无名寄存器"
2. 使用x删除一个字符再用p粘贴,可以实现字符的调换
3. 前缀 "寄存器名 可以指定寄存器,不指定默认存到无名寄存器
举例: "ayiw 复制一个单词存放到寄存器a中
"bdd 删除当前行存放到寄存器b中
4. 查看寄存器中内容 :reg 寄存器名
5. 粘贴放在寄存器a,寄存器b中的内容 "ap "bp
6. 无名寄存器用""表示,大部分情况下省略不写
寄存器分类
1. 无名寄存器 ""(默认寄存器)
2. 有名寄存器 "[a-z]
3. 复制专用寄存器 "0 (使用y复制时,会同时拷贝到0号寄存器)
4. 系统的剪贴板 "+ (在Vim外粘贴复制内容,把外部内容粘贴进来)
命令:echo has('clipboard')输出1则支持系统剪贴板
5. 当前文件名 "%
6. 上次插入的文本 ".
:set clipboard=unnamed 可以直接复制粘贴系统剪贴板的内容
交互系统剪贴板时,注意:set paste 保证粘贴格式
宏macro
一系列命令的集合
用宏[录制]一系列操作,在使用场景[回放]
宏可以非常方便地把一系列命令用于多行文本
使用宏 NORMAL模式
录制:
使用q+字母,把宏存放在指定有名寄存器中
eg: 按qa开始录制 再按q结束录制,宏保存在寄存器a中
回放:
按@+字母 回放指定寄存器中的宏
eg: 录制完毕后,在其他行@a,重复对上一行的一系列命令
批量回放:
1. 先进入视图模式VISUAL批量选择
2. :normal @+字母 批量回放宏
: ctrl p 上一条命令
常见补全
1. 单词补全: ctrl+n
2. 文件名补全:ctrl+x后跟ctrl+f或者ctrl+xf
向下选择补全项 ctrl+n
向上选择补全项 ctrl+p
插入当前文件名 :r! echo %
插入当前文件完整路径 :r! echo %:p