[教学] 轻松学 vi

Home Home
引用 | 编辑 tailin!
2005-02-22 13:57
楼主
推文 x0
轻松学 vi 第一课 : 打好基础
-------------------------------

我们现在将花约10到15分钟来教你一些简单的编辑方法.有[实作]的部份请你务
必跟着实地演练一次.如果你想离开这门课程请按大写的Z两次离开.

请注意:你在vi里所打的指令(command)并不会出现在萤幕上,如果你所打的
    指令出现在萤幕上,那么请按一下 ESC 键.

基本的游标移动方法
---------------------

在这门课里,你可以按 ^D (Ctrl+D) 或 ^U(Ctrl+U) 来移动你的游标

    ^D     游标往下移动半个萤幕(按住 Ctrl 键不放再按 d 键)

    ^U     游标往上移动半个萤幕(按住 Ctrl 键不放再按 u 键)

[实作]现在请你试着按 ^D 和 ^U 来移动你的游标

在整个课程中,当你读完了一页的内容以后,请按 ^D 继续阅读下一页的
课程内容.

如果你想一行一行或一个字母一个字母的移动游标,请按 h , j , k 和 l

    h     向左移动一个字元
    j     向下移动一行
    k     往上移动一行
    l     向右移动一个字元

或许你有注意到这几个按键在键盘上是一字排开的,请看下面这个图.

                          上
          .......   .......   .......   .......
          :   :   :   :   :   :   :   :
      左   : h :   : j :   : k :   : l : 右
          :.....:   :.....:   :.....:   :.....:

                  下

[实作]现在按几次 j 或 k 把游标移动到这行上面.

[实作]1. 现在试着按 l 键几次把游标移到这行的最右边.请注意vi不允许你
      按 l 将游标移动超过每一行的行尾.同样的,你也不能在空白行按
      h 和 l .
    2. 接下来请你按 j 将游标往上移动,请注意看看画面是怎么向下卷动的


删掉文字/删除一整行 DELETION
-----------------------------
在vi里,用 x 和 dd 来删字母和一整行.

    x     删掉目前游标所在位置的那个字母
    dd     删掉目前游标所在位置的那一行

如果想救回(undo)刚才所删掉的东西,按 u

    u     救回最后一次所删除的东西.

[实作]现在我们来试试砍掉这一行. 先按j或k把游标移到这行上面,再按dd
    (按两次d).再按 u 救回上一行
   
[实作]把游标移到这行上面,按 x 把下面句子中的 Y 删掉
    "whY ask whY?"
    现在试着按 u 救回刚刚删掉的文字. 多按几次 u ,你会发现 u 只能
    救回最后一个被删掉的字母

下面这几行文字让你练习 删除 和 救回 的动作( 用 dd x u )

    Emacs is an evil creation. Emacs is an evil creation.
    Emacs is an evil creation. Emacs is an evil creation.
    Emacs is an evil creation. Emacs is an evil creation.


如何离开vi
----------

(只是说明,先暂时不要按下面的指令离开)

如果你刚才有更改档案的内容(举例来说,你刚才按过 dd 或 x 就算是更动过
档案内容) 却不想存起来,你可以按 :q!<RETURN> .如果要存的话,请按 ZZ
如果你在编辑自己的档案,一般来说都是按 ZZ 离开

:q!<RETURN>   离开vi,不储存刚才对档案所作的变动
          (先按冒号,再打q,惊叹号,再按Enter)

    ZZ     离开并储存刚才对档案所作的变动
          (大写Z按两次)

插入文字
--------

