概述
文章目录
- 一、文本对象
- 1.文本对象
- 2.位置标记
- 二、工作模式
- 1.普通模式
- (1)常用快捷键
- (2)动作命令
- d{motion}命令
- c{motion}命令
- y{motion}命令
- (3)移动命令
- 移动命令
- 基于单词的移动
- 字符查找命令
- 字符查找命令
- 查找命令
- (4)可重复的操作及如何回退
- 2.插入模式
- (1)插入-普通模式
- (2)替换模式
- 3.可视模式
- 4.命令行模式
- (1)[range]的几种表达方式
- (2)':t'命令与':m'命令
- (3)normal命令
- (4)命令行补全
- (5)将文本中单词插入命令行
- (6)回溯历史命令
- 命令行窗口
- (7)运行shell命令
- 三、文件类操作
- 1.管理多个文件
- (1)缓冲区列表
- (2)文件窗口操作
- 创建分割窗口
- 在窗口间切换
- 关闭窗口
- 打开及关闭标签页
- 在标签页间切换
- :edit命令
- :find命令
- 使用netrw管理文件系统
- 2.在多个文件间跳转
- (1)在文件间跳转
- (2)遍历改变列表
- 四、寄存器
- 1.复制与粘贴
- (1)寄存器
- (2)粘贴复制删除
- (3)粘贴复制删除过程中利用寄存器
- 2.宏
- (1)宏的录制
- (2)执行宏
- 用let实现累加操作
- (3)编辑宏
- 五、模式匹配
- 1.vim的正则匹配
- (1)调整查找模式的大小写敏感
- (2)正则匹配与文本原义匹配
- 正则匹配
- 原义匹配
- 常用正则匹配字符
- (3)界定单词与匹配的边界
- 界定单词的边界
- 界定匹配的边界
- (4)转义问题字符
- 用编程的方式转义字符
- 2.查找
- (1)查找的基本操作
- 执行一次查找
- 重复上一次查找
- 统计当前模式下的匹配个数
- 查找后将光标移动到查找匹配的结尾
- (2)vimrc中关于查找的设置
- 基本设置
- 可视模式下查找当前选择的文本
- 3.替换
- (1)替换的基本操作
- substitute语法
- 替换域中的特殊字符
- 标志位
- (2)substitute命令与寄存器
- 用寄存器内容替换
- 重复上一次替换操作
- submatch函数
- 4.global命令
- (1)global命令基本语法
- global!=vglobal命令
- global命令[cmd]的[range]使用
- (2)global命令与delete命令连用
- :g/{pattern}/d删除所有匹配的行
- :v/{pattern}/d只保留匹配行
- (3)gloabal命令与yank命令连用
- 六、工具
- 1.ctags工具
- (1)安装ctags
- 安装Exuberant Ctags
- 用ctags创建代码库索引
- (2)配置vim使用ctags
- 标签文件的路径
- 手动执行ctags
- 保存文件时自动执行ctags
- (3)标签跳转命令
- 2.自动补全
- (1)自动补全总结
- 字典中的单词自动补全
- 全能补全
- (2)自动补全的弹出式菜单交互命令
一、文本对象
1.文本对象
文本对象:基于结构定义的文本区域
文本对象字符由两个字符组成,第一个字符永远是a/i
i开头的文本对象会选择分隔符内部的文本
a开头的文本对象会选择分隔符在内的整个文本
即:i不包含边界,a包含边界
注:1.文本对象可结合可视模式使用(v—可视字符)
2.文本对象可结合动作命令d{motion}/c{motion}/y{motion}使用
文本对象 | 选择区域 |
---|---|
a)或ab | 一对圆括号 |
i)或ib | 一对圆括号内部 |
a}或aB | 一对花括号 |
i}或iB | 一对花括号内部 |
a] | 一对中括号 |
i] | 一对中括号内部 |
a> | 一对尖括号 |
i> | 一对尖括号内部 |
a’ | 一对单引号 |
i’ | 一对单引号内部 |
a" | 一对双引号 |
i" | 一对双引号内部 |
a` | 一对反引号 |
i` | 一对反引号内部 |
at | 一对XML标签<xml>tags</xml> |
it | XML标签内部 |
aw | 当前单词及一个空格 |
iw | 当前单词 注:单词由字母、数字、下划线,或其他非空白字符的序列组成,单词间以空白字符分隔,如:we‘re中包括we ’ re共三个单词 |
aW | 当前字串及一个空格 注:字串由非空白字符序列组成,字串间以空白字符分隔,如:we’re为一个字串 |
iW | 当前字串 |
as | 当前句子及一个空格 |
is | 当前句子 |
ap | 当前段落及一个空行 |
ip | 当前段落 |
注:一般说来,
d{motion}命令和aw,as,ap配合使用较好
c{motion}命令和iw,is,ip配合使用较好
2.位置标记
m{a-zA-Z}:用选定的字母(a-zA-Z,自己选择)标记当前光标所在位置
标记:
m{a-z}:小写字母标记,在每个缓冲区局部可见(同一文件中使用和跳转)
m{A-Z}:大写字母标记,全局可见(可通过文件标记,在不同文件之间跳转)
跳转:
`{a-zA-Z}:使用标记的字母进行跳转
ctrl+o:返回跳转之前的位置
小技巧
操作符 | 含义 |
---|---|
mm | 标记位置m |
`m | 跳回到标记处m所在位置 |
自动位置标记
位置标记 | 跳转到 |
---|---|
`` | 当前文件中上次跳转动作之前的位置 |
`. | 上次修改的地方 |
`^ | 上次插入的地方 |
`[ | 上次修改或复制的起始位置 |
`] | 上次修改或复制的结束位置 |
`< | 上次高亮选区的起始位置 |
`> | 上次高亮选区的结束位置 |
二、工作模式
1.普通模式
普通模式是vim的一般工作模式,是vim最常用模式。常见快捷键如下表:
(1)常用快捷键
常用使用操作符 | 含义 |
---|---|
. | 重复上次修改 注:修改是指vim一次操作 ,如:从普通模式进入插入模式(输入i)到返回普通模式(按<Esc>),vim会记录每一个按键操作。此时再使用.命令,会重复执行所有操作 |
x | 剪切 例如:vim普通模式下先输入x再输入.==>前后剪切两个光标下字符 |
u | 撤销上次修改 |
>G | 增加从当前行到文档末尾处的缩进层次 |
a | 当前光标字符后面插入 |
A | 当前行行尾插入 |
i | 当前光标字符前面插入 |
I | 当前行行首插入 |
0(数字0) | 将光标移动到当前行行首 |
^ | 将光标移动到当前行第一个非空白字符 |
$ | 将光标移动到当前行行尾 |
o(字母o) | 当前光标下一行插入 |
O | 当前光标上一行插入 |
s | 删除光标下字符并插入 注:该操作=cl/xi/dli |
S | 删除当前行并插入 注:该操作=cc/ddi |
G(=go) | 跳转到文档最后一行行首 |
3G | 跳转到第3行行首 |
gg | 跳转到当前文件的首行 |
ga | 显示光标处的字符编码(十进制/十六进制) |
zz | 重绘屏幕,把当前行显示在窗口正中 |
J | 将下一行补充到当前行尾 |
* | 正向查找相同单词 |
# | 反向查找相同单词 |
~ | 反转大小写(vimrc中set tildeop) |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 注:gUU 作用与当前行 |
> | 增加缩进 注:>>缩进当前行 |
< | 减少缩进 |
= | 自动缩进 注:=3 自动缩进当前光标行和之后3行 =G 自动缩进从光标位置到文件结尾的所有内容 |
% | 在匹配的括号及匹配的关键字之间跳转 |
(2)动作命令
注:三个动作命令应当结合《文本对象的选择》进行理解
d{motion}命令
d{motion}命令主要执行“删除”操作,作用为:删除指定的文本
常用操作符 | 含义 |
---|---|
dd | 删除光标所在行(当前行) |
db | 反向删除:删除从光标位置到单词开头(空格处)的字符 |
dl | 删除光标处字符 注:该操作=x |
dw | 删除从光标位置到单词结尾间的字符(包括空格) |
daw | 删除完整单词(包括空格) |
diw | 删除完整单词(不包括空格) |
dap | 删除整个段落(包括段落后的空一行) |
d3w | 删除从光标位置处共3个单词 |
注:iw和aw的区别见《文本对象的选择》
c{motion}命令
c{motion}命令主要执行“修改”操作,作用为:删除指定的文本,然后切换到插入模式
常用操作符 | 含义 |
---|---|
cc | 删除光标所在行并进入插入模式 注:该操作=S |
cb | 反向操作:删除从光标位置到单词开头(空格处)的字符并进入插入模式 |
cl | 删除光标处字符并进入插入模式 注:该操作=s |
cw | 删除从光标位置到单词结尾间的字符并进入插入模式(不会删除空格) |
caw | 删除完整单词并进入插入模式(包括空格) |
ciw | 删除完整单词并进入插入模式(不包括空格) |
cap | 删除整个段落(包括段落后的空一行) |
c3w | 删除从光标位置处开始的3个单词并进入插入模式 |
y{motion}命令
y{motion}命令主要执行“复制”操作,作用为:复制指定的文本
常用操作符 | 含义 |
---|---|
yy | 复制光标所在行 |
yb | 反向操作,复制从光标位置到单词开头之间(空格处)的字符 |
yl | 复制光标处字符 |
yw | 复制从光标位置到单词结尾间的字符(包括空格) |
yaw | 复制整个单词(包括空格) |
yiw | 复制整个单词(不包括空格) |
yap | 复制整个段落(包括段落后的空一行) |
y3w | 复制从光标位置处开始的3个单词 |
(3)移动命令
移动命令
上下左右四个按键行为
常用操作符 | 含义 |
---|---|
h/← | 光标向左移动 |
j/↓ | 光标向下移动 |
k/↑ | 光标向上移动 |
l(小写的L)/→ | 光标向右移动 |
实际行与屏幕行
实际行:文本中的行数
屏幕行:vim中(wrap缺省启动时)在当前屏幕显示不完时会自动回绕,即一行文本分两行显示。
如:
一行文本分两行显示,两行显示为屏幕行(第二行无number),一行文本为实际行(只有一个number)
常用操作符 | 含义 |
---|---|
j | 向下移动一个实际行 |
gj | 向下移动一个屏幕行 |
k | 向上移动一个实际行 |
gk | 向上移动一个屏幕行 |
0(数字0) | 移动到实际行行首 |
g0 | 移动到屏幕行行首 |
$ | 移动到实际行行尾 |
g$ | 移动到屏幕行行尾 |
^ | 移动到实际行的第一个非空白字符 |
g^ | 移动到屏幕行的第一个非空白字符 |
基于单词的移动
单词:由字母、数字、下划线或其他非空白字符的序列组成,单词间以空白字符分隔
字串:由非空白字符序列组成,字串间以空白字符分隔
如:we‘re中包括we ’ re共三个单词,一个字串
常用操作符 | 含义 |
---|---|
w | 正向移动到下一个单词的开头 |
b | 反向移动到当前单词/下一单词的开头 例如:we are,当光标位于a上,此时b让光标移动到w上;当光标位于r上,此时b让光标移动到a上 |
e | 正向移动到当前单词/下一单词的结尾 例如:you are,当光标位于y上,此时e让光标移动到u上;当光标位于u上,此时e让光标移动到e上 |
ge | 反向移动到上一单词的结尾 |
cw | 删除光标位置到单词结尾字符并进入插入模式 |
ea | 在当前单词/下一单词结尾添加 注:该操作可分解为(1)e:正向移动到当前单词/下一单词结尾(2)a:光标字符后面插入 |
gea | 在上一单词结尾添加 注:该操作可分解为(1)ge:反向移动到上一单词结尾(2)a:光标字符后面插入 |
W/B/E/gE | 对字串执行相同的操作 |
字符查找命令
字符查找命令
字符查找命令在当前行操作,查找单个字符
常用操作符 | 含义 |
---|---|
f{char} | 正向移动到下一个{char}所在之处,即:将光标移动到指定字符上 注:包括字符 |
F{char} | 反向移动到上一个{char}所在之处 注:包括字符 |
t{char} | 正向移动到下一个{char}所在之处的前一个字符上,即:直到查找到指定字符为止 注:不包括字符 |
T{char} | 反向移动到上一个{char}所在之处的后一个字符上 注:不包括字符 |
;(下一个) | 重复上一次的字符查找 注:配合f/F/t/T{char}使用 |
,(上一个) | 回退 注:配合f/F/t/T{char}使用 |
例如:
键入操作符 | 操作文本 | 备注 |
---|---|---|
I’ve been expecting you , Mister Bond. | 光标位于I | |
f, | I’ve been expecting you , Mister Bond. | 将光标移动到查找到字符, |
dt. | I’ve been expecting you . | 删除从当前光标处(,)到结尾(.)中间的字符 |
总结:
f{char}/F{char}在普通模式下更好用
t{char}/T{char}配合d{motion}/c{motion}/y{motion}更好用
查找命令
查找命令:/{motion}。查找命令在整个文本操作
查找命令的正向/反向移动:N(上一个)/n(下一个)
例如:
键入操作符 | 操作文本 | 备注 |
---|---|---|
This phrase takes time but eventually gets to the point. | 光标位于takes的t上 | |
d/ge<CR> 注:<CR>表示回车 | This phrase gets to the point. | 查找命令告诉d{motion}需要删除的内容,此时查找命令是个开动作 |
(4)可重复的操作及如何回退
目的 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {edit} | . | u |
在行内查找下一指定字符 | f{char}/t{char} | ;(下一个) | .(上一个) |
在行内查找上一指定字符 | F{char}/T{char} | ;(下一个) | .(上一个) |
在文档中查找下一处匹配项 | /<pattern> | n(下一个) | N(上一个) |
在文档中查找上一处匹配项 | ?<pattern> | n(下一个) | N(上一个) |
执行替换 | :s/target/replacement | & | u |
执行一系列修改 | qx{changes}q 注:录制宏,其中x表示寄存器x | @x | u |
2.插入模式
插入模式是vim输入文本的模式,类似vim的工作模式。
常用操作符 | 含义 |
---|---|
<C-p> 注:该符号表示ctrl+p,全文同 | 自动补全 注:自动补全详细内容见《6.2自动补全》 |
<C-h>/Backspace | 删除前一个字符 |
<C-w> | 删除前一个单词 |
<C-u> | 删除至行首 |
<Esc>/<C-[> | 切换到普通模式 |
<C-o> | 切换到插入-普通模式 |
<C-r>{register} | 在插入模式下进行文本复制 注:{register}详细内容见《4.寄存器》 |
<C-r>={表达式} 注:表达式为数学表达式 | 在光标处插入表达式计算结果 |
<C-v>{code} 注:code为三位数字 | 以十进制字符编码插入字符 如:{code}=123表示字符“{” |
<C-v>u{code} 注:code为四位数字 | 以十六进制字符编码插入字符 如:{code}=0078表示字符“{” |
<C-v>{nondigit} 注:nondigit为非数字键 | 按原义插入非数字字符 如:{nondigit}={表示字符“{” |
<C-k>{char1}{char2} | 插入以二合字母{char1}{char2}表示的字符 注:二合字母查阅::h digraphs-default :h digraph-table |
例如:插入模式下的文本复制
键入操作 | 文本 | 备注 |
---|---|---|
line one,line two line three | 将line one补在文本最后一行 | |
普通模式下yt, | line one,line two line three | 复制line one |
普通模式下jA (空格) | line one,line two line three (光标处) | 将光标移动到第二行末尾,进入插入模式,键入空格 |
插入模式下键入<C-r>0(数字0) | line one,line two line three (上一次光标处)line one(新光标处) | 在光标处粘贴文本 |
(1)插入-普通模式
插入-普通模式:在插入模式下能够执行一次普通模式。即在插入-普通模式下,执行完一次普通模式命令后自动回到插入模式。在插入模式下使用ctrl+o切换到插入-普通模式。
小技巧
操作命令 | 含义 |
---|---|
<C-o>zz | 进入插入-普通模式,调整屏幕显示(将当前行显示在屏幕中间),然后回到插入模式 注:可以不受中断的继续编辑 |
(2)替换模式
常用操作符 | 含义 |
---|---|
R | 由普通模式进入替换模式 |
<Insert>键 | 在替换模式和插入模式间切换 |
r{char} | 替换一个字符。{char}为要替换的字符,替换完后马上切回到普通模式 |
3.可视模式
可视模式下进行文本操作很方便
常用操作符 | 含义 |
---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
<C-v> | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
o | 切换高亮选区的端点 注:高亮选区的范围由其两个端点界定。其中一端固定,而另一端可以随光标自由移动,用o键可以切换活动端点 |
U | 可视模式下,将选中的字符转换为大写 注:同普通模式下的gU |
c | 可视模式下,删除高亮区域并进入插入模式 |
d | 可视模式下,删除高亮区域 |
$ | 可视列块模式下,vim能自动选择所有列最末尾的字符 |
i/a | 可视模式下不可用,使用I/A进行插入 |
$在列块操作下非常有用,例如:
键入操作 | 文本 | 备注 |
---|---|---|
line one line three line four | 给每行文本末尾加; | |
<C-v>jj$ | line one line three line four | <C-v>:进入可视模式 jj:选择当前光标下以及后两行文本 $:选择到高亮区域每行末尾 |
A; | line one ; line three line four | 行尾加; |
<Esc> | line one; line three; line four; | 每行文本末尾均加; 光标回到最开始的位置 |
4.命令行模式
(1)[range]的几种表达方式
很多Ex命令可用[range]指定要操作的范围,有如下几个方法:
(1)行号 , :1==> 文件开头 :2==>文件第二行 :$==>文件末尾
如: :1p ==>将一行打印 ,其中:p为:print的简写
(2)用地址指定一个范围,格式为::{start},{end}
如::2,5p==>将文件第二行到第五行打印
注:符号.代表当前地址,则:.,$p==>将当前位置到文件末尾间的所有行打印
注:符号%代表当前文件中的所有行,则::%p=:1,$p==>将整个文件打印
(3)用高亮选区指定范围
如:a.先执行2G(跳转到第二行行首),再执行VG(可视行选中当前位置到文件末尾)
b.输入 : (命令行会出现’<,‘>)
c.再输入Ex命令,如:’<,'>p(高亮区域均被打印)
(4)用模式(正则匹配)指定范围,格式为::{模式1},{模式2}
(5)用偏移地址进行修正,格式为::{address}+n,其中{address}为指定的起始位置处,n为偏移地址
如::.,+3p==>打印从光标位置开始后的3行内容
总结
常用操作符 | 地址 |
---|---|
1 | 文件第一行 |
$ | 文件最后一行 |
0(数字0) | 虚拟行,位于文件第一行的上方 |
. | 光标所在行 |
'm | 包含位置标记m的行 |
'< | 高亮选区的起始行 |
'> | 高亮选区的结束行 高亮选区内容通过’<,'>记录 |
% | 文件所有行 %=:1,$ |
@: | 重复上次的Ex命令 @:对应的回退命令为<C-o> |
:& | 重复上一次的替换操作 :&在重复上一次的:s命令时会忽略:s命令的标志位,具体使用方法参考《5.3替换》 |
(2)‘:t’命令与’:m’命令
:t=:copy 用法::[range]t{address},即将[range]内容复制到{address}下
命令 | 含义 |
---|---|
:6t. | 将第6行的内容复制到当前行下方 |
:t6 | 将当前行的内容复制到第6行下方 |
:t. | 复制当前行 注:同yy |
:t$ | 将当前行的内容复制到文件末尾 |
:‘<,’>t0 | 将高亮区的内容复制到文件开头 |
:m命令为移动命令 用法::[range]m{address},即将[range]内容移动到{address}下
命令 | 含义 |
---|---|
:6m. | 将第6行的内容移动到当前行下方 |
:m6 | 将当前行的内容移动到第6行下方 |
:m. | 复制当前行 注:同yy |
:m$ | 将当前行的内容移动到文件末尾 |
:‘<,’>m0 | 将高亮区的内容移动到文件开头 |
:‘<,’>m$ | 将高亮区的内容移动到文件末尾 该操作=普通模式下dGp:d:剪切当前行内容,G:跳转到文件末尾,p:粘贴内容 |
(3)normal命令
normal命令使得在命令行模式下,在指定范围内执行普通模式命令
注:在执行普通命令模式之前,vim会先把光标移动到该行的起始处
常见操作符 | 含义 |
---|---|
:‘<,’>normal . | 对高亮选区中的每一行,对其执行普通模式下的.命令 |
:.,.+7normal A( ); | 对当前行及以后七行行尾插入( ); |
:%normal A; | 对文本所有行行尾插入; |
:%normal i// | 对文本所有行行首添加// Verilog中为,注释掉多有行 |
:‘<,’>normal @q | 对高亮区中的每一行执行宏q |
(4)命令行补全
在需要打开多个文件时,命令行自动补全行为为自动补全路径提供了方便
注:命令行自动补全参考《6.2自动补全》
按键 | 含义 |
---|---|
<Tab> | 多次按<Tab> 键,会依次显示补全列表 使用 :e ./…/或:tabe ./…/时,使用<Tab>补全路径 |
<S-Tab> =shift+Tab | 反向遍历补全列表 <Tab>键正向遍历补全列表 |
(5)将文本中单词插入命令行
<C-r>命令 | 含义 |
---|---|
<C-r><C-w> | 复制光标处的单词插入命令行 |
<C-r><C-a> | 复制光标处的字串插入命令行 |
<C-r>/ | 粘贴上次查找内容到命令行 |
<C-r>{register} | 粘贴寄存器中的内容到命令行 {register}内容参考《4.寄存器》 |
例如:
键入操作 | 文本 | 备注 |
---|---|---|
line one,line two,line three,line four | 将所有的line替换为counter | |
* | line one,line two,line three,line four | 标亮所有的line,光标跳转至下一处line |
ciwcounter<Esc> | line one,counter two,line three,line four | 用counter替换掉光标下的line |
:%s//<C-r><C-w>/g //:模式*记录了查找历史line <C-r><C-w>:复制光标下单词counter /g:替换符的标志位,“所有”的意思 | counter one,counter two,counter three,counter four | 用counter替换掉所有的line |
该操作在vimrc中也可以使用到:
在需要查阅某种设置时,将光标移动到该设置上,输入: h <C-r><C-w>获取帮助
(6)回溯历史命令
(1):进入命令行模式,按Up/Down键进行命令回溯。缺省情况下,记录20条命令。
:hl+Up/Down键,只有以单词hl开头的Ex命令才会包含在列表中
:set history=200 命令行模式下保持的历史Ex命令
(2)/查找提示符,Up/Down遍历历史查找记录
(3)命令行窗口 q: 进入Ex历史命令的命令行窗口
命令行窗口
命令行窗口为vim的历史命令缓冲区,该缓冲区中不只包含Ex命令,包括vim中所有执行的命令。使用k/j可以向上向下移动,也可以通过使用vim查找功能查找某一行命令。打开命令行窗口的几种方式为:
命令 | 动作 |
---|---|
q/ | 打开查找命令历史的命令行窗口 |
q: | 打开Ex命令历史的命令行窗口 |
<C-f> | 从命令行模式切换到命令行窗口 |
(7)运行shell命令
命令 | 用途 |
---|---|
:shell | 启动一个shell(输入exit返回vim) |
:!{cmd} | 在shell中执行{cmd} |
:read !{cmd} | 在shell中执行{cmd},并把其标准输出插入到光标下方 |
:[range]write !{cmd} | 在shell中执行{cmd},以[range]作为其标准输入(shell命令的输入操作范围) |
:[range] !{filter} | 使用外部程序{filter}过滤指定的[range] |
几个执行的例子为:
三、文件类操作
1.管理多个文件
(1)缓冲区列表
命令 | 含义 |
---|---|
:ls | 列出所有被载入到内存中的缓冲区列表 %:指明哪个缓冲区在当前窗口可见(即表明当前的显示文件) #:不表示轮换文件 |
<C-^> | 在当前文件和轮换文件间快速切换 |
:bp | 缓冲区列表反向移动 |
:bn | 缓冲区列表正向移动 |
:bfirst | 跳转到缓冲区列表的开头 |
:blast | 跳转到缓冲区列表的结尾 |
:buffer N | 跳转到"N"缓冲区 N为缓冲区编号,系统自动编号,用ls可查看 |
:argdo | 对缓冲区列表内的所有缓冲区执行一条Ex命令 :argdo write 保存参数列表中的全部文件 |
:bufdo | :ls列出的所有缓冲区上执行一条Ex命令 |
:wall | 保存参数列表中的全部文件 与wnext的区别,wnext为先运行write命令,再运行next命令 |
:bd | 删除缓冲区 如:5,10bd删除编号5-10的缓冲区 |
:w | 把缓冲区内容写入磁盘 |
:e! | 把磁盘文件内容读入缓冲区(即回滚所在的修改) |
:qa! | 关闭所有窗口,摒弃修改而无需警告 |
:wa! | 把所有改变的缓冲区写入磁盘 |
:update | 保存文件,只有在文件发生改动时,才会被执行 |
(2)文件窗口操作
创建分割窗口
操作符 | 含义 |
---|---|
<C-w>s | 水平切分窗口 |
<C-w>v | 垂直切分窗口 |
:split {file} 简写 :sp {file} | 水平切分当前窗口,并在新窗口载入{file} |
:vsplit {file} 简写 :vsp {file} | 垂直切分当前窗口,并在新窗口载入{file} |
在窗口间切换
操作符 | 含义 |
---|---|
<C-w>w | 在窗口间循环切换 |
<C-w>h | 切换到左边的窗口 |
<C-w>j | 切换到下边的窗口 |
<C-w>k | 切换到上边的窗口 |
<C-w>l(小写L) | 切换到右边的窗口 |
关闭窗口
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:clo=:q | <C-w>c | 关闭活动窗口 |
:on | <C-w>o | 只保留活动窗口,关闭其他所有窗口 |
打开及关闭标签页
操作符 | 含义 |
---|---|
:tabe {filename} | 在新标签页中打开{filename} |
<C-w>T | 把当前窗口移到一个新的标签页 |
:tabc | 关闭当前标签页及其中的所有窗口 |
:tabo | 只保留活动标签页,关闭其他标签页 |
在标签页间切换
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:tabn {N} | {N}gt | 切换到编号为N的标签页 注:1.标签页的编号和缓冲区编号不一样 2.标签页的编号按照顺序进行编号 3.缓冲区的编号由系统进行编号,用:ls命令可查询缓冲区编号 |
:tabn | gt | 切换到下一标签页 |
:tabp | gT | 切换到上一标签页 |
:tabemove [N] 重新排列标签页 | – | 当[N]==0时,当下标签页移动到开头(标签页开图) 当无N时,标签页移动到最后 |
:edit命令
操作方法 | 含义 |
---|---|
:e {文件绝对路径} | 按照文件的绝对路径打开文件 |
:e %<Tab> | 按照活动缓冲区的完整路径打开文件 %代表活动缓冲区的完整文件路径 |
:e %:h<Tab> | 去掉当前活动缓冲区文件名 :h修饰符会去除文件名,但保留路径中的其他部分 |
注::e在当前标签页打开文件; :tabe在新的标签页打开文件
:find命令
:find 打开文件(无需输入路径)直接打开,需要设置查找目录
vimrc中设置
:set path+=查找目录/**
通配符在此处指查找目录下的各个子目录
使用netrw管理文件系统
通过该方法可以查看目录内容
Ex命令 | 缩写 | 用途 |
---|---|---|
:edit. | :e. | 打开文件管理器,并显示当前工作目录 |
:Explore | :E | 打开文件管理器,并显示活动缓冲区所在目录 该操作=:e. |
:split. | : s. | 水平打开文件当前工作目录 该操作=:S |
:vsplit. | :vsp. | 垂直打开文件当前工作目录 |
上述四个Ex命令均会覆盖当前活动区
操作符 | 含义 |
---|---|
<C-^> | 返回之前工作区 |
<C-g> | 显示当前文件的文件名及状态 |
2.在多个文件间跳转
(1)在文件间跳转
跳转动作 | 用途 |
---|---|
[count]G | 跳转到指定的行号 |
/pattern<CR> | 跳转到下一个模式出现之处 |
?pattern<CR> | 跳转到上一个模式出现之处 |
n | 跳转到下一个模式出现之处 |
N | 跳转到上一个模式出现之处 |
% | 跳转到匹配的括号所在之处 |
( | 跳转到上一句的开头 |
) | 跳转到下一句的开头 |
{ | 跳转到上一段的开头 |
} | 跳转到下一段的开头 |
H/M/L | 跳转到屏幕最上方/正中间/最下方 |
gf | 跳转到光标下的文件名(类似超链接) |
<C-]> | 跳转到光标下关键字的定义之处 |
'{mark} | 跳转到一个位置标记 |
<C-o> | 返回上一次打开的文件 |
<C-i> | 与<C-o>相反命令 <C-o>与<C-i>在当前活动窗口的跳转列表范围内进行跳转 |
(2)遍历改变列表
操作符 | 含义 |
---|---|
g;/g, | 反向/正向遍历改变列表 g;改变列表,在列表中反向查找,即:跳转到上次文档中更改的地方 '.回到上次修改的地方 |
gi | 恢复上次改变的地方,即光标移动到上次修改的地方,并进入插入模式 |
`^ | 光标移动到上次修改的地方 |
gf 可记忆为:go to file | 类似超链接 跳转后,可使用<C-o>返回原文件 |
gf命令操作例子
如:`include one.v
gf命令:此时文件将会跳转到one.v文件
四、寄存器
1.复制与粘贴
(1)寄存器
无名寄存器:"
有名寄存器:"a-“z
通过”{register}(register=a-zA-Z)指定要用的寄存器
注:用小写字母引用有名寄存器,会覆盖该寄存器的原有内容
用大写字母引用有名寄存器,会将新内容添加到该寄存器的原有内容之后
寄存器 | 内容 |
---|---|
" | 无名寄存器 注:缺省情况下,x/s/d{motion} /y{motion}都会覆盖无名寄存器的内容 |
"0 | 复制专用寄存器 注:仅当使用y{motion}命令时,该寄存器才会被赋值,"0p=粘贴上一次复制命令所复制的内容 |
"+ | x11剪切板,用剪切、复制与粘贴命令操作 注:(1)当在外部程序中用剪切或复制命令获取了文本,通过"+p(普通模式)/<C-r>+(插入模式)将其粘贴到Vim内部 (2)在Vim中的复制/删除/剪切命令使用"+,可以将Vim中的文本粘贴到其他应用程序 |
"=(普通模式) <C-r>=(插入模式) | 表达式寄存器 注:该寄存器后,Vim切换回命令行模式,并显示提示符“=”,这时我们可以输入一段Vim脚本表达式并按<CR>执行,如果返回的是字符串,Vim会使用它 |
"% | 当前文件名 |
"# | 轮换文件名 |
". | 上次插入的文本 |
": | 上次执行的Ex命令 |
"/ | 上次查找的模式 |
X11剪贴板的功能可在编译时被激活或禁用。可通过以下方式查阅自己Vim中X11剪贴板是否激活
(1):verison
(2)/xterm_clipboard
如果第二步前有个减号,表示不支持该功能,加号表示此功能被激活
(2)粘贴复制删除
命令 | 作用 |
---|---|
p(put命令) | p:将内容粘贴到当前光标的后面 P:将内容粘贴到当前光标的前面 注:p/P粘贴动作完成后,光标位置移动到被粘贴文本的开头 |
gp | gp:将内容粘贴到当前光标的后面 gP:将内容粘贴到当前光标的前面 注:gp/gP粘贴动作完成后,光标位置移动到被粘贴文本的结尾 |
d | 删除(类似剪切,删除的内容会被放到无名寄存器) 注:_d{motion}才会执行真正删除操作,内容不会覆盖无名寄存器 |
c | 删除并插入 |
y | 复制 |
x | 剪切 |
可视模式下,粘贴命令p=删除+粘贴
例如:
键入操作 | 文本 | 备注 |
---|---|---|
line one,line two | ||
yiw | line one,line two | 复制单词one |
ww | line one,line two | 将光标移动到单词two的字符t上 |
ve | line one,line two | 进入可视模式并高亮选中单词two |
p | line one,line one | 该步操作类似与,先删除two,再粘贴one 此时被替换的文本two存在无名寄存器中 |
插入模式下的粘贴命令<C-r>
命令 | 内容 |
---|---|
<C-r>" | 粘贴无名寄存器的内容 |
<C-r>0 | 粘贴复制专用寄存器的内容 |
面向行的复制或删除操作:dd/yy/dap
面向字符的复制或删除操作:x/diw/das
(3)粘贴复制删除过程中利用寄存器
例子 | 内容 |
---|---|
"ay$ | 将光标所在行的末尾词符复制进寄存器a中 |
"ayiw | 将光标下的单词复制到寄存器a中 |
"bdd | 将光标下的当前行剪切到寄存器b中 |
"ap | 粘贴来自寄存器a的内容 |
"bp | 粘贴来自寄存器b的内容 |
2.宏
(1)宏的录制
q{register}:{register}=a-z为寄存器名字
第一次按下q:开始录制
第二次按下q:停止录制
注:{register}为大写字母时,表示在小写字母宏的后面继续添加内容。如:在宏a后添加按键操作,输入qA,在之前录制的宏中继续添加操作(该方法只能在结尾添加)
(2)执行宏
命令 | 作用 |
---|---|
@{register} | 指定寄存器来执行相应寄存器的宏 |
@@ | 重复最近调用过的宏 |
N@{register} 串行的方法执行宏 | 重复寄存器宏N次 当需要简单的重复动作时,可录制宏 |
:‘<,’>normal @{register} 并行的方法执行宏 | 在高亮选区中的每一行执行宏 |
用let实现累加操作
:echo i
键入操作 | 文本 | 备注 |
---|---|---|
:let i=1 | line one line two line three | |
qa | line one line two line three | 开始录制宏a |
I<C-r>=i<CR>) <Esc> | 1) line one line two line three | 使用表达式寄存器插入变量i的值 |
:let i+=1 | 1) line one line two line three | 命令行操作,文本不会发现变化 |
q | 1) line one line two line three | 停止宏录制 |
jbVG | 1) line one line two line three | 将剩下的文本选中 |
:‘<,’>normal @a | 1) line one 2) line two 3) line three | 在剩下的文本执行宏 |
(3)编辑宏
1)将宏粘贴到文档中(:put{register}),类似编辑文档一样编辑宏
2)编辑宏
3)将宏从文档复制回寄存器,复制字符,执行两步:
a.0—回到行首
b.`{register}y$—从行首复制到行尾
五、模式匹配
1.vim的正则匹配
(1)调整查找模式的大小写敏感
命令 | 作用 |
---|---|
c | 查找模式忽略大小写 元字符 |
C | 查找模式强制区分大小写 元字符 |
ignorecase | 忽略大小写 |
smartcase | 如果输入大写,则区分大小写 如果输入小写,则不区分大小写 |
三者查找时,优先级为:
元字符>‘smartcase’>‘ignorecase’
(2)正则匹配与文本原义匹配
正则匹配
按正则表达式查找时,使用v模式开关
v模式使得Vim中所有特殊字符都无需配合转义字符使用
Vim中3种括号:
a.[ ]:不需要转义
b.( ):需要转义,开/闭括号都需要转义( )(正则表达式中如此使用)
c.{ }:需要转义,开括号需要转义,闭括号不需要转义,即:正则表达式中{ }
使用v模式则无需关注,例如:
/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
=/v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
=/v#(x{6}|x{3}),其中x=[0-9a-fA-F]
原义匹配
按原义查找文本时,使用V原义开关
原义匹配即文本原义,例如:
匹配:a.k.a
不使用V时,/a.k.a
使用V时,/Va.k.a
常用正则匹配字符
匹配模式 | 作用 |
---|---|
() | 使用圆括号捕获子匹配, 1…9配合使用 注: |