如果在linux/unix上做系统维护或者开发,vim是最常用的编辑器之一,特别是在远程登录,没有图形界面的情况下,几乎是唯一选择。vim入门很简单,易于上手。深入使用,会逐步发现有很多快捷方式可以有效提高工作效率,值得学习。俗话说磨刀不误砍柴工。
vim及其前身vi历史悠久,值得信赖。狂热者认为vi远胜UltraEdit,notePad之类的图形界面编辑器,不过我想这种说法仅限于开发或者系统维护人员。在ubuntu上做密集开发时,经常需要进行编辑配置文件,查看日志,更喜欢vi的简单,快速,高效。
1976年左右Bill Joy开发了vi,技术不断进步,vi的各种变种也不断涌现,其中移植性最好、特性最多、使用最广的当属VIM,VIM主要是Bram Moolenaar开发的。vi是“Visual Interface”的缩写,而vim则表示 vi improved。通常也不用搞那么清楚,在ubuntu上vi命令就是指向vim的一个软链接。vim即vi,vi即vim,为了方便,统称vi。
vim的模式
Vim中有三类模式,正常模式(normal),插入模式(insert)和可视模式(visual)。
正常模式中可以执行命令,很多人也把这种模式称为命令模式。默认情况下,Vim启动后会进入这个模式。
插入模式中可以插入/编辑文本。
可视模式中可以可视化地选择一段文本,然后仅针对这段文本执行命令或操作。
在模式中切换
默认情况下,启动vim后进入到normal模式,Normal下输入i到insert模式,按<esc>返回normal模式。normal模式下按v进入visual模式。上面是最简单的切换方式。更多的切换方式有高人做了如下这个图:
+---------+ i,I,a,A,o,O,r,R,s,S +----------+ | Normal +---------->------------+ Insert | | mode | | mode | | +----------<------------+ | +-+---+---+ <Esc> +----------+ | | | | | | | | | | v,V V ^ <Esc> | | | | | | | | +---+---+----+ | Visual | | mode | +------------+
进入:vi(新文件)或者vi filename
退出:
:wq! --强制保存退出
:wq -- 保存退出
:x -- 作用和:wq 一样
ZZ -- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式)
:q -- 退出,如果有修改会提示保存
:q! -- 不保存而退出
i:在当前字符之前插入
I:在当前行首插入
a:在当前字符之后插入
A:在当前行末插入
o: 在当前行下面打开一个新行进行插入
O:在当前行上面打开一个新行进行插入
x -- 删除当前字符,5x,删除从当前关闭位置开始向后的5个字符
cw -- 删除当前一个字,并进入编辑模式
dw -- 删除当前一个字,但仍处于命令模式
d0 -- 删除当前光标到本行行首的所有内容
d$ -- 删除当前光标到本行行尾的所有内容
D -- 同d$,更方便
dd -- 删除当前行
dgg -- 删除当前行至文件头的内容。
dG 删除当前行到文件末尾的所有内容。
ddp -- 上下两行掉换位置,实际上这个命令是由两个命令先后执行的结果,先dd,将当前行删除并copy到寄存器中,然后使用p命令将这行的内容paste到下一行(一个实用的命令组合)
:#,#d -- 例如,:12,37d 将删除第12~37行之间的所有文本,包括第12和37行
J(大写字母)表示,其功能是把光标所在行与下面一行合并为一行
nJ (大写字母)表示,其功能是把光标所在行与下面n行合并为一行
yy 拷贝当前行到缓存区
dd 删除当前行并拷贝到缓存区,相当于剪切
p:将缓存区的内容拷贝到下一行
P:拷贝到上一行
nyy:例如5yy,拷贝5行内容到缓存区。5dd类推
:n -- 跳到n行,如:5,跳到第5行
:$ -- 将光标定位到最后一行
0 -- 将光标定位到本行的行首
$ -- 将光标定位到本行的行尾
G -- 将光标定位到本文章的最后一行,与: $功能相同。
w,b -- 向后/者向前移动一个单词
- 将光标定位到上一行的行首
+ 将光标定位到下一行的行首
fb 将光标向前移到当前行上的下一个字母b(或者其他的任意指定的字符)
Fb 将光标向后移到当前行上的上一个字母b(或指定的字符)
{ -- 段首
} -- 段尾
( -- 句首
) -- 句尾 (还没搞清楚段和句的分别)
% -- 跳至匹配括号,支持原括号-(),大括号{},方括号[],但不支持尖括号<>(为什么?)
查找
set ic------搜索(忽略大小写)
set noic----搜索(区分大小写)
/str -- 向下搜索str
?str-- 向上搜索
n -- 向前重复搜索
N -- 向后重复搜索
替换
:%s/regexp/replacement/g替换文件中所有匹配式样
:%s/^/### 在所有行开头增加###
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky,n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
撤销 --- u: 撤销上一次的更改
重做--- ctrl+r (可以进行多次undo和redo)
ctrl+f: 向下翻页
ctrl+b:向上翻页
ctrl+U和ctrl+D分别是向上和向下滚动半屏。
ctrl+E和ctrl+Y分别是向上和向下滚动一行。
用外部的sort 程式協助排序
:1,$!sort -k 3
表示從第1列開始, 以第3 欄資料進行排序
:1,$!sort -k 4 -t"."
表示從第1列開始, 以第8 欄資料進行排序, 分欄字元是 "."
結果會如下 :
192.168.1.20
192.168.1.218
192.168.1.22
218 竟然排在 22 的前面? 是因為以"文字順序"排序的關係
:1,$!sort -k 4 -t"." -n
以数字大小排序
乱码/文件编码 相关设置
set fileencodings=utf-8,gb2312,gbk,gb18030
set fileencodings=utf-8,gb2312,gbk,gb18030 set termencoding=utf-8 set encoding=prc
有时候经常在编辑一个文件的时候打开另一个文件来做查看。这时如果掌握了同时编辑多个文件的技巧,就不要反复退出,打开,再退出,再打开的看起来傻傻的步骤了
:set 显示设置的所有选项
:set all 显示所有可以设置的选项
:set nu/set nonu:显示或者取消行号(nu-number的简写)
view filename -- 有时只需要查看而不需要修改,为了避免误写文件,可以使用这个命令来打开而不编辑。(使用w!还是可以强制保存内容的)
最后,来一张vim键盘快捷键图
中文在线手册
http://vimcdoc.sourceforge.net/doc/usr_toc.html
http://vimcdoc.sourceforge.net/doc/intro.html
vimdoc -- http://vimdoc.sourceforge.net/ englisth