vi命令是unix下常用而重要命令,可在全屏幕方式下编辑一个或多个文件。若在vi执行时
没有指定一个文件,那么vi命令会自动产生一个无名的空的工作文件。若指定的文件不存在,
那么就按指定的文件名创建一个新的文件。若对文件的修改不保存的话,v i命令并不改变原
来文件的内容。

  注意:vi命令并不锁住所编辑的文件,因此多个用户可能在同时编辑一个文件,那么最后
保存的文件版本将被保留。

下面是vi命令使用的一些选项及含义:                                        

  -c sub-command 在对指定的文件编辑前,先执行指定的命令 sub-command .

  -r filename 恢复指定的文件filename .                  

  -R 将指定的文件以只读的方式放入编辑器中,这样不会保存对文件的任何修 改。

  -y number 将编辑窗口的大小设为number行。                    

  下面是vi编辑所处的三种模式:                                              

  .命令模式 进入vi时所处的模式。在此模式下用户可输入各种子命令对进行*作,如删除行、
粘贴行、移向下一个字、移向不同行等。

  .文本输入模式 在此模式下可以修改一行的内容并增添新行。在命令模式下键入a 、i 或
c键可进入文本输入模式,按Escape键可返回命令模式。

  .命令项模式 在此模式下,可以通过子命令输入更多的参数。如:w子命令要求输入一文
件名,"/"子命令要求输入一个查找项。用户使用Escape键返回命令模式。


下面是自命令模式下执行的,在同一行上移动的自命令:                          

  h 将光标左移一格。                                                        

  l 将光标右移一格。                                                        

  j 将光标下移一格。                                                        

  k 将光标上移一格。                                                        

  w 将光标移到下一个小字的前面。                                            

  W 将光标移到下一个大字的前面。                                            

  b 将光标移到前一个小字的前面。                                            

  B 将光标移到前一个大字的前面。                                            

  e 将光标移到下一个小字的后面。                                            

  E 将光标移到前一个大字的后面。                                            

  fc 把光标移到同一行的下一个c字符处。                                    

  Fc 把光标移到同一行的前一个c字符处。                                    

  tc 把光标移到同一行的下一个字符c的前一格。                              

  Tc 把光标移到同一行的前一个字符c的后一格。                              

  number| 把光标移到递number列上。                              

下面是命令模式下在行间移动的子命令:                                        

  +或Enter 把光标移至下一行第一个非空白字符。                          

  - 把光标移至上一行第一个非空白字符。                                      

  0 把光标移到当前行的第一个字符处。                                        

  $ 把光标移到当前行的最后一个字符处。                                      

  H 把光标移到屏幕最顶端一行。                                              

  L 把光标移到屏幕最底端一行。                                              

  M 把光标移到屏幕中间。                                                    

下面是命令模式下改变屏幕显示的子命令:                                      

  z- 把当前行作为屏幕的最后一行,并重新显示屏幕。                          

  z. 把当前行作为屏幕的中间一行,并重新显示屏幕。                          

  Ctrl+l 重新显示屏幕当前内容。                                        

  /pattern/z- 寻找pattern的下一个位置,并把所在行设为屏幕的最后一行。

下面是在命令模式下用来显示页面的子命令:                                    

  Ctrl + f向后滚一页。                                                

  Ctrl + d向后滚半页。                                                

  Ctrl + b向前滚一页。                                                

  Ctrl + u向前滚半页。                                                

  Ctrl + e屏幕向下滚一行。                                            

  Ctrl + y屏幕项上滚一行。                                            

下面是在命令模式下用来查找字符串所使用的子命令:                            

  /pattern 向后寻找指定的pattern ,若遇到文件尾,则从头再开始。

  ?pattern 向前寻找指定的pattern ,若遇到文件头,则从尾再开始。

  n 在上次指定的方向上,再次执行上次定义的查找。                            

  N 在上次指定的方向的相反方向上,再次执行上次定义的查找。                  

  /pattern/+number 将光标停在包含pattern的行后面第number行上。

  /pattern/-number 将光标停在包含pattern的行前面第number行上。

  % 移到匹配的"()"或"{}"上。                                        

下面是在文本输入模式下用来输入文本的子命令(用户可在任何时候按Escape返回到命令模式):

  a 在光标之后开始输入文本。                                                

  A在行尾开始输入文本。                                                      

  i在光标之前开始输入文本。                                                  

  I在行首第一个非空白字符前输入文本。                                        

  o在光标所在行后插入一空行。                                                

  O在光标所在行前插入一空行。                                                