你可以按 i 或 o 进入"插入"模式,输入完毕后要按 ESC 离开"插入" 模式.
在插入模式中,你所打的任何东西都会出现在画面上(还记得刚才才说过
vi里所打的指令(command)并不会出现在萤幕上吗?)如果你的电脑键盘上没有
ESC这个按键,请按 ^[ 代替 ( Ctrl + [ )

    o     OPEN : 插入一个新的空白行输入文字
    i     INSERT :从现在游标所在位置开始插入文字

    ESC   ESCAPE : 离开 "插入" 模式

在"插入"模式中,你可以用倒退键来更正错误(一般来说,是Backspace键或Delete
键).你所删除的字母将会一直停留在萤幕上直到你下次按ESC键才会真正删去.

[实作]在下面的空白行中输入你的名字和电话号码.请照下面的步骤:
    1.按 o 插入一个空白行
    2.输入你的名字后按enter
    3.输入你的电话后按esc
    4.按 x 删掉一部份的电话号码

[实作]在你的电话号码下输入今天的日期.
    1.按 o 插入一个新的空白行.
    2.输入日期后按ESC

[实作]按 u 取消刚才所插入的文字

[实作]按 i 在你的名字间插入你的小名或昵称.
    步骤: 用刚刚教过的 h j k l 把游标移到你名字的中间再按 i
        输入你的小名或昵称.用 DELETE 或 BACKSPACE 更正错误的地方
        再按 ESC 离开插入模式.

注意:
    在某些电脑里,一行文字可以比萤幕画面能显示的字数还多,也就是在这
    种电脑上很长的一行文字在萤幕上可能显示出来时会被截成两行以上.
    为了避免这种困扰,在你插入文字时请记得当游标已经跑到画面边缘时要
    按一下enter换行.

关于档案
-----------
在UNIX指令行下用vi编辑一个档案的方法是打:

    vi filename

"filename" 指的是你想编辑档案的档名.若这个档案原本就不存在于磁碟内(也就
是"新档"),那么vi不会马上就建立这个新档.vi会等到你第一次下存档的指令时才
会一并建档并存档.在这之前这个档案一直都放在暂存区内.如果你在输入档名时不
小心打错了,只要打 :q!<RETURN> 就可以避免这新的档案被建立.


总结    
-------  
结束第一课后,你应该已经懂得这些指令了...

    ^D     游标往下移动半个萤幕(按住 Ctrl 键不放再按 d 键)

    ^U     游标往上移动半个萤幕(按住 Ctrl 键不放再按 u 键)

    h     向左移动一个字元
    j     向下移动一行
    k     往上移动一行
    l     向右移动一个字元

    dd     删除一整行
    x     删掉一个字元.

    u     取消刚才所做的动作

:q!<RETURN>   离开vi,不储存刚才对档案所作的变动
          (先按冒号,再打q,惊叹号,再按Enter)

    ZZ     离开并储存刚才对档案所作的变动
          (大写Z按两次)

    o     OPEN : 插入一个新的空白行输入文字
    i     INSERT :从现在游标所在位置开始插入文字

    ESC   离开(ESCAPE) "插入" 模式

若要在在UNIX指令行(command line)下使用vi请打 :

    vi [要编辑的档名]

现在你已经会对档案作一些基本的编辑工作了.请你继续练习使用vi,接下
来再进行第二部份的课程,学习更多好用的vi指令


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

轻松学 vi 第二课 : 快速有效的穿梭于档案间
-----------------------------------------

接下来的这门课将花约15到20分钟.在这门课里所教的内容将用在第三课中:
vi的剪贴功能.有[实作]的部份请你务必跟着实地演练一次.如果你想离开
这门课程请按大写的Z两次离开.


WORDS
-----

有不少的方法可以让游标从一个word跳到其他的word.

    w     游标跳到下个word的开头
    e     游标跳到下个word的字尾
    b     游标回到上个word的开头

大写的 W E B也有着相同的功能.大写和小写的 w e b 指令的差别在于小写的
w e b 指令把任何非数字或字母的字元当成一个新word的开始,而大写的 W E B
则是用空白字元来区隔两个word.

[实作]现在用下面两行来试试 w b e 和 B W E 这些指令

  EX-PER-IMENT on these lines;test moving back &forth.
  EX-PER-IMENT on these lines;test moving back &forth.


ON THE LINE
-----------
你可以很快的将游标移到所在行的任何位置

    $     移到游标所在行的行尾
    ^     移到该行第一个非空白的字元

    0     移到该行的开头位置
    #|     移到该行的第 # 个位置   例: 5| 12|

[实作]现在试试 $ 和 ^ 这两个指令,请注意 ^ 会移到第一个非空白的字元,并
    不是那一行的开头位置

  This is a PRACTICE LINE. There is white space at the front. END

0 (zero) 会把游标移到该行的最左边.

#| ( | 和 \ 在同一键上) 是用来直接移动游标到该行的第 # 个位置
先按 # (范围介于 1-80 之间) 再按 | . 举例来说: 5|   20|   30|


寻找字元
--------
有时你可能须要寻找一行中的某个字元.

  f char     寻找(FIND) 本行中下一个 char 字元
  t char     将游标移到本行中下一个 char 字元之前

  F char     寻找本行中前一个char所在的位置
  T char     移到本行中前一个 char 字元之后

    ;     重覆上一个 f, t, F, 或 T 的动作
    ,     反向重覆上一个 f, t, F, 或 T 的动作

f 和 F 会让游标停在找到的字元上,t 和 T 将游标停在找到的字元旁.
f 和 t 往后找,F 和 T 往前找.
如果要找的字元找不到,vi会发出声音告诉你.

[实作]现下下面有一行文字,试试 f t F T ; , 这些指令

  "PRACTICE line?" "Each and Every?" "Find thE char@cter and move to it.END


MATCHING
--------

vi有一个很方便的功能,尤其对写C程式的人来说更是好用.它可以帮你判断
() {} [] 有没有成对,如果找不到对应的括号,vi会发出声音告诉你,如果有找
到就直接跳到对应的括号上.

    %     寻找有无对应的 () {} 或 []

[实作]在下面的练习中,移动你的游标到(,),[,],{,}上面,再按 %

  [TRY THIS. ((Whether) the pairs match up is the question.) [One]
  pair is incomplete]. Can you tell {which one? ]} END


WINDOW POSITIONS
----------------
在vi里你可以移动游标到画面的上方,中间,和下方.

    H   移到游标到画面的最上方 (HIGHEST)
    M   移到游标到画面的中间 (MIDDLE)
    L   移到游标到画面的最下方

[实作]好,现在试试 H M 和 L 这三个指令.


标示位置
--------

你可以在档案里做些标记再随时返回被标记的位置.

  m char   (MARK) 把这个地方标示成 char
  ' char   (quote character) 跳到被标为 char的那一行    
  ''       (按两次') 回到刚才的位置

char 可以是小写的 a-z中的任一个 . 一个标记在除了下面的这两种情况
外会一直存在

  1) 重覆使用相同的标示 char .
或 2) 删掉了被标示的那一行.

