Vi IMproved (VIM)是Bram Moolenaar开发的与 UNIX下的通用文本编辑器vi兼容并且功能
更强大的文本编辑器. 文本文件的编辑在计算机使用中简直就像吃饭一样平常, 对于程序
员和系统管理员来说更是必不可少. 能编辑文本文件的程序很多, 但能像VIM功能那样强大
的我想就不多了. 对于写程序来说VIM更是最适合不过.
目前, 大多数的Linux分版都带有VIM. 而且, 如果有源程序, VIM很容易在几乎所有的操作
系统中编译安装, 包括Windows. 你可以访问VIM的主页以获取源程序或更多信息.
尽管VIM功能十分强大, 但对于刚接触它的人尤其是用惯DOS的EDIT的人来说, VIM并不十分
易于掌握, 毕竟它兼容的是vi而不是EDIT. 本文旨在介绍VIM中我所了解的用法, 希望有更
多的人喜欢VIM. 应该指出的是, VIM中有太多的功能和命令, 有许多你并不用的着, 因此
没有记得必要, 有些我也不知道, 这要靠你来发现, 关键是多看"help", 多试.
1. vi的基本用法
vi的屏幕区域分为两个部分: 最下面一行是命令行, 一般用于提示信息或命令行输入; 除
此之外为正文显示区域. 跟EDIT不同的是, vi中存在三种模式: 普通(Normal)模式, 插入
(Insert)模式, 可视(Visual)模式.
进入vi后缺省即为普通模式. 新手一般初次进入vi后就狂敲一串字符, 结果发现vi一连串
莫名其妙的反应. 其实, 在vi的普通模式下, 任何按键包括普通字符都表示某个命令, 并
不表示在当前光标处插入字符. 常用的命令有: (注意区分大小写)
: 进入命令行
i或a 进入插入模式, 区别是: i进入插入模式后的光标在当前字符前面, a进入插入模式后
的光标在当前字符后面
v 进入可视模式
h, j, k, l 分别是光标左移, 下移, 上移, 右移 (一般来说你不会用到它来移动光标, 按
方向键就可以了)
x 删除一个字符
dd 删除一行
J 删除本行的回车符, 也就是把下一行并入本行末尾
r字符 替换光标所在字符为新字符
p或P 在当前位置粘贴剪贴板的内容, p粘在光标所在字符后面, P粘在前面
数字G 一动光标到第若干行, 如果直接按G则移动到最后一行
在普通模式中, 命令以按键形式输入. 而在命令行中, 命令以字符串形式输入. 下面是常
用的命令行:
:q 退出!(更确切的说应该是关闭当前文件)
:w 文件名 存盘, 如果还是保存为这个文件, 那么文件名不必加
:wq 存盘退出
:n 文件名 新建文件(同时关闭当前文件), 如果暂时不指定文件名也行
:help 帮助! 看完后用:q关掉窗口. 可以在help后面加某个帮助主题的名称, 如:help dd
和:help help
还有一点是, 如果某个命令得到警告(拒绝执行), 则要在命令的命令词后加叹号表示强制
执行. 比如你修改过文件, 但又想放弃存盘并退出, 如果输入:q, vi会告诉你文件已修改
, 这时, 你只能输入:q!退出. 又如用:w! a.txt表示把当前文件存为a.txt而不管a.txt是
否已经存在.
插入模式就不用多说了, 添加你的新内容吧. 不过, 你也许会发现BackSpace健和Delete健
的运用很受限制, 也不能像EDIT那样选择, 复制和粘贴. 这些都是由于这是vi的标准, 后
面我们将看到VIM扩展的功能可以解决这些问题. 记住按ESC退出插入模式, 回到普通模式
.
可视模式其实跟"可视"没有太大联系, 更确切的应该称为选择模式. vi里对复制粘贴的问
题是这样解决的: 首先在普通模式下移动光标到要选择的文本块开头, 然后按v进入可视模
式, 再移动光标到要选择的文本块末尾(注意光标所在字符是包含在块中的), 现在你有几
种选择: 按y复制到剪贴板, 按x剪切到剪贴板, 按d删除. 当你输入了其中一条命令后, v
i将会回到普通模式, 这时你可以按p或P粘贴. 在vi中复制粘贴需要切换模式, 因此挺麻烦
. 后面我们将利用VIM扩展的功能解决这个问题.
2. VIM的定制
VIM在vi的基础上扩展了许多功能和命令, 但是这些功能缺省是关闭的. 为了使用这些功能
, 我们需要编写一个vimrc文件. 在DOS/Windows版本的VIM中, 这个文件应放在VIM的目录
下, 文件名为"_vimrc". 在UNIX版本的VIM中, 这个文件一般可以放在用户的个人主目录下
, 文件名为".vimrc". VIM启动时将会把vimrc文件中的每一行作为命令行依次执行, 我们
可以在该文件中加入若干命令, 使VIM启动时自动开启一些有用的功能, 定义一些常用的快
捷键等.
下面是vimrc文件的示例: (请注意区分浏览器的换行与实际的换行.)
" 设置Backspace和Delete的灵活程度, backspace=2则没有任何限制
set backspace=2
" 设置在哪些模式下使用鼠标功能, mouse=a表示所有模式
set mouse=a
" 设置路径, 在f等命令中涉及此参数
" 对于Windows95编程, path可设为如
" set path=.,"C:\Program Files\Microsoft Visual Studio\vc98\Include",,
" 对于UNIX编程, path可设为如下
set path=.,/usr/include,/usr/include/qt,,
" 打开光标的行列位置显示功能
set ruler
" 设置跳格距离
set tabstop=4
" 设置自动缩进格数
set shiftwidth=4
" 打开自动缩进功能
set smartindent
" 设置哪些键可以行间绕转, 如下设置则Backspace和方向键等均可行间绕转
set whichwrap=b,s,h,l,<,>,[,]
" 根据当前文件语法自动变色. VIM识别上百种文本文件的语法, 如html, c++, java等
syntax on
" 以下定义等键, 解决vi复制粘贴的困难
vnoremap y "ryi vnoremap x "rxi
vnoremap d di
imap :if col(".")!=1 exe 'normal "rp'elseexe 'normal
"rP'endif`[i
nmap "rP
imap :if col(".")!=1 exe 'normal lv'elseexe 'normal v
'endif
nmap v
根据以上定义, 复制粘贴可以这样完成: (在普通或插入模式下)首先移动光标到要选择的
文本块开头, 然后按自动切换到可视模式, 再移动光标到要选择的文本块末尾, 按y复
制到剪贴板, 按x剪切到剪贴板, 按d删除. 当你输入了其中一条命令后, vi自动回到插入
模式, 这时你可以按粘贴. 以上操作无需按Esc回到普通模式, 因此比vi中方便.
上面所述仅仅是解决复制粘贴问题的方法之一, 是我所习惯的一种方法. 其实, 你还可以
尝试以下方法, 它们均无须进行多次模式切换:
1) 插入模式下按Ctrl+O再按v即可进入可视模式, 或者按Ctrl+O再按P或p即可粘贴. Ctrl
+O的详细用法请见后.
2) 命令 :behave mswin 可以使用EDIT风格的按键, 如Shift+方向键选择等, 详细情况请
看帮助.
3) 肯定还有其它方法.:-)
这里是我常用的.vimrc (2K)文件, 你可以参考一下. 如果遇到没有见过的命令或者参数,
可以自己看看"help".
3. VIM的其它命令
要真正使用VIM, 光靠vi的基本命令当然不行啦, 下面就来介绍更多的命令. 以下的命令,
有些是VIM特有的, 有些在vi中也存在, 我就不加区分了. 其中, 以":"开头表示该命令在
命令行输入, 以"i"开头表示这是插入模式下的命令, 其它则是普通模式下的命令.
表示按Ctrl+X.
3.1 使用帮助
< C-] > 在:help中, 遇到超连接可以按Ctrl+]跳转
在:help中, 按Ctrl+T往回跳转
3.2 打开多个文件
:split 文件名 切分出一个新窗口, 打开指定文件. 如果省略文件名, 则仍显示当前文件
, 可用于同时观察文件的不同部分.(注意跟:n的区别)
f 切分显示光标所指的文件名, VIM会在path中搜索该文件名, 比如常用它打开#inc
lude语句中的文件
当同时打开几个文件时, 按在各窗口之间切换
_ 当同时打开几个文件时, 按_使当前窗口最大化
3.3 字符串搜索替换
/字符串 向下搜索字符串
?字符串 向上搜索字符串
n 重复上一次搜索
:起始行,结束行s/搜索串/替换串/g 从起始行到结束行, 把所有的搜索串替换为替换串
:set ignorecase 设置忽略字母大小写
例如/hello从当前光标位置开始向下搜索hello, 不带字符串的命令/可重复上一次搜索,
相当于n. 又如:1,$s/hello/hi/g把全文中的hello改为hi, 其中$表示最后一行. 另外, 你
还可以先进入可视模式选择一段文本, 按:并输入s/hello/hi/g, VIM将在选中段中进行替
换操作.
搜索字符串用的是正规表达式, 其中许多字符都有特殊含义:
\ 取消后面所跟字符的特殊含义. 比如\[vim\]匹配字符串"[vim]"
[] 匹配其中之一. 比如[vim]匹配字母"v", "i"或者"m", [a-zA-Z]匹配任意字母
. 匹配任意字符
* 匹配前一字符大于等于零遍. 比如vi*m匹配"vm", "vim", "viim"....
\+ 匹配前一字符大于等于一遍. 比如vi\+m匹配"vim", "viim", "viiim"....
\= 匹配前一字符零遍或者一遍. 比如vi\=m匹配"vm"或者"vim"
^ 匹配行首. 例如/^hello查找出现在行首的单词hello
$ 匹配行末. 例如/hello$查找出现在行末的单词hello
\(\) 括住某段正规表达式
\数字 重复匹配前面某段括住的表达式. 例如\(hello\).*\1匹配一个开始和末尾都是"he
llo", 中间是任意字符串的字符串
对于替换字符串, 可以用"&"代表整个搜索字符串, 或者用"\数字"代表搜索字符串中的某
段括住的表达式.
举一个复杂的例子, 把文中的所有"abc......xyz"字符串替换为"xyz......abc"可以有下
列写法:
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
其它关于正规表达式搜索替换的更详细准确的说明请看"help".
3.4 插入补全
在插入模式下, 为了减少重复的击键输入, VIM提供了若干快捷键, 当你要输入某个上下文
曾经输入过的字符串时, 你只要输入开头若干字符, 使用快捷键, VIM将搜索上下文, 找到
匹配字符串, 把剩下的字符补全, 你就不必敲了. 这样, 编程序时你起多长的变量名都没
关系了, 而且还可以减少输入错误. 我认为, 插入补全是VIM最为突出的一项功能.
i 向上搜索, 补全一个词. 例如, 上文中出现过filename这个词, 当你想再输入fil
ename时, 只要按f即可. 假如VIM向上搜索, 找到以f开头的第一个匹配不是filenam
e, 你可以继续按搜索下一个匹配进行补全. 当然, 如果你想一次就成功, 你可
以多输入几个字符比如filen再按补全
i 向下搜索, 补全一个词
i 补全一行. 比如你写过一行for (int i=0;i<100;i++), 你想再写一模一样的
一行, 只要输入for即可. 如果补全出来的不是你想要的那一行, 你可以按或选择上一个或下一个匹配行
i 在文件系统中搜索, 补全一个文件名
如果按或补全一个词, 在当前文件中没有找到匹配, VIM将搜索#include语句中
的文件, 而文件的位置将在path中搜索.
3.5 键的定义
在VIM中你可以定义一个键, 按了这个键等于按了某一串预定的键. 比如
:map! ddi
表示如果你在插入模式下按就相当于连续按了ddi, 这将会使VIM退回到普通模
式, 删除一行, 再进入插入模式.
map命令有许多变化形式, 每种变化形式所定义的键只在某些模式下有效, 而在其它模式下
无效. 你需要根据情况使用正确的变化形式:
:nmap 键只对普通模式有效
:imap 键只对插入模式有效
:vmap 键只对可视模式有效
:cmap 键只在命令行下有效
:map 键在普通模式和可视模式都有效
:map! 键在插入模式和命令行下都有效
还要注意, 如果你定义:map d di这将引起循环定义错误. 这时, 你需要使用:noremap d
di来定义. 同样, noremap也有对不同模式的变化形式.
比如, 你想在文件的每一行的倒数第二个字符处插入字符串"abc", 你可以定义
:nmap $hiabcj
在普通模式下按一次将会: 光标移到行末, 光标左移一格, 进入插入模式, 输入"ab
c", 退回到普通模式, 光标下移一行. 不停地按将解决问题. 这是我编程时临时处理
多行重复操作的常用手段, 当然, 这是一种笨办法.:-) 而上文写到的对的定义则
是map更复杂的用法. 你还可以定义
:map :w:!gcc -o %< -I/usr/include/qt -lqt %
:map :!./%<
实现按编译当前文件, 按执行.
在插入补全当中提到的补全一行需要按, 如果你觉得麻烦, 你可以定义
:inoremap
减少击键次数. 同样, 对也可以作类似定义.
3.6 其它命令
:!命令行 执行一条外部命令
i 跳转到光标所指标识符的定义行. 比如你在编程时遇到一个函数CreateWindow, 想
看它的定义语句, 你就可以在它上面按i, VIM将打开新窗口, 把光标移到它定义的地
方. 当然, 前提是在当前文件或它的#include文件中存在CreateWindow的定义. 这也牵涉到path的设置. 不过, VIM找得不一定很准
K 看光标所指标识符的man帮助页
i 把上一行对应列的字符抄下来
i 把下一行对应列的字符抄上来(写这一行时我就用了)
光标所指整数加一
光标所指整数减一
:X 对当前文本文件加密
我所熟悉的VIM的功能已经介绍得差不多, 剩下的要靠你自己来学习了. 其实, VIM的功能还有很多很多. 还是那句话, 多看"help", 多试. VIM的帮助还是挺容易看的, 相信你看了
以后会有更多的惊喜. 如果你有什么心得或者新发现, 欢迎跟我讨论.
希望你喜欢VIM.
尊重作者 转载请注明出处52mud.com