下面是在命令模式下改变文本所使用的子命令(用户可在任何的时候按Escape键返回到命令模式):

  cc或S 修改一整行。                                                      

  C 改变一行光标位置以后的部分。                                            

  cw 改变光标所在单词。                                                    

  dd删除当前行。                                                            

  D 删除光标所在行光标后面的内容。                                          

  dw删除光标所在的单词。                                                    

  J 把下一行内容加到本行行尾。                                              

  rc把光符所在字符替换成c .                                              

  R 覆盖本行内容。                                                          

  u恢复上一次的修改。                                                        

  x删除光标所在的字符。                                                      

  ~ 改变光标所在出字符的大小写。                                            

  . 重复上一个*作。                                                        

  <<把当前行移到左边。                                                      

  >>把当前行移到右边。                                                      

下面是用于文件中拷贝文本的字命令:                                          

  p 将缓冲区内容取到光标所在行的下面一行。                                  

  P 将缓冲区内容取到光标所在行的上面一行。                                  

  "bd 将文本删除至有名缓冲区b .                                        

  "bp 张贴有名缓冲区b中内容。                                            

  yy把当前行放入缓冲区。                                                    

  Y 把当前行放入缓冲区。                                                    

  Yw把光标所在的单词放入缓冲区。                                            

下面是用于保存文件的子命令:                                                

  :w 回写修改后的文件。                                                    

  :w filename 当filename不存在时,把修改后的文件存为文件filename ,当文件filename
存在时,报错。

  !w filename 如果文件filename存在时,把修改后的文件保存为文件filename .

下面列出了在vi编辑的多个文件之间切换所用的子命令:                        

  :n开始编辑vi激活的文件列表中的下一个文件。                              

  :n filenames 指定将被编辑的新的文件列表。                      

下面列出了用于在当前文件和另外一个文件间切换的子命令:                      

  :e filename 使用filename激活vi (在vi中装入另一个文件filename)。

  e!重新装入当前文件,若当前文件有改动,则丢弃以前的改动。                  

  :e+filename 使用filename激活vi ,并从文件尾部开始编辑。

  :e+number filename 使用filename激活vi ,并在第number行开始编辑。

  :e# 开始编辑另外一个文件。                                              

下面是在本文件中加入其他文件代码所使用的子命令:                            

  :r filename读取filename文件,并将其内容加到当前文件后。  

  :r ! command执行command文件,并将其输出加到当前文件后。  

下面是vi中其他的子命令:                                                  

  ctrl+g 取得正在编辑文件的有关信息。                                  

  :sh启动sh ,从sh中返回可用exit或ctrl+d .                

  :! Command 执行命令command .                            

  !!重新执行上次的:! Command子命令。                              

  :q退出vi ,若用户对编辑的文件有所修改,系统不会让用户使用q命令退出。  

  :q!退出vi而不管是否对文件有改动。                                      

  ZZ或:wq 保存对文件的修改并退出vi .                                

  用户可在一个特殊的文件.exrc中定义特殊的vi命令。在vi中使用这些命令时,必须在该
命令前加上一个冒号( :) 。

-------------------------------------------------------

另一篇:

-------------------------------------------------------

vi 的模式

vi 是在很久以前就写的程序。在那个时候,键盘上没有现在熟悉的那么多功能键。所以,vi 设计成通过输入字符和 ESC 来控制输入和修改文本。

可能这对于一些人来说是个遗憾,但是你会发现你不需要改变手在键盘上的位置就可以完成所有的功能。结果是你的输入将快速起来。

为了完成交互的全屏幕编辑工作, vi 有三种模式。插入模式 (insert) 用于输入文本。在插入模式下,你输入的任何字符都将显示在屏幕并存于文件。命令 (command) 模式用于大多数编辑功能。在命令模式下,所有的输入都将产生一定的响应而不是 直接到文本中,例如移动光标、删除一块文本、拷贝文本等。第三个模式是执行另 外的功能,例如查找、全局替换、处理多个文件等。这种模式是基于 ex 编辑器的。

启动 vi

vi 启动后,默认的模式是命令模式。按照下面的步骤试一试:输入程序名称启动 vi

$ vi

你将看到类似下面的东西:

