当前位置:文档之家› VIM 使用教程

VIM 使用教程

VIM 使用教程
VIM 使用教程

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 在块的每一行首加上string

A 在块的每一行尾加上string

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} 要终止一个连接,需要给处连接号或者部分

相关主题
文本预览
相关文档 最新文档