[实作]
>>> 移到这一行,按 ma 把这行标成 a
>>> 移到这一行,按 mb 把这行标成 b
>>> 移到这一行,按 mz 把这行标成 z
>>> 移到这一行,按 mb 把这行标成 b
>>> 移到这一行,按 mz 把这行标成 z
>>> 现在按 'a 让vi回到标示为 a 的那一行.
>>> 现在按 'b 让vi回到标示为 b 的那一行.
>>> 现在按 'z 让vi回到标示为 z 的那一行.

这些指令可以让你来回切换于档案中两个相距很远的地方.
vi会记住你刚才是从那一行跳跃过来,你可以按 '' 来回的切换

[实作]按 'b 回到标示为 b 的那行,再按 '' 回到这行


跳到某一行
------------

      G     (GO) 跳到档案的最后一行.
    #G     (GO to line #). 跳到第 # 行 (例: 3G , 5G , 124G )

[实作]按 1G 跳到档头,再按 '' 回到这行.再来按 G 跳到档尾再按 ''回到这行


文字段落
--------------

有时候一段一段的移动游标会比较方便.我们可以用 {,},(,) 来达到这些功能

    {     (左大括号) 跳到上一段的开头
    }     (右大括号) 跳到下一段的的开头.

    (     (左小括号) 移到这个句子的开头
    )     (右小括号) 移到下一个句子的开头

