文章及图片原载于 bibodeng think beyond, 欢迎访问 :)css
本章将会向你介绍使用vi来进行编辑,本章被当作是初级教程。在本章你将会学习怎样移动光标,还有怎样作简单的编辑工做。若是你历来没有使用过vi编辑器,那么你应该阅读整章内容。程序员
后续的章节将会带领你拓展你的技能,来更加快速更加高效地完成你的编辑工做。其中最大的优势就是对熟手来讲,那就是你能够有不少选项可用。(其中对菜鸟来讲最大的好处就是vi真的太TMD多命令了。)web
你不能单纯靠记忆单个vi命令来学习vi编辑器,能够考虑从本章介绍的基本命令开始学起。记住一点,这些命令的使用模式都是同样的。编程
当你学习vi的时候,将你能作的工做更多地代理给编辑器来作,而后找到可以完成该任务的命令。在后面的章节,你将会学习更多高级的特性,可是在你掌握高级技巧以前,先把简单的掌握好!行吗?vim
本章将会覆盖:缓存
vi有两种模式:命令模式和插入模式。当你用vi进入一个文件的时候,你所处的是命令模式,此时编辑器正在等待着你输入命令。一些命令可让你移动到文件的任何位置,能够进行编辑,能够进入编辑模式来添加新文本。也可使用退出编辑文件回到unix的命令(保存或者丢弃修改均可以)。app
你能够假设这两种不一样的模式表明着不一样的键盘,在插入模式,你的键盘的功能就像一个打字机,打出你想要的内容,而在命令模式,每一个键都是有命令的含义,能够指示编辑器作什么。编辑器
你有许多的方法告诉vi编辑器你想进入插入模式,其中一种最多见的就是按下 i 这个键.i不会出如今屏幕上,可是你按下了以后,接下来按下的任何按键将会出如今屏幕中,而且会被存储到内存缓冲区内。光标表示当前的所在位置。当你想退出插入模式的时候,按下ESC键,回到命令模式。按下ESC键光标会退后一格,因此你将看到光标在你输入的最后一个字符上面。ide
例如,假设你新建了一个文件,而且想要输入"introduction",若是你按下的按键顺序是这样的iintroduction,那么你的屏幕中将会看到这样的结果:学习
introduction
vi有一个选项能够设置一个右边距离,而后一行到达必定长度会自动换行,可是如今,你可使用ENTER键来换到下一行。
有时候你不知道是在插入模式仍是在命令模式,当vi的反应不像你所预期的那样,那么按下ESC键一次或者两次来检查你所处的模式。当你听到beep声,那么已经在命令模式下了。
你可能只须要一丁点的时间来在插入模式插入新文本,可是将会花多一点时间在修改已有文本上。
在命令模式下,你能够将光标移动到任何你想要的位置,当你开始编辑时,你老是想把光标放到相应的位置,不管你进行的是什么操做(修改、删除、仍是复制),你都想要尽量飞快地到达你想要操做的位置。
下面是一些移动光标的命令:
- 上下左右,一次一个字符距离
- 字符块为单位向前或者向后,例如单词,句子,或者段落
- 在文件前移或后移,一次一个屏幕空间
按键h,j,k和l,这些刚恰好在你手指下面的按键,能够移动光标:
h 左移一格
j 下移一行
k 上移一行
l 右移一格
你能够优化移动命令,方法是使用数字。图表2-2展现了命令4l怎样移动光标到右边第四个空格处的,就像你按下了4次的l命令(llll)。
屡次命令可让你有更多的选择以及效率来发挥你学习到的命令的做用。记住它,当你学到更多命令的时候,你将受益无穷。
当你保存了practice文件,vi将会告诉你该文件有多少行。一行未必和屏幕上显示的行同样长(一般限制为80个字符),一行结束是以ENTER键换行来结束的。若是你在按下ENTER键以前输入了200个字符的内容,vi将视这200个字符为一行(虽然可能会被分做不少行来显示在屏幕上)。也就是说,一行是以行结束标志来决定其长度的。
咱们前面第一章的时候提到过,咱们能够设置右边距离,vi将会自动在距离右边界必定距离的地方插入一个换行,这个距离(right margin)是能够设置的。选项wrapmargin(简写是wm),你能够用下面的命令来设置wrapmargin:
:set wm=10
0 (零) 移动到所在行的开头
$ (美刀符号) 移动到所在行的尾部
当咱们输入文本到你的文件中,一切都是那么完美。可是你会发现当你打印错误或者想要优化你的短语,或者当你的程序有一个bug的时候。当你输入字符的时候,你颇有可能要修改它们,删除,或者移动,甚至复制。图2-3就向你展现了一些对文本的修改。修改是用文本纠错标记的。
在vi中你能够完成上图所示的编辑任务,仅仅须要一些简单的按键命令:i 插入,a能够在光标后面追加文本,c 能够更改文本,d删除。要移动或者拷贝文本,你可能须要一些组合命令,你能够用d 删除来移除文本,而后用p命令来放到须要的地方(粘贴)。你能够单纯地拷贝文本,用y命令(yank),而后用p来(put)。每一个编辑都将会在本章进行描述。图表2-4将会展现完成图表2-3所示修改的vi命令。
you can scroll
the page, move the cursor, delete
lines, and insert characters.
由当前光标所示的位置,来编辑句子。输入下面的命令:
a, 你能够在任何地方的后面追加文本,只须要一个简单的a命令,这个命令的作的工做和i差很少,可是a和i不一样的是,它在光标所在的后面插入,而不是在光标所在位置的前面插入。你也许已经发现了当你按下i命令进入插入模式的时候,光标不会移动,直到你输入文本为止。当你按下a命令进入插入模式时,光标将会移动到右边一格。当你输入文本时,将追加文本到原始光标所在位置的后面。
c,你能够经过使用c命令替换任何的文本。要告诉c命令有多少文本要被修改,你须要将c和移动命令w或b结合在一块儿使用。使用此种方法,移动命令就充当了文本对象。例如,c能够像下面同样使用,将修改从光标处开始到特定位置:
cw 修改从光标到当前单词结束位置之间的文本
c2b 修改从光标到后退两个单词的位置之间的文本
c$ 修改从光标到行尾之间的文本
c0 修改从光标到行首之间的文本
当组织好一个修改命令后,你能够用任意长度的文原本替代上面所说的文本,没有字符,一个字符,或者几百个字符均可以。c 命令,就像 i 和 a 同样,带你进入插入模式,按下ESC键退出插入模式就行了。
影响只会限制在当前行,vi 将会标记将被修改的尾部,以一个$来标识。因此你能够看到哪部分被修改了。(vim和vi稍微有不一样,vim会删除掉单词,而后让你输入,不会用$标记出修改部分的尾部)
要修改一个单词,将c命令(change)和w命令(word)结合使用,你就能够用待会输入的文本(或长或短)替代一个单词的长度,cw能够被看做是“删除指定的单词,并插入新文本直到按下ESC键以前。假设在你的practice文件中有以下的行:
with an editor you can scroll the page.
而后你想要修改“an“为a,你只须要修改一个单词:
cw也能够只修改单词的一部分,例如将spelling修改成spelled,则能够将光标移动到i处,而后按下cw命令,则能够输入ed以替换ing,按下ESC键退出编辑模式,则完成编辑。
vi命令的通常格式
在刚才的修改命令中,你可能发现vi命令有以下的模式:
(命令)(文本对象)
命令就是修改命令c,文本对象就是移动命令所描述的从光标到目标位置之间的预期的字符串(如w,$,0)。c命令不是惟一的须要接文本对象的命令,d(删除)命令以及y(yank 复制)命令也遵循这一的模式。记住移动命令是能够带参数的,因此数字能够添加到c,d,y命令中(例如 d2w或2dw均可以删除连续的两个单词),记住了这点,你就会发现其实不少命令都有下面的模式:
(命令)(数字参数)(文本对象)
或者将数字参数提早(等效的):
(数字)(命令)(文本对象)
它们的原理是:数字和命令是可选参数,没有了它们剩下的就是一个移动命令了,当你加上一个数字参数时,那么命令就变成了一个加倍移动(表示尾部和首部的$/0除外)。另一方面,与c,d,y结合,则能够变成一个编辑命令,当你意识到能够有多少种组合的方法时,你就会知道vi有多么强大的威力了!
cc命令能够替换掉整个当前行,cc修改整个行,后来输入的文本将会替代该行,直到按下ESC键退出插入模式为止。光标在行内什么位置不重要,cc都会替换掉整行。像cw这样的命令和cc命令的工做模式是不同的,使用cw时,原先的文本依旧存在,直到你覆盖了它,而后全部的原先的内容在你按下ESC以后消失,而使用cc命令时,原先的文本将会被擦除,留下一个空行来插入文本。覆盖方法发生在影响小于一行的修改命令中,而“空行”方法发生在影响整行或更多行的命令中。 C(大写C)替换从当前光标所在位置到该行行尾的全部字符,它具备和c$同样的功效。命令cc和C是其余命令的快捷方式,因此它们不遵循通常的vi命令规则,你将会看到相似的其余快捷键,这将会在后面的删除和复制命令中讲到。
r另外一个替换编辑命令r,r替换掉光标所在位置的单个字符为你输入的另外一个字符,你无需按下ESC键来返回命令模式,这里有一个拼写错误:
Pith a screen editor you can scroll the page
按下rW 替换当前光标所在字母为W
s,假设你想修改几个字符,而不是一个单词,部分替换命令s,它自己只替换单个字符,而后插入若干个字符(以多个字符替换单个字符),就像修改命令(c)同样,文本最后一个字符将会用一个$符号来标记(貌似个人机子上的vim没有这个),而后你就能够清楚地看到你有多少字符被修改。
S(大写S),让你修改整行,与命令C相比,C只删除从光标到行尾的文本,而S命令删除整行,无需关心光标在行的何处。而后vi将你带入插入模式,加上数字前缀可让你替换多行。s和S命令都会将你带入插入模式,当你完成了编辑时,按下ESC键退出插入模式。(老调重弹了不少次了)
R 命令,就像他的小兄弟r同样,是用来替换文本的,只不过R简单地进入叠印(覆盖)模式,而后一一地修改,而r只修改一个字符。
修改一个字符的大小写是一种特别的替换,波浪号 ~ 命令,能够将一个小写字母改写成大写字母,或者将一个大写字母改写成小写字母。将光标移动到你想要修改的字符所在的位置,而后输入 ~ 命令,字符的大小写将会改变,光标将会移动到下一个字符。
在早期版本的vi中,你不能使用数字前缀来修饰此命令,可是在如今的vi中,容许使用数字前缀做为参数,而后能够一次修改若干字符的大小写。若是你想一次修改若干行的大小写的话,你必须用unix的tr等命令过滤文本,将会在第七章讨论。
d命令,你能够删除文件中的任何文本,毫无疑问使用删除命令d就能够了。就像修改命令同样,删除命令须要一个文本对象(须要修改的文本的数量或者范围)。你能够删除一个单词,使用的是dw命令,删除行使用dd(或者D)命令,或者其余种种移动命令。在这些删除命令中,你须要把光标移动到要作修改的地方,而后用d命令结合文本对象(例如w)来工做。
dw 假如你有以下的文本:
Screen editors are are very popular,
since they allow you to make
changes as you read through a file.
光标位置为红色字体所示,你想要删除第一行的are:
dw 删除一个单词,且是从光标处到所在单词的尾部。记住,跟随单词的空格也会被删除。dw也能够完成单词内的部分删除,以下面的例子:
since they allow ed you to make
你想要删除掉ed(allowed的末尾)。能够用下面的键:
dw会删除下一个字母以前的空格,可是在本例中咱们并不想这么作,要保留单词间的空格,则使用de命令,这样就只删除到文件的末尾了。使用dE命令能够删除到单词的末尾,包括标点符号。
你也能够向后删除(db,聪明的你能够想象一下它的效果)或者删除到一行的末尾或者开头(d$ 和 d0).
dd 命令删除光标所在的整行,dd不会删除行的一部分,要么全删,要么不动。就和其余彻底命令 (如cc)同样, dd是一个很特殊的命令。用和上个例子彻底相同的文本,光标在第一行。
大D命令删除从当前位置到行末尾的文本,D是 d$的快捷方式。(其实不少方法都是和其余命令如C类似),例如:
你能够删除删除从光标起的右边部分的文本:
x命令,有时候你只是想删除一两个字符,不想弄得太大动静,那么使用r命令来作替换也不太适用,那么使用x命令,能够删除一个字符,且只删除当前光标所在处的一个字符。假若有下面的行:
zYou can move text by deleting text and then
你能够用x命令删除字母‘z’,另一个特别的命令X(大写x),能够删除光标之前的那个字符。而在命令前假如数字前缀,则等价于运行命令屡次,如5x,能够向右删除5个字符。
若是你用删除命令,删掉了你不想删的东西,那么你能够输入u命令来撤销你的修改,由于u命令就是undo,你能够恢复到之前的修改。若是你作的是最后一次修改,想要恢复过来,尝试一下p命令,由于你删除的东西会保存到p所维护的空间,而后按下p就能够将那些误删的粘贴回去。vi缓存最近9个删除的内容,能够用如3p的命令恢复前删除的三行。
在vi中,经过删除文本而后在别处粘贴来移动文本,每次你删除了一个文本块,被删除的文本将会临时存储在一个特别的缓冲区中,而后移动光标到你想要放置文本的地方,而后用p ( put)命令来将文本放置到该处。你能够移动任何一块文本,尽管移动行比移动单词要有用的多。
p,p命令将缓存区中的内容粘贴到光标后面区域,若是你删除了一或多行,p将会把你所删除的文本粘贴到光标所在行的下一行。假设你有以下的文本:
You can move text by deleting it and then,
like a "cut and paste,"
placing the deleted text elsewhere in the file.
each time you delete a text block.
而后你想把第二行移动到第三行的后面,先使用d命令删除,而后用p命令放置。以下所示:
一旦你删除了文本,你须要在下面的修改或者删除以前保存一下,若是你同时在编辑其余文件,会影响缓冲区的话,你删除的文本可能会丢失。你能够重复屡次p命令,只要你没有进行进行新的编辑。在第四章,你将会学习怎样保存一个命名了的缓冲区中被你删除的文本,因此你能够恢复你的数据。
你可使用xp命令(想象一下,删除一个字符,而后插在下一个字符的后面,不就将相邻的两个字符换位了吗?)来交换两个字符的位置。例如,在单词mvoe中,vo两个单词位置反了,因此要修改回来,只须要将vo的位置调转过来便可,因此先x,删除掉字符‘v’,而后将‘v’放到(p)字符‘o’的后面,这样就调整了vo的位置为ov。
y命令,不少时候你可使用拷贝命令来节省编辑的时间,使同一段文本在多处重复。使用两个组合使用的命令:一个y命令,一个p命令就能够实现了。你能够拷贝任意长度的文本,而后放置在其余的任何位置。一个(急抽)拷贝命令能够复制所选的文本到一个特殊的缓冲区中(能够一直保持直到下一个y命令覆盖),而后就能够讲所复制的内容用p命令粘贴了。
就像修改和删除命令,拷贝命令能够和任何移动命令结合(如yw,y$,4yy)。y命令常用在拷贝一行内容的状况,由于拷贝命令每每要在距离更远的其余行粘贴文本,而更少修改行内文本。假设practice有下面的文本:
With a screen editor you can
scroll the page.
move the cursor.
delete lines.
你想要造出三个完整的句子,每句都用“With a screen editor you can”开头,你可使用拷贝命令y,来完成这项简单的工做。
y命令和删除命令使用的是同一个缓冲区,每次最近的删除或者拷贝都会取代以前的缓冲内容,咱们将会在第四章看到,大概有9个拷贝或者删除内容块被放在buffer里面,他们均可以用p命令来粘贴。你也能够将它们删除或者粘贴到26个不一样的缓冲区中(复制粘贴缓冲区),这容许你像玩杂耍同样摆弄文本块。
每一个编辑命令都缓存在一个临时缓冲区里面,直到你的下一个命令输入时才消失。例如你在一个单词后插入了一个"the",插入文本的命令以及你作的操做,都被保存起来了以用于撤销。
.命令,每次你想重复上次使用过的命令,你能够重复屡次该命令,点符号(.)可让你重复命令。看下面的例子:
With a screen editor you can
scroll the page.
With a screen editor you can
move the cursor.
你能够删除一个行,而后删除另一行,只须要输入一个点命令便可。
老版本的vi在重复命令的时候有问题,例如,在插入一个很长的文本时,若是设置了wrapmargin(换行对齐),则会有困难。若是你有这样的老版本,这个bug将早晚会折腾到你。你能作的很少,只是提早警告一下。(现代版本的vi不见得有这样的问题)你有两种方法来解决这样的问题,当重复屡次长文本插入时,你能够在重复下一次命令以前保存一次文档( : w),也能够讲wrapmargin设置为0.即以下所示:
: set wm=0
在后面的章节“更多映射键的例子” 中,我将会向你展现一种使用wrapmargin的简单解决方案。在一些vi版本中,命令 CTRL+@ 能够重复最近的插入操做(我在vim上试了一下,听到的倒是嘟嘟声,原来是没有进入到插入模式)。进入插入模式,能够执行CTRL+@命令来重复插入,插入后将带你回到命令模式。
u命令,早以前已经提到过了undo命令,在你操做错误的时候能够撤销你的命令。只需简单地按下u键。这时候光标在哪都无所谓。继续以前的例子,下图展现了删除后的practice文件:
U,大写u,能够撤销在一个行的全部修改。只要光标保持在该行,当你从该行移走后,你就不能继续使用U命令了。注意你不能撤销你最近作的撤销(撤销动做),在两个文本修改版本之间切换。(设想一下,若是能够撤销你的撤销动做,那么撤销一个编辑,而后撤销你的撤销,就是恢复,因此是在里两个版本里切换,这作没有多大意义)可是u命令能够撤销U命令,而U命令将会撤销全部在本行的修改,包括哪些u所作的修改。(恢复到该行作任何修改以前的状态——建立状态)
小技巧:u命令能够撤销它自己的操做将会致使一个很调皮的循环。若是你只是想要撤销你最后的编辑修改,那么简单地撤销它,你将会被弹回原来的行。当你撤销你的撤销操做时,你仍呆在本行。
vim 可让你使用 CTRL+R键来重作一个未完成的命令,和无限重作结合在一块儿,你能够向前或者向后你的编辑历史,能够查看稍后章节“撤销撤销操做”。
你能够在光标前插入一段话,按下如此的键队列:
itext to be inserted ESC键
而后你就向里插入了“text to be inserted”,而且回到了命令行模式。这里还有其余的一些插入命令,在光标先后不一样位置进行插入:
A 向行尾追加文本
I 向行首做插入操做
o (小写o),向下建立一个新行,而后插入文本
O (大写O), 向上建立一个新行,而后插入
s 删除光标所在的或者替换文本
S 删除本行或替换本行
R 用新值覆盖原有文本,会一直向右边移动,且能够添加新文本。
全部的这些命令可让你进入到插入模式,完成插入后,记得按下ESC键退回到命令模式。
A (append) 和 I(insert) 可让你避免在编辑前移到行尾或者行首。(A命令比$a好,由于少按一次键,尽管算起来仍是同样多的键,可是更快了不是吗?只有你越懒,那么你可能学会更多命令让计算机来帮你作哪些无聊的重复工做。)
o和O命令,在下一行或者上一行新开一行,也不用再换行而后光标退回了。你能够在当前行任意位置敲入。
s和S命令(substitute)容许你删除一个字符或者一整行,而后接入你要输入的任意长度文本。s等价于 c + 空格符,表示用空格符来代替一个字符。S命令呢,和cc命令是同样的功效的。s的最佳用处是修改一个单词为若干个单词。
R命令(replace)是颇有用的,当你想修改文本,可是不知道要修改多少个字符的时候,例如,你不知道要修改几个单词(估计用3cw或者4cw),可是这些都没有R那么好,由于R是改到哪就是哪逐个替换的。改完了,退出插入模式就好了。
除了o和O命令以外,以上列出的插入命令(加上i和a),可使用数字前缀作参数。有了数字前缀,你可能会用i,I或a命令来插入一行下划线或者交替的符号,例如,你能够输入50i* ESC键 来输出一行“**********************************”,而用25a*- ESC键来输出这样一行“*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-”(貌似是程序员编程时候的装饰性分隔线,有这个东西爽爆了),这比重复地输入一个字符或者几个字符要有意思的多(很讽刺的是,我使用的不是vi编辑器,结果我输入上面的符号的时候就是用手工重复的方法,实在是没有vi那么高效啊!)
有了数字前缀,r命令能够一次替换一片的字符(例如输入个5r,再输个a,你会发现五个字符被替换为a了,你将看到“aaaaa”整整齐齐地站在你的屏幕上。),在C或者C++中,要将|| 换成 &&,只需输入一个2r&便可,无比省事。(愈来愈崇拜开发vi的神人了,感受vi就是为程序员打造的,程序员又懒又聪明,才会让计算机来提升咱们工做的效率)
你能够在大S命令前加上数字参数,这样你就能够一下替换掉好几行了,这至关地迅速且很灵活,和用c 命令和移动命令结合起来用同样爽。
一个很好的例子是,用s命令前面加数字参数能够一次替换掉好几个字符,这些字符每每在单词的中间,输入r很差,输入cw会改掉太多,那就用s命令吧,它的效果和R差很少,但其实仍是有所不一样的。
还有其余的完美结合可让你的编辑变得天然,例如ea命令(其实和A命令同样)也是一个颇有用的组合,能够在本行末尾添加文本。你将会被这些聪明的命令所导引,向着一个自动化的美好的世界而去。
J 命令,有时候你要将一些看起来很丑的短行链接在一块儿,只须要将光标移到第一行,而后用J命令就能够将两行合并了。假设你有以下的practice文件:
With a
screen editor
you can
scroll the page, move the cursor
在J以前加上数字参数会让你惊喜地发现,一会儿能够将好几个行合并。可是合并后你会发现每行之间会留下痕迹——一个空格。(感受这个功能也是为程序员造的,合并几条语句在一行里面。)
当你想按j的时候,不要 错误滴按下J命令,你可能无心中按下了大写转换键 Caps Lock,vi是大小写敏感的,这个不用啰嗦了。当发现caps lock 灯亮的时候,再按一次回到原来的状态。记住按下ESC命令,回到命令模式。无需多言!
下面的图表,展现了c,d,y命令的一些结合移动命令的使用,都是一些基础命令,本章介绍的命令就这些,记住必定要勤加练习才能熟能生巧。掌握这些命令,你已经入门了,可是要真正体会到vi的强大,你还得看下面的高级章节。
translated by bibodeng 若有错误,欢迎斧正 2012-09-22 谢绝转载
从此将再也不翻译了,而是以笔记的形式记录一些,由于已经有一本还不错的中译本《学习vi和vim编辑器》 不重复发明轮子。