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 或者:x7) 插入文本(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)光标置于函数上,输入K18) 变量定位(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 -vv: 是以字节模式选择V: 是以行的方式选择Ctrl-v: 以列的方式选择在列选方式下:I<string><ESC> 在块的每一行首加上stringA<string><ESC> 在块的每一行尾加上stringC<string><ESC> 修改选中的列块(即删除并输入新内容)c<string><ESC> 修改选中的列块(即删除并输入新内容)> 右移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),然后到其它地方去编辑,在呼叫这个书签的时候就会回到设置点位置。