VIM 使用教程.docx
《VIM 使用教程.docx》由会员分享,可在线阅读,更多相关《VIM 使用教程.docx(15页珍藏版)》请在冰点文库上搜索。
VIM使用教程
VIM编辑器
VIM和Emacs是Linux上最知名和最受程序员喜爱的两种编辑器。
VI追求的是快捷启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听mp3,浏览网页,玩游戏,几乎可以login->emacs->logout了,VI和Emacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。
VIM引入了很多模式,主要的有如下几种:
ØNormalmode 即通常所谓的命令模式,在此模式使用a、i、A、I、o、O等进入Insertmode
ØInsertmode 即通常所谓的编辑模式,在此模式使用ESC进入Normalmode或者Ctrl-c临时进入Normalmode
ØCommand-linemode 命令行模式,在Normalmode下按冒号进入,按ESC取消执行命令或者回车执行命令,然后回到Normalmode。
ØVisualmode 即选择模式(注意跟用鼠标选择不同),用v,V,C-v或C-q进入
ØSelectmode 鼠标选择
ØReplacemode 在Normalmode下按R进入,按ESC返回Normalmode,相当于Windows下命令行中按Insert键进入的覆盖模式
1.基本操作
1)移动光标(Normalmode)
可以用下面的键来移动光标
H(左),j(下),k(上),l(右)
2)删除(Normalmode)
当你想删除一个字符时,把光标移动到它上面,然后按下x键,它就会消失。
dd命令会删除当前所在的一行内容。
dw删除当前光标所在字符
d$删除从当前光标所在位置到当前行结尾的所有内容
d^删除从当前光标所在位置到行首的所有内容
3)合并行(Normalmode)
使用J命令可以合并当前行和下一行
4)撤消和重做(Normalmode)
按下u会撤消上一步的操作,U(大字)是一个特殊的撤消键,它会撤消在在最后编辑的行上所作的所有操作。
如果撤消的次数过多,按下Ctrl+r会重做上次撤消的操作
5)复制和粘贴(Normalmode)
yy复制游标所在行整行。
或大写一个Y。
2yy或y2y复制两行
y^复制至行首,或y0。
不含光标所在处字符。
y$复制至行尾。
含光标所在处字符。
yw复制一个word。
y2w复制两个字。
yG复制至档尾。
y1G复制至档首。
p小写p代表贴至光标后(下)。
P大写P代表贴至光标前(上)。
"ayy将本行文字复制到a缓冲区
a可为26个英文字母中的一个,如果是小写的话,原先的内容会被清掉,如果是大写的话是append的作用,会把内容附加到原先内容之后。
"ap将a缓冲区的内容贴上。
6)退出(Normalmode)
ZZ会退出VIM并且对所有编辑的文件保存
起同样作用的命令(Command-linemode)
:
wq或者:
x
7)插入文本(Normalmode转入Insertmode)
i会在光标所在字符前插入内容。
I在当前行首插入内容。
a会让你在当标所在的位置之后继续输入内容。
A在当前行尾插入内容。
o命令会在光标所在行下面加入一行,并将光标移动的此行的开始以供输入
如果想在光标所在行的上面加入一行,请使用命令O(大写)
8)替换(Normalmode)
r替换当前字符。
R替换当前字符及其后的字符,直至按ESC键。
s从当前光标位置处开始,以输入的文本代替指定数目的字符。
S删除指定数目的行,并以所输入的文本代替。
9)重复命令(Normalmode)
当要做多次同样的操作时,可以用计数来加快这一过程。
[number]commandobject或者command[number]object
其意是∶
number-代表的是命令执行的次数
command-代表要做的事情,比如d代表删除
object-代表要操作的对象,比如w代表单字/单词,$代表到行末等等。
举个例子如下
9k
会让你向上移动9行。
通过在命令前加一个数字n,就可以执行这一命令n次。
10)文件操作
vimFileName打开文件FileName,并将光标置于第一行首。
vim+nFileName打开文件FileName,并将光标置于第n行首。
vim+FileName打开文件FileName,并将光标置于最后一行。
vim+/patternFile打开文件File,并将光标置于其中第一个于pattern匹配的字符串处。
vim–rFileName在上次正用vi编辑FileName发生系统崩溃后,恢复FileName。
vimFile1…Filen打开多个文件,依次对之进行编辑。
11)十六进制查看模式(Command-linemode)
:
%!
xxd按十六进制查看当前文件
:
%!
xxd-r从十六进制返回正常模式
12)屏幕(Normalmode)
H光标移至屏幕顶行。
M光标移至屏幕中间行。
L光标移至屏幕最后行。
Ctrl+u向文件首翻半屏。
Ctrl+d向文件尾翻半屏。
Ctrl+f向文件尾翻一屏。
Ctrl+b向文件首翻一屏。
13)大小写转换(Normalmode)
guu行小写
gUU行大写
g~~行翻转
guw字小写
gUw字大写
g~w字翻转
14)文件状态(Normalmode)
输入CTRL-g显示当前编辑文件中当前光标所在行位置以及文件状态信息。
15)搜索(Normalmode)
输入/以及尾随的字符串可以用以在当前文件中查找该字符串。
要查找同上一次的字符串,只需要按n键。
要向相反方向查找同上一次的字
符串,请输入Shift-n即可。
如果您想逆向查找字符串,请使用 ?
代替/进行
“.*[]ˆ%/\?
~$”这些字符在VIM中有特殊意义,如果搜索内容中包括这些符号,需要在符号前面加“\”。
16)配对括号的查找(Normalmode)
按%可以查找配对的括号)、]、}。
17)查找函数的man说明(Normalmode)
光标置于函数上,输入K
18)变量定位(Normalmode)
gd转到光标下局部变量的定义处
Gd转到光标下全局变量的定义处
19)自动补齐(Insertmode)
CTRL-XCTRL-F文件名
CTRL-XCTRL-L整行
有ctags设置时:
Ctrl-p自动补齐上下文已有的相近项
Ctrl-n自动补齐tags中的相近函数
20)标签跳转(Normalmode)
CTRL+]跳转到光标当前位置的标签处(例如:
一个函数的定义)。
CTRL+T跳转到执行CTRL-]命令前的地方。
:
tselect从一连串匹配的标签中选出一个。
[/跳转到注释开始的位置。
]/跳转到注释结束的位置。
[#返回到未闭合的#if,#ifdef,or#else处。
]#前进到未闭合的#else或#endif处。
[(返回到未闭合的'('处。
))前进到未闭合的']'处。
[{跳转到最近对应的'{'处。
}}跳转到最近对应的']'处。
2.Visualmode下操作
进入Visualmode使用v,V,ctrl-v
v:
是以字节模式选择
V:
是以行的方式选择
Ctrl-v:
以列的方式选择
在列选方式下:
I在块的每一行首加上string
A在块的每一行尾加上string
C修改选中的列块(即删除并输入新内容)
c修改选中的列块(即删除并输入新内容)
>右移Tab宽度
<左移Tab宽度
3.规则表达式(regularexpression)及其应用
1)表达式
●基本匹配
^行的起始
$行的结尾
.除换行字符外的任一单一字符
*指前所绑住的字符或字符集合,出现0次或0次以上
\+和*作用相同,但不包括出现0次
\=指前所绑住的字符恰好出现0或1次
[…]匹配括号内任意一个字符
[^…]匹配除了括号内字符的字符
\{n,m}指前所绑住的字符或字符集合最少出现n次,最多出现m次
\(\)记忆pattern,可由\1,\2...\9来叫出
\<匹配字(word)首,所谓word包括文数字及底线
\>匹配字尾。
这就是前所提及的限定用法,被\<,或\>括住的
\|搜索的或操作
●中介字符(metacharacter,orcharacterclasses)
\d:
匹配一个数字[0-9]
\D:
匹配一个非数字字符
\x:
匹配一个十六进制数[0-9A-Fa-f]
\X:
匹配一个非十六进制字符
\o:
匹配一个八进制字符[0-7]
\O:
匹配一个非八进制字符
\w:
匹配一个word字符[0-9A-Za-z]
\W:
匹配一个非word字符
\a:
匹配一个字母字符[A-Za-z]
\A:
匹配一个非字母字符
\l:
匹配一个小写字母字符[a-z]
\L:
匹配一个非小写字母字符
\u:
匹配一个大写字母字符[A-Z]
\U:
匹配一个非大写字母字符
\c:
忽略搜索内容大小写
\C:
大小写敏感
2)全域性指令
:
[range]g/pattern/[cmd]
cmd是ed可用的指令,预设是p(print)。
这里主要是说明d(delete)的功能。
因为是要说明如何消除空白行。
需注意的是,d是行删除指令,凡含pattern的整行都会被删掉,而且range不指定的话,预设是全篇文章,因为g就是代表globe。
例:
:
g/^$/d删除全文的空白行
3)替换
:
[range]s/pattern/string/[c,e,g,I,n]
range指的是范围,1,7指从第一行至第七行,1,$指从第一行
至最后一行,也就是整篇文章,也可以%代表。
pattern就是要被替换掉的字符串,可以用regexp来表示。
string将pattern由string所取代。
c每次替换前会询问。
e不显示error。
g不询问,整行替换。
n不做替换操作。
(可以做统计用)
I忽略大小写
Note:
&代表置换时合于patern的字符或字符串
例:
将档案3至7行的数据向右移2个空白
:
3,7s/.\+/&/
4.设置书签
你可以在编辑的内容的某处设置书签(marks),然后到其它地方去编辑,在呼叫这个书签的时候就会回到设置点位置。
mxx代表26个小写英文字母,这样光标所在处就会被标记一个书签
`x就可以回到书签设置的位置
‘x回到书签设置行的行首
:
marks得知目前所有书签的列表。
小写字母只作用于单一档案内。
大写字母可作用于编辑中之各档案间。
5.宏的使用
Vim有一种记录宏的机制。
键入”qa”开始把一段宏记录入寄存器变量a中。
下面按平常的操作键入你的擦作,这些操作会北Vim记录到它命名为a的宏中去,当再次按下q”键,就结束了宏a的记录。
当你要重复执行你刚才记录的那些操作时只要用“@a”命令。
6.窗口操作
Ctrl-wn即:
new。
开一空的新窗口。
Ctrl-ws即:
sp(lit),会开一新窗口,且原文件分属两个窗口。
Ctrl-wf开一新窗口,并编辑光标所在处之word为档名的档案。
Ctrl-wq即:
q结束分割出来的窗口。
Ctrl-wo即:
only!
使光标所在之窗口,成为目前唯一显示的窗口
其它窗口会隐藏起来。
Ctrl-wj移至下窗口。
Ctrl-wk移至上窗口。
7.编程辅助功能
1)插件
VIM内置的插件
●ctags,cscope
现在的IDE都提供了类、函数的索引功能,可以方便的找到某个类或者函数的在哪里定义的,VIM这方面可以利用ctags、cscope做到,Exuberantctags支持的语言种类非常多,UltraEdit的tags功能也是利用的ctags。
cscope只支持C,它能实现SourceInsight的一些功能,比如查找某个函数调用了哪些函数,某个函数被哪些函数调用。
VIM对这两个工具集成的非常好,利用它们就可以在源文件中方便的跳转搜索类和函数了。
vim中cscope相关命令简介:
所有命令都是通过主命令 ":
cscope" 的子项完成的。
主命令最短的缩写是 ":
cs"。
":
scscope" 完成同样的功能的同时还可以分割窗口 (缩写:
"scs").可用的子命令有:
add :
添加一个新的 cscope 数据库/连接。
用法 :
cs add {file|dir} [pre-path] [flags] [pre-path] 用来通知 cscope 使用 -P [pre-path] 选项。
[flags] 可以用来给 cscope 传递额外的选项。
例子 :
cscope add /usr/local/cdb/cscope.out
:
cscope add /projects/vim/cscope.out /usr/local/vim
:
cscope add cscope.out /usr/local/vim -C
find :
查询 cscope。
用法 :
cs find {querytype} {name} {querytype} 和 cscope 的控制台界面都是一致的。
0 或 s:
查找 C 符号
1 或 g:
查找定义
2 或 d:
查找本函数调用的函数
3 或 c:
查找调用指定函数的函数
4 或 t:
查找字符串
6 或 e:
查找 egrep 模式
7 或 f:
查找文件
8 或 i:
查找包含指定文件的文件
例如 :
cscope find c vim_free
:
cscope find 3 vim_free 这两个例子执行同样的查询。
kill :
终止一个 cscope 连接 (或终止所有 cscope 连接).
用法 :
cs kill {num|partial_name} 要终止一个连接,需要给处连接号或者部分的连接名称。
部分名称可以是数据库文件路径的任何一部分。
所以要当心使用这个功能!
如果给定的连接号是 -1,那么所有的cscope 连接都会被终止。
reset:
重新初始化所有连接。
用法 :
cs reset
show :
显示当前的连接。
用法 :
cs show
这里介绍几种常用的插件和安装方法
i.taglist一种代码浏览的插件
taglist_41.zip包含两个文件taglist.vim和taglist.txt。
taglist.vim放置于VIM的plugin目录
taglist.txt放置于VIM的doc目录
当重启VIM,放置于plugin的taglist.vim会自动被载入,而帮助文件需要命令安装。
启动VIM后执行:
helptags.就可以重建帮助文件的索引,这样新插件的帮助文件就被加入到重帮助文件中了。
ii.bufexplorer方便文件之间切换
bufexplorer.zip安装方法可以参考taglist
2)编译及定位程序错误
a)打开VIM的目录中有makefile
b):
make
c):
cl查看编译过程中的错误和警号信息
d):
cc+number跳转到number对应的错误位置
e):
cn查看下一个错误
f):
cp查看上一个错误
3)文件比较
进入比较模式编辑的最简单方法就是用"vimdiff"命令。
它如常启动Vim,但附加一些
设置,以便于查看输入参数所指定的文件间的差异:
vimdifffile1file2[file3[file4]]
:
diffu[pdate]刷新比较结果的高亮和折叠
有两条命令可用于在跳转到差异文所在的位置:
[c反向跳转至上一处更改的开始
]c正向跳转至下一个更改的开始。
有两个命令可用来在两个缓冲区之间复制文本。
相应的结果是,在一定的范围内两缓冲区的内容被统一。
do用另一个缓冲区来修改当前的缓冲区,消除不同之处
dp用当前缓冲区来修改另一个缓冲区,消除不同之处
4)括号内的快速块操作和跳转
Normalmode模式下
daB删除{}及其内的内容
diB删除{}中的内容
在Visualmode模式下
ab选择()中的内容
iB选择{}中的内容(不含{})
5)语法提示与自动补齐
K显示函数的man手册
插入模式下的单词自动完成
行自动完成
8.Set选项设置
setall列出所有选项设置情况。
setterm设置终端类型。
setignorecase在搜索中忽略大小写。
setlist显示制表位(^I)和行尾标志($)。
setnumber显示行号。
setshowmode显示用户处在什么模式下
setreport显示由面向行的命令修改的行数目。
setterse显示简短的警告信息。
setwarn在转到别的文件时,若没有保存当前文件则显示Nowrite信息。
setautowrite在“:
n”和“:
!
”命令之前都自动保存文件
setnomagic允许在搜索模式中,使用前面不带\的特殊字符。
setnowrapscan禁止vi在搜索到达文件两端时,又从另一端开始。
setmesg允许vi显示其他用户用write写到自己终端上的信息。
autoindent(ai)noai使新行自动缩进,和上(下)行的位置对齐
autoprint(ap)ap每条命令之后都显示出修改之处
autowrite(aw)noaw在:
n,:
!
命令之前都自动保存文件
beautify(bf)nobf在输入的时候忽略所有的控制字符(除了制表键(tab),换行(newline),进纸(formfeed))
directory=(dir=)/tmp存放缓冲区的目录名
edcompatiblenoedcompatible在替换的时候使用类ed的用法
errorbells(eb)errorbells出错的时候响铃
exrc(ex)noexrc允许在主目录(home)外面之外放.exrc文件
hardtabs=(ht=)8设置硬制表的边界
ignorecase(ic)noic正规式里忽略大小写
lispnolisp打开lisp模式
listnolist显示所有的制表键和行的结尾
magicagic可以使用更多的正规表达式
mesgmesg允许向终端发送消息
number(nu)nonumber显示行号
openopen允许开放和可视化
optimize(opt)optimize优化吞吐量,打印时不发回车
paragraphs=(para=)IPLPPPQPPLIbp设置{&}的分界符
promptprompt命令模式下的输入给出:
的提示符
readonly(ro)noro除非用!
号否则不准保存文件
redrawnoredraw当编辑的时候重绘屏幕
remapremap允许宏指向其他的宏
report=5如果影响的行数>这个数的话就报告
scroll1/2window下卷屏幕时滚动屏幕的数目,同样这也是z命令输出的行数(z输出2倍滚屏的大小)
sections=SHNHHHU定义节的末尾(当使用命令[[和]]时)
shell=(sh=)/bin/sh缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量
shiftwidth=(sw=)8当使用移动(shift)命令时移动的字符数
showmatch(sm)nosm显示{,},(,),[,或者]的匹配情况
showmodenoshowmode显示你处在什么模式下面
slowopen(slow)插入之后不要立刻更新显示
tabstop=(ts=)8设置制表停止位(tabstop)的长度
taglength=(tl=)0重要标记的字符个数(0表示所有的字符)
tags=tag,/usr/lib/tags定义包含标记的文件路径
term=设置终端类型
tersenoterse显示简短的错误信息
timeout(to)timeout一秒钟后键盘映射超时
ttytype=设置终端类型
warnwarn显示"Nowritesincelastchange"信息
window=(w=)可视模式下窗口的行数
wrapmargin=(wm=)0右边距,大于0的话最右边的单词将折行,留出n个空白位置
wrapscan(ws)ws查找到文件尾后再重头开始
writeany(wa)nowa可以保存到任意一个文件去