~~~~~~~~~~~~~~~~~~~~~~~~~Empty buffer

i--插入

现在我们输入 "i" 进入插入模式。字符 "i" 将不会回显。此后你输入的任何东西都将显示在缓存中。现在我们来输入一段文字。 例子中的话来自英文版的孙子兵法。注意光标的位置在例子中是个下划 线。

    If wise, a commander is able to recognize changing circumstances and toact expediently.  If sincere, his men will have no doubt of the certainty ofrewards and punishments.  If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil.  If courageous, he gains victory byseizing opportunity without hesitation.  If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment.    Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~~

Esc--Cancel

当你输入完了,按下 Esc 键返回到命令模式。 (如果你已经处于命令模式下,按 Esc 时会听到喇叭的声音。) Esc 可以撤消未完成的命令和终止插入模式。按 Esc 后,光标将停留在你最后输入的字符的下面。

很不幸,没有一个明显的标志表明你现在处于什么模式下。但是有简单的方 法来告诉你现在你所处的模式。如果你按下键,相应的字符出现在屏幕上,那么 你是在插入模式下,否则是命令模式下。如果你不能确定你现在所处的模式,那么 按 Esc 两次以听到喇叭声来确信你在命令模式下。

移动光标和简单的编辑

是看一看基本的移动光标命令的时候了。训练训练你的手指,让他们以后自动的执行你所想的命令吧。

最重要的移动命令

让我们来看看有多少影响光标移动的命令。

hh--光标左移

首先,按 5 下 h 让光标左移动 5 个 (如果你看到 h 跑到屏幕上了的话,一定是你忘记了按 Esc )。光标现在应该在 "plans" 中的 "p" 下面 (看下面的例子):

    If wise, a commander is able to recognize changing circumstances and toact expediently.  If sincere, his men will have no doubt of the certainty ofrewards and punishments.  If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil.  If courageous, he gains victory byseizing opportunity without hesitation.  If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment.    Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~

kk--光标上移

现在我们来按 5 次 k 让光标上移 5 行。也许你该认为应该有快捷方式了。好,现在就有个简单的方法:在你要采取的 行动前加上数字。按下 5k 你可以和按 5 下 k 有相同的结 果了。光标现在该在 "he" 的"e"下了。

    If wise, a commander is able to recognize changing circumstances and toact expediently.  If sincere, his men will have no doubt of the certainty ofrewards and punishments.  If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil.  If courageous, he gains victory byseizing opportunity without hesitation.  If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment.    Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~~

在使用这些功能的时候有些限制的。例如使用 h 或 l 移动光标超过了一行文字的头或尾,光标将停留在头或尾部,喇叭鸣叫提醒 你。

还有其他的类似 h 和 k 的吗?看一看表3.2。最好的熟悉他们 的的方法是多用他们。

表 3.2. 常见的方向键

命令 移动
h 左一个字符
j 下一行
k 上一行
l 右一个字符
w, W 前一个单词 (W 忽略标点)
b, B 后一个单词 (B 忽略标点)
$ 到行尾
^ 到行首第一个非空字符
0 行首
G 到缓冲首
nG 到第 n

 

大小写的命令是有一些区别的。小写字母一般以标点区分 "words.",而大写则忽略他们。

最重要的编辑程序

让我们看看最简单也是最常用的编辑过程:

修改 没有人不犯错误。所以迟早你会碰到修改你输入的文本的时候。实际上花在字处理上的大多数时间是修改而不是输入新的东西。因此,你要知道如何方便地修改就很重要。

x--删除一个字符 删除文字的最简单的方式是用 x。这个命令的结果是光标所处 的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符, 那么光标将向左移动一个,这样光标就不会停留在不存在的字符的下面了。假如 没有任何文字了,喇叭就叫。

d--删除对象 这个命令的右边还要有一定的文字对象。文字对象就是一块文字。他右边接的就是在控制光标移动的那些字符。例如 w 表示向前一个单词,那么 dw 将删除下一个单词。5w 表示前进 5 个单词,那么 d5w 将删除他们。

dd--删除一行 最常用的 d 系列命令之一。和前面一样, 5dd 将删除 5 行

D--整个删除 大写形式的 D 用来删除从光标到行尾。和 d$ 一样效果。

u--恢复 要后悔吗?他不仅仅撤消删除,还撤消你所有的编辑工作。

.--重复 重复编辑工作。