vi有两种模式:命令模式与插入模式。
按下ESC,可回到命令模式。
:e!——当想要消除所有的编辑结果,回到原来的文件时。
:q!——当想要消除所有的编辑结果,然后直接离开vi。
:w——将缓冲区中的内容写入(保存)文件中,但不离开vi。
:q——离开编辑器。
:wq——写入文件同时离开编辑器。这是无条件写入,即使文件没有被修改也一样。
:x——写入文件同时离开编辑器。只有文件被修改过时才会写入。
大部分的vi命令遵循如下模式:
(command)
(number
)(text object
)
或者相等的模式:
(number
)(command
)(text object
)
它们的工作方式是这样的:number和command为可选项。如果没有这两部分,则只是单纯的光标移动命令;如果加上number,则出现移动多次的效果;结合command(c、d、y等等)与text object,则会得到编辑命令。
移动光标
vi移动光标的命令包括:
-
上、下、左、右键——一次一个字符(character)。
-
前进或后退一格文本块(text block)——一次一个单词、句子或段落。
-
在文件中一次一屏(screen)地前进后退。
单一的移动
h、j、k、l,这四个键可以移动光标:
h:向左一个字符
j:向下一行
k:向上一行
l:向右一个字符
数值参数
你可以在移动命令的前面加上数字。如命令4l把光标向右移动4个字符,命令3k把光标向上移动3行。
在一行中移动
0:移动到一行的开头
$:移动到一行的结尾
按照文本块来移动
w命令使光标前进一个单词,符号与标点也算是一个单词。
W命令使光标前进一个单词,但不算符号与标点。
b命令使光标后退一个单词,符号与标点也算是一个单词。
B命令使光标后退一个单词,但不算符号与标点。
也可以在b、B、w、W命令前加上数字,代表移动多少个单词。
若想移动到特定行,可以使用命令G。只按G将移动到文件的结尾,1G则可到达文件顶端,42G可移动到第42行。
简单编辑
在vi中,只要几个简单的键,就可以做出这些动作:i表示插入,a表示添加,c表示更改,d表示删除。
移动与复制文本,则需要用到两个命令。移动时先用d做删除,再用p进行放置;复制时先用y做“拖拽”的动作,再用p进行放置。
复制文本
使用两个命令——y(拖拽)与p(放置),就可以复制任何数量的文本,并放置到另一个地方。拖拽命令会将选中的文本放到特殊的缓冲区中,一直保留到下一个拖拽命令(或删除命令)发生为止。
快捷键yy用于拖拽一整行文本,就像dd与cc一样。
重复或撤销上一个命令
每一个编辑命令均存储到一个临时的缓冲区,知道发出下一个命令为止。
想要重复相同的编辑命令时,可以使用重复命令——句号(.)。
想要撤销上一个编辑命令时,可以使用撤销命令——按下u即可。
插入命令的数值参数
插入命令也接受数值参数。例如,输入50i* ESC会插入50个星号;25i*- ESC则会插入50个字符(25对星号与连字符的组合)。
快速移动位置
本章内容包括:
-
根据屏幕来移动
-
根据文本块来移动
-
根据搜索模式的结果来移动
-
根据行号来移动
跟据屏幕来移动
^F:往前滚动一整屏
^B:往后滚动一整屏
^D:往前(下)滚动半屏
^U:往后(上)滚动半屏
其中^符号表示CTRL键。^F表示按着CTRL键并同时按下f键。
根据搜索模式的结果来移动
搜索命令是特殊字符/(斜线)。格式为:/pattern。模式输入完毕之后,按ENTER结束命令。要往回搜索,则不是输入/,而是输入?。格式为:?pattern。
重复搜索的命令:
n:往同一个方向重复搜索。
N:往相反的方向重复搜索。
ex编辑器
想在vi中使用ex命令,你必须输入特定字符:(冒号)。输入命令后,按ENTER来执行。
在ex编辑器中执行:vi命令,可以让你从ex进入vi。
:set nu命令可以将所有的行号显示在屏幕左边。
:set nonu命令可以取消显示行号。
:=命令列出文件的总行数。
:.=命令列出当前所在行的行号。
:/pattern/=命令列出pattern第一次出现时的行号。
每一个ex编辑命令都需要知道要编辑的行号。而对于ex的move和copy命令,还必须提供文本移动或复制的目的地。
常用的ex命令与缩写整理如下:
Full Name
|
Abbreviation
|
Meaning
|
delete
|
d
|
删除行
|
move
|
m
|
移动行
|
copy
|
co
|
复制行
|
指定行地址的方法有下面几种:
-
指定明确的行号
-
用符号来指定相对于当前位置的行号
-
标识某些行的搜索模式作为地址
举例:
:3,18d ——删除第3行到第18行。
:160,224m23——将第160行到第224行移到第23行之后(类似vi中的delete与put)。
:23,29co100——将第23行到第29行复制到第100行之后(类似vi中的yank与put)。
行寻址符号
你也可以用符号表示行地址。点号(.)表示当前这一行;$表示文件的最后一行。%表示文件中的每一行,与1,$组合的意义相同。例如:
:.,$d——删除当前这一行到文本结尾间的文本。
:20,.m$——将第20行到当前这一行间的文本移到文件结尾。
:%d——删除文件中的所有的行。
:%t$——将所有的行复制到文件结尾。
除了绝对行地址之外,还可以指定相对于当前这一行的地址。+与-的操作类似于算数操作。放在数值前面时,其表示加上或减去后面的数值。例如:
:.,.+20d——删除当前这一行到20行之后的行之间的文本。
:226,$m.-2——将第226行到文本结尾间的行移动到当前这一行的两行之前。
:.,+20#——显示当前这一行及向下20行之间的行号。
保存一部分的文件
有时你会想将一部分编辑中的文件保存为新文件。比如:
:230,$w newfile——将第230行到文件结尾保存成名为newfile的文件。
:.,600w newfile——将当前行到第600行之间的文本保存成名为newfile的文件。
附加内容到已保存的文件
例如:
:1,10w newfile——将第1行到第10行保存为newfile。
:340,$w >> newfile——将第340行到文本结尾的所有行追加到newfile中。
全局替换
在全局替换中,ex编辑器会检查每一行中有没有某个字符模式。在包含这个模式的每一行中,ex会用新的字符串来替代这个模式。
全局替换实际上会用到两个ex命令::g(global,全局)与:s(substitute,替换)。
替换命令的语法如下:
:s/old/new
它会将当前这一行中第一个出现的模式old改为new。其中的/(斜线)用来分割命令的各部分。
:s/old/new/g
会将当前这一行中的每一个old更换为new,并不是指更换第一个。
在:s前面加上地址,可以将有效范围扩展到超过一行。例如:
:50,100s/old/new/g——将第50行到100行之间的old改为new。
:1,$s/old/new/g——将整个文件中的old改为new。
:%s/old/new/g——将整个文件中的old改为new。
如果希望在每一个替换之前做确认,可以在替换命令的结尾加上c选项(代表confirm)。
:1,30s/old/new/gc
与上下文相关的替换
另一种稍微复杂的全局替换。让你搜索一个模式,在找到包含模式的某一行时,对另一个字符串做替换。可以想成是与上下文相关的替换。
语法如下:
:g/pattern/s/old/new/g——在全局范围内遇到包含pattern的行,将old更改为new。
高级编辑方法
执行Unix命令
使用vi编辑时,可以显示或读入任何Unix命令所产生的结果。感叹号(!)会告诉ex创建一个shell,并将后续文本是为Unix命令:
:!command
例如:
:!date
vim的多窗口功能
打开新窗口最简单的方式就是使用:split(水平分割)或:vsplit(垂直分割)。
:split——新建水平分割窗口并显示相同文件
:split otherfile——新建水平分割窗口并打开显示其它文件