[实作]现在试着利用下面两段文字来学习使用 { 和 }的功能.

    EXPERIMENT on this first paragraph. The quick brown fox jumped
  over the seven lazy dogs. The fox must have been very large to
  jump over seven dogs!

    EXPERIMENT on this second paragraph. The quick brown dog
  jumped over the seven lazy foxes. The dog didn't have to be nearly
  as large, since foxes aren't too big.

[实作]现在用上面的两段文字来试试 ( 和 )

C的程式设计者对接下来的这两个指令可能会感兴趣.
C的函式(function)都是用 { 和 } 括起来的,如果你把各函式的 { 都放在一行
的第一个位置那么vi便可以让你用 [[ 和 ]] 轻松穿梭于各函式之间

    [[   跳往上一个函式
    ]]   跳往下一个函式

若vi在整个档里都找不到最左边是行首是 { 的符号时, 按[[ 和 ]] 就会跳到
档头和档尾

[实作] 现在下面有几个函式,试着用 ]] 和 [[ 来回切换于各函式间.

main()
{
  helloworld();
}

helloworld()
{
  printf( "Hello world\n" );
}


搜寻
-----

  /string     向后寻找 string 这个字串
  ?string     往前寻找 string 这个字串

    n     重覆上一个 / 或 ? 的指令,继续寻找
    N     重覆上一个 / 或 ? 的指令,反向继续寻找

vi may search past the bottom of the file and then start again at the top.
(Or, vi may search past the top and then start again at the bottom.)

[实作]现在请你询找 "the" 这个字串三次,再反向找三次回到这个位置
步骤如下
    先按   /the   再按 RETURN.
    按三次 n
    按 N 直到你再次回到这个位置


总结
-------

    w     游标跳到下个word的开头
    e     游标跳到下个word的字尾
    b     游标回到上个word的开头

    $     移到游标所在行的行尾
    ^     移到该行第一个非空白的字元

    0     移到该行的开头位置
    #|     移到该行的第 # 个位置   例: 5| 12|

  f char     寻找(FIND) 本行中下一个 char 字元
  t char     将游标移到本行中下一个 char 字元之前

  F char     寻找本行中前一个char所在的位置
  T char     移到本行中前一个 char 字元之后

    ;     重覆上一个 f, t, F, 或 T 的动作
    ,     反向重覆上一个 f, t, F, 或 T 的动作

    %     寻找有无对应的 () {} 或 []

    H   移到游标到画面的最上方 (HIGHEST)
    M   移到游标到画面的中间 (MIDDLE)
    L   移到游标到画面的最下方

  m char   (MARK) 把这个地方标示成 char
  ' char   (quote character) 跳到被标为 char的那一行    
  ''       (按两次') 回到刚才的位置

      G     GO to the last line in the file
    #G     GO to line #. (e.g., 3G , 5G , 175G )

      G     (GO) 跳到档案的最后一行.
    #G     (GO to line #). 跳到第 # 行 (例: 3G , 5G , 124G )

    {     (左大括号) 跳到上一段的开头
    }     (右大括号) 跳到下一段的的开头.

    (     (左小括号) 移到这个句子的开头
    )     (右小括号) 移到下一个句子的开头

    [[   跳往上一个函式
    ]]   跳往下一个函式

  /string     向后寻找 string 这个字串
  ?string     往前寻找 string 这个字串

    n     重覆上一个 / 或 ? 的指令,继续寻找
    N     重覆上一个 / 或 ? 的指令,反向继续寻找

现在你应该已经能够很顺畅的在档案中自由的移动游标了.尤其是若你的数
据机(modem)速度很慢时,这些指令更加显的有用.请你继续练习这些指令,
接下来再进行第三课: vi的剪贴功能 或第四课: vi的一些其他特殊的插入
技巧.加油!


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

献花 x0