使用 Vi
____William Liu
vi 编辑器是所有 Unix 及 Linux 系统下的标准编辑器,它强大功能不逊色于任何最新的文本编辑器。本文只是介绍一下它的基本操作,相信你如果深入学习的话会深深的喜欢上这个软件。同时 Vi 也是 Linux 中最基本的文本编辑器,学会它后,您将在 Linux 的世界里畅行无阻。你可以在 linux 下运行 vimtuitor 查看一个入门的教程。本文在此基础上重新整理归纳了一下,并补充了一些高级操作。您也可以用 vi 打开一个文件,实践一下本文介绍的操作。
1 、 Vi 的工作模式:
基本上 vi 可以分为三种工作模式,分别是命令模式( command mode )、插入模式( Insert mode )和底行模式( last line mode ),各模式的功能区分如下:
• 命令模式 command mode ):也叫编辑模式,你可以通过输入各种命令来对你的文本进行编辑。这些命令包括:控制屏幕光标的移动,字符、字或行的剪切、复制,等等。一般 vi 默认开始是在这个模式下。要输入文本你可以输入 a 或者 i 。
• 插入模式( Insert mode ):只有在 Insert mode 下,才可以做文字输入,按「 ESC 」键可回到命令行模式。
• 底行模式( last line mode ):功能和命令行模式很相象,其实也可以看成命令忙模式的一种。因为这种模式下的命令都是以“:”、“ / ”或者“?”开头,且显示在屏幕区的底行,所以也称底行模式。一般用来控制文档的显示方式或者保存、退出等等。
三种模式相互转换的方式如下图一:
图一:三种工作模式的相互转换关系
2 、命令模式(编辑模式)下的常见命令
2.1 转到插入模式
a |
在当前光标所在字符之后插入 |
A |
在当前光标所在的行尾插入 |
I |
在当前光标所在字符之前插入 |
I |
在当前行的第一个非空字符前插入 |
O |
在当前光标所在的行之下再创建一个新行,然后在新行插入 |
O |
在当前光标所在的行之上再创建一个新行,然后在新行插入 |
2.2 移动光标
← , ↓ , ↑ , → ,h,j,k,l |
光标向左、下、上、右分别移动一个字符 |
0 |
移到光标到所在行的第一个字符处 |
^ |
移动光标到第一个非空格字符上 |
$ |
移动光标到所在行的行尾 |
G ( Shift+g ) |
移动光标到文章的最后一行 |
w,W |
移到光标到下一个单词的第一个字符上 |
b,B |
移到光标到前一个单词的第一个字符上 |
e,E |
移到光标到当前单词的最后一个字符上 |
Ctrl+b,Ctrl+f |
向后、向前卷动一屏 |
Ctrl+u,Ctrl+d |
向后、向前移动半屏,并置光标到屏幕中间 |
#G ( # +Shift+g ) |
跳转到第#行 |
Ctrl+g |
读取当前所在的行号 |
2.3 删除文字
x |
删除光标所在的字符 |
X |
删除光标所在的字符之前的字符 |
dd |
删除当前行所有的字符 |
d$ , D |
删除从光标处到行尾的字符 |
de |
删除从光标处到下一个空格之前的字符 |
dw |
删除从光标处到下一个单词之前的字符 |
# d[object] |
表示连续删除 # 个 object |
注:严格来说应该叫剪切命令。因为删除的字符或者行都进入剪贴板了。使用 p 命令可以复制出来。
2.4 复制文字的一些命令:
yy,#yy |
将当前的行(或者多行)拷贝入剪贴板 |
P |
从剪贴板中复制 |
2.5 替换文字的一些命令:
r |
替换当前字符 |
R |
替换当前行的字符,直到用户输入 |
2.6 恢复上一次操作的命令
u |
恢复上一次的编辑操作 |
Ctrl+z |
撤销上一次的恢复操作 |
2.7 更改操作的命令
cw,c#w |
删除当前一个或者 # 个词,并进入插入模式 |
2.8 保存并退出命令
ZZ ( Shift+z+z ) |
保存并退出 |
2.9 在 vi 中使用 man 帮助手册
K(shift+k) |
将光标放在需要查找的函数上,然后敲 K 将可以看到相应 man 页 |
fg |
将光标放在 include 文件上,然后敲 fg ,将可以看到对应的文件 |
3 、底行模式的常见命令
3.1 跳到文件中的某一行
:# |
如输入 ': 15' ,再回车,就会跳到文章的第 15 行。 |
3.2 查找字符或者字符串
/string +n/N |
可以在文件中向后查找匹配的 string 。如果第一次找的关键字不是您想要的,可以一直按 n/N 继续查找 |
?string +n/N |
可以在文件中向前查找匹配的 string ,如果第一次找的关键字不是您想要的,可以一直按 n/N 继续查找 |
注:可以使用转义字符
^ : 表示行首 / /: 表示字符 '/'
3.3 查找配对命令
% |
把光标放在任何一个 ( 、 [ 或 { 处 , 接着按 %, 此时光标将转移到配对的括号处 |
3.4 替换命令
:s/old/new |
用 new 替换所在行的第一个 old 字符串 |
:s/old/new/g |
用 new 替换所在行的所有 old 字符串 |
:%s/ctrl_v_m//g |
将 windows 编辑的模式修改为 linux 的格式 |
:#1,#2s/old/new/g |
用 new 替换第 #1 到 #2 行的所有 old 字符串 |
:%s/old/new/g |
用 new 替换文件中所有 old 字符串 |
3.5 执行外部命令
:!command |
执行 command 命令。比如 ':!rm test' 、 ':!shell' 、 ':!ls -l' |
3.6 使用帮助
:help , |
获取帮助文档 |
:help user-manual |
获取用户手册帮助文档 |
:help CTRL-D |
获取 CTRL-D 命令的帮助 |
:help :e |
获取 :e 命令的帮助 |
:set nu ?, :help nu |
获取 :set nu 的帮助 |
3.7 保存和退出文件
:w(write) [file] |
将文件保存起来。 |
:#1,#2 w file |
将文件中第 #1 行到 #2 行的内容写入 file 文件中 |
:r(read) file |
将 file 文件读入到光标处 |
:#r file |
将 file 文件读入到第 # 行 |
:saveas filename |
将文件另存为 filename |
:q/:q! |
不保存,直接退出。 '!' 表示强制退出 |
:qw |
保存,并退出 |
3.8 编程相关系列命令
:syntax on/off |
语法高亮 |
:set ai(auto indent) |
自动缩进 |
:set cin(cindent) |
设置为 c 语言的缩进格式 |
:set ru(ruler) |
在右下角显示光标所在的位置 |
:set is(incsearch) |
显示匹配一半时的结果 |
:set nu(number) |
在文件中的每一行前面列出行号 |
:set sm(showmatch) |
键入 ),],} 时光标将短暂 (matchtime) 的显示一下相应的 (,[,{ |
:set aw(autowrite) |
自动保存 |
:set ro(readonly) |
设置文件只读 |
:set sw=#(shiftwidth) |
设置一个 shift 的单位 ;'>>' 或 '<<' 将左或者右移一个 shift 单位 |
:set ts=#(tabstop) |
显示 table 的长度 |
:set et(expandtab) |
将以后键入的 tab 键或者 shift 单位转换为 ts 个数目的 space 键 |
:set hls(hlsearch) |
高亮显示搜索到的结果 |
:set backspace |
一般设置为 ‘:set backspace=indent,eol,start' 表示退格键可以删除如上三种符号 |
:set lbr(linebreak) |
在换行的时候不打断单词 |
:set list( nolist) |
显示隐藏字符 |
3.9 管理相关的命令
:suspend |
在 linux 下将 Vi 转后台运行,在 windows 下转最小话 |
:pwd |
取当前目录名 |
:cd dir |
转到 dir 目录 |
:find filename |
找到 filename 文件,并打开之 |
:shell |
打开一个 shell |
:map |
创建宏,比如 :map |
:ab 、 :una |
设置简写 , 比如 :ab #d #define, :nua #d 将取消简写 |
3.10 其他命令
:split/:vsplit |
展开多个窗口水平 / 垂直,然后可以使用 Ctrl w w: 切换窗口 Ctrl w +: 扩大窗口 Ctrl w -: 缩小窗口 Ctrl w _: 最大化窗口 |
:edit dir |
将进入目录编辑模式,在这里面你可以 ? 显示帮助 p 预览文件 D 删除文件 i 显示当前目录下文件的详细信息 x 调用外部程序执行对应文件 - 进入上一级目录 R 重命名文件 s 重新排序 |
4 、修改 vi 的启动文件
1) 创建一个 vi 的启动脚本,
如果是 windows 的话,使用 :edit $VIM/_vimrc
如果是 linux 的话,使用 :edit ~/.vimrc
2 )导入 vimrc 的范例文件 ‘:read $VIMRUNTIME/vimrc_example.vim'
3) 保存并退出之 ':wq'
看看你现在 vi 的效果:)
下面我介绍一下我的 vimrc 的配置,共参考 (“% 后面为我添加的注释内容 )
“ 选择 torte 配色方案,可以有好多种,参看安装目录下的 color 目录
colors torte
"shiftwidth = 4
set sw=4
" cindent options refer ‘:h cinoptions-values'
set cindent
set cino+=b1,g0,i0,(0,W1s
set cino=: 0g 0
“ enable showmatch
set sm
" tabstop=4
set ts=4
" expand tab to space
set et
“ enable line brea k
set lbr
" high light search
set hls
" use '+' to folding parenthesis
set foldmethod=manual
map + v%zf
set number
set textwidth=78
"set no compatible
set nocp
set nobackup
set title
set incsearch
" 使用 explorer 的 O 命令时,可将生成窗口放到右边,并激活
let g:explVertical=1
let g:explSplitRight=1
5 、添加插件
Vim 下可以添加两种插件, global_plugin 和 filetype_plugin 。
两种插件的差别在于, global_plugin 对所有文件类型都有效,比如 explorer,taglist 。而 filetype_plugin 只针对相应文件才有效。
Global_plugin 的插件都放在 vim 目录下的 plugin 目录中。
Filetype_plugin 的插件都放在 vim 目录下的 ftplugin 目录中。
一般来说,添加完插件后都应该将对应的帮助文件也添加到 vim 的帮助文档中去。一般的方法是直接拷贝插件的 .txt 文件到 vim 目录下的 doc 目录中。然后切换到 doc 目录下,启动 vim 然后执行“ : helptags . ”
4.1 添加 ctags 插件
从网络上下载最新的 ctags 压缩包( ctags56.zip )。解压缩后,将 ctags.exe 文件拷贝到 gvim.exe 所在的目录就行了。
这里不用拷贝 ctags 的帮助信息到 vim 中去,因为 vim 中本来就有 ctags 的帮助信息。
有了 ctgas 组件之后,用户可以
ctags ./ *. c ./*.h :再当前目录下建立所有 c 文件和 h 文件的索引
在文件中,将鼠标放在函数名或者变量名上后,可以使用“ ctrl+] ”“ ctrl+T ”在定义和使用处切换。
4.2 添加 taglist 插件
该组件必须要有 ctags 的支持。从网络上下载 taglist 的压缩包 (taglist_41.zip) 。解压缩之后,将 taglist.vim 拷贝到 vim 目录下的 plugin 目录中去。
将 taglist.txt 拷贝到 vim 目录下的 doc 目录中去。然后在该目录下启动 vim ,并运行“ : helptags . ”
该组件可以为我们简历一个 C 或者 C++ 源文件的索引列表。
运行 ”:Tlist” 命令。可以看到左边出现了一个包含方法名和变量名的窗口。
这里我们还要在 _vimrc 文件中添加如下两行。
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
可以将生成的窗口显示在右侧,并自动折叠不使用的变量名。
最后显示的结果如下: