l 模式切换vim
在插入模式或命令行模式中按“ESC”或者“Ctrl+[”便可进入普通模式,在普通模式中输入“i”或者“a”便可进入插入模式,输入“:”进入命令行模式。函数
l 打开文件ui
命令行模式中输入": 文件路径+文件名"可打开文件。spa
l 文档编辑命令行
文档编辑是vim最主要的功能,分几个点来说述。blog
在普通模式下,移动光标ci
按键文档 |
说明字符串 |
hit |
左 |
L |
右 |
J |
下 |
K |
上 |
w |
移动到下一个单词 |
b |
移动到上一个单词 |
3w |
移动到光标后第三个单词的首字母 |
e |
将光标移动到下一个单词的最后一个字符 |
ge |
将光标移动到前一个单词最后一个字符 |
(n)$ |
将光标移动到当前行(后第n行)行尾 |
^ |
将光标移动到当前行第一个非空白字符上 |
0 |
将光标移动到当前行的首字符上 |
G |
将光标移动到最后一行,(计数n)G移动到第n行 |
gg |
移动到第一行 |
:set number |
显示行号 |
:set nonumber |
关闭行号 |
:set ruler |
在vim窗口右下角显示当前光标位置 |
`` |
当使用G命令从一个地方跳转到另外一个地方时,vim会记得起跳的位置,使用``能够在两个位置间跳转。键盘上``与“~”在同一个按键上。 |
CTRL-O |
vim可以记忆光标位置,该命令能够跳转到以前的光标位置,而CTRL-I是跳转到时间靠后的光标位置。 |
具名标记 |
“ma”命令会将当前光标下的位置标记为"a","`a"命令能够将光标跳转到标记为a的位置所在行行首,“:marks”用来查看标记的列表,“:delm!”将删除全部标记。 |
CTRL-U |
显示文本的窗口向上滚动半屏 |
CTRL-D |
向下滚动半屏 |
CTRL-E |
向上滚动一行 |
CTRL-Y |
向下滚动一行 |
CTRL-F |
向上滚动一整屏 |
CTRL-B |
向下滚动一整屏 |
zz |
将当前行置为屏幕正中央 |
zt |
将当前行置为屏幕顶端 |
zb |
将当前行置为屏幕底端 |
按如下按键将从普通模式进入插入模式,并可从相应位置开始输入。
命令 |
说明 |
i |
在当前光标出进行编辑 |
I |
在行首插入 |
A |
在行末插入 |
a |
在光标后插入 |
|
在当前行后插入一个新行 |
O |
在当前行前插入一个新行 |
S或cc |
改变整行 |
C或c$ |
改变当前光标到行尾的内容 |
s或cl |
修改一个字符 |
在virtual模式下被选中的文本会高亮显示,能够对选中的文本进行复制粘贴及删除等操做。
命令 |
说明 |
v |
进入可视模式,从光标位置开始,光标所通过的地方被选中,再按一次v结束 |
V |
从当前行开始,光标所通过的行都会被选中,再按一次V结束 |
Ctrl+v |
从光标当前位置开始,选中光标起点和终点所构成的矩形区域,再按一次Ctrl+v结束 |
ggVG |
选中所有文本,gg跳到首行,V选中当前行(首行),G跳到末尾 |
ve |
选中一个单词 |
命令 |
说明 |
y(n)w |
复制n个字符到寄存器 |
yy或者Y |
复制整行 |
y$ |
复制当前光标至行尾的文本 |
p |
粘贴(从寄存器取出) |
"+y |
复制到系统剪贴板,即vim的+寄存器 |
"+p |
从系统剪贴板粘贴 |
nyy |
n表示大于1的数字,复制n行 |
yw |
从光标处复制至一个单子/单词的末尾,包括空格 |
ye |
从光标处复制至一个单子/单词的末尾,不包括空格 |
y$ |
从当前光标复制到行末 |
y0 |
从当前光标位置(不包括光标位置)复制之行首 |
y3l |
从光标位置(包括光标位置)向右复制3个字符 |
y5G |
将当前行(包括当前行)至第5行(不包括它)复制 |
y3B |
从当前光标位置(不包括光标位置)反向复制3个单词 |
命令 |
说明 |
x或diw |
删除一个字符 |
X |
删除当前光标以前的字符 |
dd |
删除整行,下面的行会自动移上来,删除的内容保留在剪切板中能够粘贴到其余地方,其余删除同 |
J |
删除换行符,即两行会合成一行 |
D |
删除当前光标至行尾的内容 |
dw |
删除自当前光标至下一个word的开头 |
dG |
删除当前行至文件尾的内容 |
dgg |
删除当前行至文件头的内容 |
dw |
删除光标以后的单词剩余部分 |
d$ |
删除光标以后的该行剩余部分 |
文件内搜索字符串
命令 |
说明 |
/字符串 |
往光标以后寻找该字符串 |
?字符串 |
往光标以前寻找该字符串 |
(计数x)n |
往下继续寻找一个(第x个)相同的字符串 |
(计数x)N |
往上继续寻找一个(第x个)相同的字符串 |
:set ignorecase或:set ic |
匹配的结果忽略大小写 |
:set noignorecase或:set noic |
精确匹配大小写的结果 |
:set hlsearch |
高亮显示搜索结果,:set nohlsearch可关闭这一功能 |
* |
将光标所在的字符做为目标字符往下查找,前面可加计数n,表明查找第三个匹配到的结果,"#"与"*"相同,只是往上查找 |
目录下搜索字符串
一些场合,能够用cscope find t能够解决了。但是遇到复杂的模式,该命令就捉襟见肘了。这时候就得用vim自带的匹配利器---vimgrep。
vimgrep有两种使用的方式:
1)将匹配模式放到//之间:这样状况下,使用vim的正则模式来进行匹配
命令格式::vim[grep][!] /{pattern}/[g][j] {file}
例子:
:vim /function demo/ *.c 在当前目录的.c文件中,搜索function demo
:vim /function demo/ **/*.c 在任意目录的.c文件中,搜索function demo
:vim /function demo/ **/*.{h,c} 在任意目录的.c和.h文件中,搜索function demo
:vim /\cfunction demo/ **/*.c 使用\c,不区分大小写
:vim /\Cfunction demo/ **/*.c 使用\C,区分大小写
:vim /function demo/j *.c 只更新quickfix,不跳转到第一个搜索结果
:vim /function demo/g *.c 一行中如有多个匹配,每一个都要单独显示一行
2)直接加匹配模式:这种状况下只能搜索ID,举个例子,就不详细说了
:vimgrep Error *.c
vimgrep能够跟split或vsplit结合使用,将结果显示到单独的窗口中:
vsp | vimgrep demo *.c
lvimgrep跟vimgrep功能上是同样的,但该命令更新提本地的窗口列表,而不是quickfix列表
若结果更新到quickfix:
用cw查看,cn下一条,cp上一条,ccl关闭结果,colder上次搜索结果,cnewer下次搜索结果。
若结果更新到本地的窗口列表:
用lopen查看,lcl关闭,lnext下一条,lpre上一条,lolder上次搜索结果,lnewer下次搜索结果。
经常使用vim文本匹配表达式
匹配符 |
说明 |
\> |
表示一个单词结尾处,好比/the\>,表示查找以the结尾的字符串 |
\< |
表示一个单词结尾处,好比/\<the,表示查找以the开始的字符串,那么/\<the\>,表示查找以the做为完整单词的字符串 |
^ |
匹配一行的开头,/^the,表示只匹配一行开始处的the |
% |
匹配一行的结尾,/the$,表示只匹配一行结尾处的the |
. |
匹配任何单字符,好比/c.m,能够匹配到com,cim,cam等 |
\ |
匹配特殊字符,好比查找中文句号“。”就写成/\。 |
|
|
替换文本
命令 |
说明 |
:1,$s/旧文本/新文本/g |
将文件中全部匹配到的就文本替换为新文本 |
:10,20s/旧文本/新文本/ |
将第10行至第20行中匹配的旧文本替换为新文本 |
U |
将选中的文本所有改成大写 |
u |
将选中的文本所有改成小写 |
命令 |
说明 |
u |
撤销上一次的操做 |
CTRL-R |
重作,即撤销的撤销 |
|
|
命令 |
说明 |
ZZ |
保存当前文件并退出vim |
:q! |
放弃全部修改并退出 |
:e! |
放弃全部修改并从新载入改文件的原始内容 |
:set aw或:set autowrite |
在执行:next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时就会自动将修改的内容保存 |
:set autowriteall或者:set awa |
和:set aw相似,除了以上命令外,执行":edit"、":enew"、":quit"、":qall"、":exit"、":xit"、":recover" 和关闭 Vim 窗口时也都会将修改的内容保存 |
Ctrl+] |
跳转到函数定义,Ctrl+t能够调回调用处 |
|
|
|
|
命令 |
说明 |
:e 文件路径\文件名A |
编辑文件A |
:vim 文件A、文件B…… |
编辑多个文件,只显示第一个文件,完成该文件的编辑后使用“:n”能够保存修改为果,并继续下一个文件编辑 |
:args |
显示当前编辑的文件 |
:(x)n |
编辑文件列表后第x个文件 |
:(x)prev |
编辑文件列表前第x个文件 |
:last |
编辑最后一个文件 |
:first |
编辑第一个文件 |
:args a b c…… |
从新定义一个文件列表 |
CTRL-^ |
在文件间切换 |
文件标记 |
在编辑文件a时执行"50%mF"其中F是一个文件标记,标记的位置是文件a的中间,或者执行"GnB"表示将文件a的最后一行标记为B,那么在其余文件b中执行F或B就能回到a文件的中间或最后一行。CTRL-O和CTRL-I能够跳转到较早的位置和靠后的位置。 |
vim -R file |
以只读方式打开文件 |
vim -M file |
以强制只读方式打开文件 |
:sav a.c |
将当前文件保存并更名为a.c |
:f(ile) a.c |
将当前编辑的文件更名为a.c可是不保存 |
:split |
分割一个窗口 |
CTRL-W |
切换当前活动窗口 |
:close |
关闭当前窗口 |
:only |
关闭除当前窗口外其余全部窗口 |
: split a.c |
为文件a.c分割一个窗口做为编辑a的窗口 |
:new |
分割一个窗口并开始编辑一个空缓冲区 |
:vsplit、:vsplit a.c 和:vnew |
垂直分割一个窗口 |
CTRL- W h |
到左边的窗口 |
CTRL- W j |
到下面的窗口 |
CTRL- W k |
到上面的窗口 |
CTRL- W l |
到右边的窗口 |
CTRL- W t |
到顶部窗口 |
CTRL- W b |
到底部窗口 |
针对全部窗口的命令 |
":qall"放弃全部操做并退出,":wall"保存全部,":wqall"保存全部并退出。 |
l 其余
一、使用vimdiff查看不一样
"vimdiff main.c~ main.c",另外一种进入diff模式的办法能够在Vim运行中操做。编辑文件"main.c",而后打开另外一个分隔窗口显示其不一样:
":edit main.c"
":vertical diffpatch main.c.diff"。
二、页签
命令":tabe(dit) thatfile"在一个窗口中打开"thatfile",该窗口占据着整个的Vim显示区域。命令":tab split/new"结果是新建了一个拥有一个窗口的页签。以用"gt"命令在不一样的页签间切换。
最后附上一张vim经常使用按键图。