1. 介绍
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的。
2. vi的基本概念
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1) 命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
3. vi的基本操作
a) 进入vi
在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
$ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于[命令行模式(command mode)],切换到[插入模式(Insert mode)]才能够输入文字。
b) 切换至插入模式(Insert mode)编辑文件
在[命令行模式(command mode)]下按一下字母[i]就可以进入[插入模式(Insert mode)],这时候你就可以开始输入文字了。
c) Insert 的切换
您目前处于[插入模式(Insert mode)],只能一直输入文字,如果发现输错了字!想用光标键往回移动,将该字删除,就要先按一下[ESC]键转到[命令行模式(command mode)]删除文字。
d) 退出vi及保存文件
在[命令行模式(command mode)]下,按一下[:]冒号键进入[Last line mode],例如:
: w filename (输入 [w filename]将文本以指定的文件名filename保存)
: wq (输入[wq],存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
4. 命令行模式(command mode)功能键
1). 插入模式
按[i]切换进入插入模式[insert mode],按“i”进入插入模式后是从光标当前位置开始输入文件;
按[a]进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按[o]进入插入模式后,是插入新的一行,从行首开始输入文字。
2). 从插入模式切换为命令行模式
按[ESC]键。
3). 移动光标
vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母[h]、[j]、[k]、[l],分别控制光标左、下、上、右移一格。
按[ctrl]+[b]屏幕往“后”移动一页。
按[ctrl]+[f]屏幕往“前”移动一页。
按[ctrl]+[u]屏幕往“后”移动半页。
按[ctrl]+[d]屏幕往“前”移动半页。
按数字[0]移到文章的开头。
按[G]移动到文章的最后。
按[$]移动到光标所在行的“行尾”。
按[^]移动到光标所在行的“行首”
按[w]光标跳到下个字的开头
按[e]光标跳到下个字的字尾
按[b]光标回到上个字的开头
按[#l]光标移到该行的第#个位置,如:5l,56l。
4). 删除文字
[x]每按一次,删除光标所在位置的“后面”一个字符。
[#x]例如,「6x」表示删除光标所在位置的“后面”6个字符。
[X]大写的X,每按一次,删除光标所在位置的“前面”一个字符。
[#X]例如,「20X」表示删除光标所在位置的“前面”20个字符。
[dd]删除光标所在行。
[#dd]从光标所在行开始删除#行
5). 复制
[yw]将光标所在之处到字尾的字符复制到缓冲区中。
[#yw]复制#个字到缓冲区
[yy]复制光标所在行到缓冲区。
[#yy]例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
[p]将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
[+]+[p]将缓复制到剪切板上
6). 替换
[r]替换光标所在处的字符。
[R]替换光标所到之处的字符,直到按下[ESC]键为止。
7). 回复上一次操作
[u]如果您误执行一个命令,可以马上按下[u],回到上一个操作。按多次“u”可以执行多次回复。
8). 更改
[cw]更改光标所在处的字到字尾处
[c#w]例如,[c3w]表示更改3个字
9). 跳至指定的行
[ctrl]+[g]列出光标所在行的行号。
[#G] 例如,[15G],表示移动光标至文章的第15行行首。
5. Last line mode下命令简介
进去[last line mode]的方法是从[command mode]下按[:]就进入[last line mode].
A) 列出行号
[set nu]输入[set nu]后,会在文件中的每一行前面列出行号。
B) 跳到文件中的某一行
[#] #号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了。
C) 查找字符
[/关键字]:先按[/]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往后寻找到您要的关键字为止。
[?关键字]:先按[?]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往前寻找到您要的关键字为止。
D) 保存文件
[w]在冒号输入字母[w]就可以将文件保存起来。
E) 离开vi
[q]按q就是退出,如果无法离开vi,可以用q!强制离开vi。
[qw]一般建议离开时,搭配w一起使用,这样在退出的时候还可以保存文件。
F)字符串替换
s/[search]/[replace] / 替换当前行第一个。
s/[search] /[replace] /g替换当前行所有。
n,$s/[search]/[replace] / 替换第 n 行开始到最后一行中每一行的第一个。
n,$s/[search]/[replace] /g替换第 n 行开始到最后一行中每一行的第一个所有。
注:n 为数字,若 n 为 .,表示从当前行开始到最后一行
%s/[search]/[replace]/ 替换每一行的第一个。(等同于 :g/[search] /s//[replace]/)
%s/[search]/[replace]/g替换每一行中所有。(等同于 :g/[search]/s//[replace] /g)
注:可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#search/#replace/# 替换当前行第一个 search/ 为 replace/
6. vim大小写转换
~ 将光标下的字母改变大小写
3~ 将光标位置开始的3个字母改变其大小写
g~~ 改变当前行字母的大小写
U 将可视模式下选择的字母全改成大写字母
u 将可视模式下选择的字母全改成小写
gUU 将当前行的字母改成大写
3gUU 将从光标开始到下面3行字母改成大写
guu 将当前行的字母全改成小写
gUw 将光标下的单词改成大写。
guw 将光标下的单词改成小写。
7. Vimdiff 用法
手工做code merge的时候,经常会用到文件比较与同步的工具。vimdiff是比较好的工具。使用者只要把注意力集中在两个文件的差异上。
首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。
7.1. Vimdiff启动方法:
1. #vimdiff FILE_LEFT FILE_RIGHT
2. # vim -d FILE_LEFT FILE_RIGHT
3. # vim FILE_LEFT然后在vim的ex模式(也就是"冒号"模式)下输入:vertical diffsplit FILE_RIGHT
7.2. 交换两个窗口的位置
如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:
1. Ctrl-w K(把当前窗口移到最上边)
2. Ctrl-w H(把当前窗口移到最左边)
3. Ctrl-w J(把当前窗口移到最下边)
4. Ctrl-w L(把当前窗口移到最右边)
其中1和3两个操作会把窗口改成水平分割方式。
7.3. 光标移动
接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
:set noscrollbind
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c
反向跳转是:
[c
#]c,可以跳过一个或数个差异点,从而实现跳的更远。
7.4. 文件合并
文件比较的最终目的之一就是合并,以消除差异。
[dp (diff "put")]希望把一个差异点中当前文件的内容复制到另一个文件里。
[do (diff "get")]希望把另一个文件的内容复制到当前行中。
[Ctrl-w, w]如果希望在两个文件之间来回跳转。
修改后vimdiff会自动重新比较文件,但是会有失败的时候。
[:diffupdate]刷新比较结果
7.5. 对两个文件同时进行操作
退出:
:[qa] (quit all)
:[wa] (write all)保存全部文件。
:[wqa] (write, then quit all)保存全部文件,然后退出。
:qa! (force to quit all)退出的时候不希望保存任何文件。
上下文的展开和查看。
:[set diffopt=context:3] 修改上下文相同文本显示命令格式(默认是6行)
[zo] (folding open)展开被折叠的相同的文本行。
[zc] (folding close)重新折叠相同的文本行。