VIM 编辑器
VIM 和Emacs 是Linux 上最知名和最受程序员喜爱的两种编辑器。VI追求的是快捷启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听mp3,浏览网页,玩游戏,几乎可以login->emacs->logout了,VI和Emacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。
VIM引入了很多模式,主要的有如下几种:
?Normal mode 即通常所谓的命令模式,在此模式使用a、i、A、I、o、O等进入Insert mode
?Insert mode 即通常所谓的编辑模式,在此模式使用ESC进入Normal mode或者Ctrl-c 临时进入Normal mode
?Command-line mode 命令行模式,在Normal mode下按冒号进入,按ESC取消执行命令或者回车执行命令,然后回到Normal mode。
?Visual mode 即选择模式(注意跟用鼠标选择不同),用v,V,C-v或C-q进入?Select mode 鼠标选择
?Replace mode 在Normal mode下按R进入,按ESC返回Normal mode,相当于Windows下命令行中按Insert键进入的覆盖模式
1. 基本操作
1) 移动光标(Normal mode)
可以用下面的键来移动光标
H (左), j (下), k (上), l (右)
2) 删除(Normal mode)
当你想删除一个字符时,把光标移动到它上面,然后按下x键,它就会消失。
dd命令会删除当前所在的一行内容。
dw 删除当前光标所在字符
d$ 删除从当前光标所在位置到当前行结尾的所有内容
d^ 删除从当前光标所在位置到行首的所有内容
3) 合并行(Normal mode)
使用J命令可以合并当前行和下一行
4) 撤消和重做(Normal mode)
按下u会撤消上一步的操作,U(大字)是一个特殊的撤消键,它会撤消在在最后编
辑的行上所作的所有操作。
如果撤消的次数过多,按下Ctrl+r 会重做上次撤消的操作
5) 复制和粘贴(Normal mode)
yy 复制游标所在行整行。或大写一个Y。
2yy 或y2y 复制两行
y^ 复制至行首,或y0。不含光标所在处字符。
y$ 复制至行尾。含光标所在处字符。
yw 复制一个word。
y2w 复制两个字。
yG 复制至档尾。
y1G 复制至档首。
p 小写p 代表贴至光标后(下)。
P 大写P 代表贴至光标前(上)。
"ayy 将本行文字复制到a 缓冲区
a 可为26 个英文字母中的一个,如果是小写的话,原先的内容会被清掉,如果是大写的话是append 的作用,会把内容附加到原先内容之后。
"ap 将a 缓冲区的内容贴上。
6) 退出(Normal mode)
ZZ 会退出VIM并且对所有编辑的文件保存
起同样作用的命令(Command-line mode)
:wq 或者:x
7) 插入文本(Normal mode 转入Insert mode)
i会在光标所在字符前插入内容。I在当前行首插入内容。
a会让你在当标所在的位置之后继续输入内容。A 在当前行尾插入内容。
o命令会在光标所在行下面加入一行,并将光标移动的此行的开始以供输入
如果想在光标所在行的上面加入一行,请使用命令O(大写)
8) 替换(Normal mode)
r 替换当前字符。
R 替换当前字符及其后的字符,直至按ESC 键。
s 从当前光标位置处开始,以输入的文本代替指定数目的字符。
S 删除指定数目的行,并以所输入的文本代替。
9) 重复命令(Normal mode)
当要做多次同样的操作时,可以用计数来加快这一过程。
[number] command object 或者command [number] object
其意是∶
number - 代表的是命令执行的次数
command - 代表要做的事情,比如d 代表删除
object - 代表要操作的对象,比如w 代表单字/单词,$ 代表到行末等等。
举个例子如下
9k
会让你向上移动9行。通过在命令前加一个数字n,就可以执行这一命令n次。
10) 文件操作
vim FileName 打开文件FileName,并将光标置于第一行首。
vim +n FileName 打开文件FileName,并将光标置于第n 行首。
vim + FileName 打开文件FileName,并将光标置于最后一行。
vim + /pattern File 打开文件File,并将光标置于其中第一个于pattern 匹配的字符串处。
vim –r FileName 在上次正用vi 编辑FileName 发生系统崩溃后,恢复FileName。vim File1 … Filen 打开多个文件,依次对之进行编辑。
11) 十六进制查看模式(Command-line mode)
:%!xxd 按十六进制查看当前文件
:%!xxd -r 从十六进制返回正常模式
12) 屏幕(Normal mode)
H 光标移至屏幕顶行。
M 光标移至屏幕中间行。
L 光标移至屏幕最后行。
Ctrl+u 向文件首翻半屏。
Ctrl+d 向文件尾翻半屏。
Ctrl+f 向文件尾翻一屏。
Ctrl+b 向文件首翻一屏。
13) 大小写转换(Normal mode)
guu 行小写
gUU 行大写
g~~ 行翻转
guw 字小写
gUw 字大写
g~w 字翻转
14) 文件状态(Normal mode)
输入CTRL-g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
15) 搜索(Normal mode)
输入/ 以及尾随的字符串可以用以在当前文件中查找该字符串。
要查找同上一次的字符串,只需要按n 键。要向相反方向查找同上一次的字
符串,请输入Shift-n 即可。
如果您想逆向查找字符串,请使用 ? 代替/ 进行
“.*[]?%/\?~$”这些字符在VIM中有特殊意义,如果搜索内容中包括这些符号,需要在符号前面加“\”。
16) 配对括号的查找(Normal mode)
按% 可以查找配对的括号)、]、}。
17) 查找函数的man说明(Normal mode)
光标置于函数上,输入K
18) 变量定位(Normal mode)
gd 转到光标下局部变量的定义处
Gd 转到光标下全局变量的定义处
19) 自动补齐(Insert mode)
CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行
有ctags设置时:
Ctrl-p 自动补齐上下文已有的相近项
Ctrl-n 自动补齐tags 中的相近函数
20) 标签跳转(Normal mode)
CTRL+] 跳转到光标当前位置的标签处(例如:一个函数的定义)。
CTRL+T 跳转到执行CTRL-] 命令前的地方。
:tselect 从一连串匹配的标签中选出一个。
[/ 跳转到注释开始的位置。
]/ 跳转到注释结束的位置。
[# 返回到未闭合的#if, #ifdef, or #else 处。
]# 前进到未闭合的#else 或#endif 处。
[( 返回到未闭合的'(' 处。
)) 前进到未闭合的']' 处。
[{ 跳转到最近对应的'{' 处。
}} 跳转到最近对应的']' 处。
2. Visual mode 下操作
进入Visual mode使用v,V,ctrl -v
v: 是以字节模式选择
V: 是以行的方式选择
Ctrl-v: 以列的方式选择
在列选方式下:
I
A
C
c
> 右移Tab宽度
< 左移Tab宽度
3. 规则表达式(regular expression)及其应用
1) 表达式
●基本匹配
^ 行的起始
$ 行的结尾
. 除换行字符外的任一单一字符
* 指前所绑住的字符或字符集合,出现0 次或0 次以上
\+ 和* 作用相同,但不包括出现0 次
\= 指前所绑住的字符恰好出现0 或1 次
[…] 匹配括号内任意一个字符
[^…] 匹配除了括号内字符的字符
\{n, m} 指前所绑住的字符或字符集合最少出现n 次,最多出现m 次
\(\) 记忆pattern,可由\1, \2...\9 来叫出
\< 匹配字(word)首,所谓word 包括文数字及底线
\> 匹配字尾。这就是前所提及的限定用法,被\<,或\> 括住的
\| 搜索的或操作
●中介字符(metacharacter, or character classes)
\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),然后到其它地方去编辑,在呼叫这个书签的时候就会回到设置点位置。
mx x 代表26 个小写英文字母,这样光标所在处就会被标记一个书签
`x 就可以回到书签设置的位置
‘x 回到书签设置行的行首
:marks 得知目前所有书签的列表。
小写字母只作用于单一档案内。
大写字母可作用于编辑中之各档案间。
5. 宏的使用
Vim 有一种记录宏的机制。键入”qa”开始把一段宏记录入寄存器变量a 中。
下面按平常的操作键入你的擦作,这些操作会北Vim 记录到它命名为a 的宏中去,当再次按下q”键,就结束了宏a 的记录。当你要重复执行你刚才记录的那些操作时只要用“@a”命令。
6. 窗口操作
Ctrl-w n 即:new。开一空的新窗口。
Ctrl-w s 即:sp(lit),会开一新窗口,且原文件分属两个窗口。
Ctrl-w f 开一新窗口,并编辑光标所在处之word 为档名的档案。
Ctrl-w q 即:q 结束分割出来的窗口。
Ctrl-w o 即:only! 使光标所在之窗口,成为目前唯一显示的窗口
其它窗口会隐藏起来。
Ctrl-w j 移至下窗口。
Ctrl-w k 移至上窗口。
7. 编程辅助功能
1) 插件
VIM内置的插件
ctags,cscope
现在的IDE都提供了类、函数的索引功能,可以方便的找到某个类或者函数的在哪里定义的,VIM这方面可以利用ctags、cscope做到,Exuberant ctags
支持的语言种类非常多,UltraEdit的tags功能也是利用的ctags。cscope只支持
C,它能实现Source Insight的一些功能,比如查找某个函数调用了哪些函数,
某个函数被哪些函数调用。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} 要终止一个连接,需要给处连接号或者部分