首页 > C/C++开发工具专区 > C/C++其它IDE资源 > [原创] 学习使用VI编辑器
2005
11-28

[原创] 学习使用VI编辑器

    就目前而言,不论你在哪个平台下编程,你总会需要一款文本编辑器。对于一个熟练的C++程序员来说,合适的编辑器就象战士手中的武器,是必不可少的。各种各样的编辑器或独立存在或集成于开发环境中,各有千秋,等待着程序员们的挑选。在独立型文本编辑器中,最负盛名、也是使用人数最多的两款就是:VI和Emacs。他们以强大稳定的性能,便捷流畅的操作获得了程序员们的赞赏。当你真正学会使用他们的时候,你也一定会被他们折服。我将在下面的文字中为大家介绍其中的一款:VI。
    首先,vi不是一个编辑器。他是一个大家族,包括最基本的vi和vim、STevie、elvis等众多的变种。由于他们的操作方式都非常接近,我们通常把他们统称为vi。vi是可视化的意思(VIsual),最早是威廉.侨伊写的,并作为BSD UNIX的一部分发布。今天,vi是所有Unix及Linux系统下标准的编辑器。任何一个可用的Unix/Linux系统中,必然有vi编辑器的存在,而且对于这些系统的任何版本,vi编辑器是完全相同的。所以掌握了vi,在Unix的世界里你就可以畅行无阻。由于开发人员的努力,你同样可以在windows、dos、MAC以及其他各种操作系统下下用一直的方式使用vi。只要意识到vi号称是世界第二的编辑器,你对他还没有产生些兴趣么。
    另:第一名当然是Emacs,但她过于强大而复杂,以至于有人戏称Emacs是有文本编辑能力的操作系统。具有强大能力的同时保持简单一致的操作方式的只有VI。


零、如何得到
    我相信这里的读者大部分是windows用户,所以我推荐大家到这个地方去取一份可用的vi来。
http://www.vim.org/download.php
那里是vi最著名的变种vim的主站。你可以下载windows下可用的、图形界面而且带菜单和工具条的Gvim,在本文完成时,最新的版本是6.4,所以请下载自解压安装文件gvim64.exe。如果你有兴趣,该页面上还有包含全部源代码的zip压缩包,用来学习也不错。

碧蓝右耳38684.9954513889


[原创] 学习使用VI编辑器》有 4 条评论

  1. 碧蓝右耳 说:

    一、vi的基本概念:模式
    vi是一个文本编辑器,但他与今天流行的编辑器有所不同。今日的编辑器不区分文本的输入和编辑,在一个状态下操作,用菜单、鼠标或是快捷键来输入命令,这就需要鼠标或特殊的键盘(比如带Alt键和Ctrl键)。为了在各种千奇百怪的Unix系统中保持相同的行为,捆绑在Unix中的vi尽可能少的依赖设备,vi中的几乎所有的操作都只需要键盘,而且是只需要主键盘区。但是主键盘区的字符太少,输入同一个x,既可能是删除命令,也可能是文本中的字符,如何判断。这就取决于vi当时的状态,所以说vi是一个模式编辑器,同一输入在不同模式下有不同含义。
    基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
    1.  插入模式(Insert mode)   在插入模式下的输入都解释为文本的内容。也就是说,只有在Insert mode下,才可以做文字输入。
    2.  命令模式(command mode)    控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode,或者到 last line mode。在命令模式下的输入都解释为命令。要做编辑修改,必须进入命令模式。
    3.  底行模式(last line mode)  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
    不过一般把vi简化成两个模式,就是将底行模式(last line mode)算作命令行模式command mode)的一种特殊形式。
    在插入模式下,按「ESC」键可切换到命令模式,如果在命令模式下按「ESC」键则仍然保持命令模式,同时系统喇叭会发出哔的响声。所以你完全可以多按几下「ESC」,确保处于命令模式。

  2. 碧蓝右耳 说:

    二、vi的基本操作
    1. 进入vi
        在系统命令提示符输入vi及文件名称后,就进入vi全屏幕编辑画面,例如:$ vi myfile。如果该文件不存在或缺少文件名,vi 会开启一个新文件。进入 vi 后荧幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。在windows下,双击快捷方式或者在控制台输入命令都可以启动vi。在控制台也可以带参数启动而直接打开某个文件。
        刚进入vi之后,是处于「命令行模式(command mode)」,你需要切换到「插入模式(Insert  mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert  mode)」再说吧!
    2. 切换至插入模式(Insert mode)编辑文件  
        在「命令行模式(command  mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
    3. Insert  的切换
        您目前处于「插入模式(Insert  mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command  mode)」再删除文字。
    4. 退出vi及保存文件
          在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如: : w filename (输入 「w filename」将文章以指定的文件名filename保存) :  wq (输入「wq」,存盘并退出vi) : q! (输入q!, 不存盘强制退出vi)

  3. 碧蓝右耳 说:

    三、命令行模式(command mode)功能键
      在命令行模式下,字符或是字符的组合就是命令,以下列出字符命令及其含义。
    附加说明:
    1.大小写是有区别的
    2.光标有两种形式,一个闪动的方框表示处于命令行模式、字符下的短横线意味着在插入状态。总是在字符上闪动的位置称为光标的当前位置。
    格式示例:
    单独字符,例如 i,表示按下键盘上的i键。
    字符组合,例如ctrl + b,表示同时按下ctrl和b键。
    nG,表示先输入一个数字n(或其他参数)再按下G。
    同xx键,表示可以使用其它特殊功能键来代替,例如同home,就是可以用小键盘区的home键来完成。
    (insert),表示该命令是insert的缩写。
    此外,大小写是有区别的。

    1. 从插入模式切换为命令行模式   按「ESC」键。
                
    2. 切换进入插入模式  
    i — 进入插入模式「insert mode」,从光标当前位置前面开始插入资料,光标及其后的内容自动向后移动,(insert)。
    a — 进入插入模式,从光标所在位置后面开始新增资料,光标及其后的内容自动向后移动,(append)。
    o — 进入插入模式,在光标所在行下新增一行,从行首开始输入文字。注意,这是小写字母o,不是数字0。(open)。
    I — 进入插入模式,从光标所在行的第一个非空白字符前面开始插入资料。
    A — 进入插入模式,从光标所在行最后面的地方开始新增资料。
    O — 进入插入模式,在光标所在行上方新增一行,从行首开始输入文字。(Open)。

    3. 删除和替换
    x   –  每按一次,删除光标所在位置的一个字符。   
    nx  –  表示删除光标所在位置及其后面的n个字符。
    X   –  大写的X,每按一次,删除光标所在位置的前面一个字符。
    nX  –  删除光标所在位置的前面n个字符。  
    dd  –  删除光标所在行。
    ndd –  从光标所在行开始删除n行。
    s –   删除光标所在字符,并进入输入模式。
    S –   删除光标所在的行,并进入输入模式。
    r –  修改光标所在字符,r 後接著要修正的字符。
    R –  进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。

    4. 复制   
    yw  –  将光标所在之处到字尾的字符复制到缓冲区中。
    #yw  — 复制#个字到缓冲区   
    yy  –  复制光标所在行到缓冲区。
    #yy –  拷贝从光标所在的该行往下数n行文字。
    p   –   将缓冲区内的字符贴到光标所在位置。
    注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

    5. 回复和修改
    u   –  如果您误执行一个命令,可以马上按下u,回到上一个操作。按多次“u”可以执行多次回复。
    cw  –  更改光标所在处的字到字尾处   
    c#w –  表示更改#个字 

    6.Last line mode下命令  
    在使用last line mode之前,请记住先按ESC键确定您已经处于command  mode下后,再按:即可进入last line mode。
    set nu    列出行号,会在文件中的每一行前面列出行号。
    #   –   #号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了。
    w  –  可以将文件保存起来。跟上文件名,可以存为别的文件。
    q  –  就是退出。
    q! –  不保存,强制离开vi。
    qw –  一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
    zz –  功能与 :wq 相同。
    :x –  与:wq相同
     
    7. 移动光标
    vi可以直接用键盘上的光标来上下左右移动,如果你的键盘上有的话。但正规的vi是用小写英文字母hjkl控制光标。光标的移动可以输入参数。vi的光标移动花样繁多。灵活的使用,可以快速的在几百页的文档中来去自如。
    (1) 无参数的移动
    h — 光标 左 移,同 left
    j — 光标 下 移,同 down
    k — 光标 上 移,同 up
    l — 光标 右 移,同 down
    ctrl + b — 屏幕往“后”移动一页。 同 PageUp  
    ctrl + f — 屏幕往“前”移动一页。 同 PageDown
    ctrl + u — 屏幕往“后”移动半页。   
    ctrl + d — 屏幕往“前”移动半页。
     
    H — 移动到视窗的第一行 (head)
    M — 移动到视窗的中间行 (middle)
    L — 移动到视窗的最后行 (leg)
    0 — 移动到光标所在行的行首。同 Home,数字 0 也可。
    ^ — 移动到光标所在行的行首第一个非空白字符。
    $ — 移动到光标所在行的行尾。同 End
    w — 移动到下个字的第一个字母 (word)
    e — 移动到下个字的最后一个字母 (end)
    b — 移动到上个字的第一个字母  (back)
    G — 移动到文章的最后。

    (2) 有参数的移动
    nG  –  直接用数字 n 加上大写 G 移动到第 n 行
    ctrl + g — 列出光标所在行的行号。
    n-  –  减号,移动到上一行的第一个非空白字元,前面加上数字可以指定移动到以上 n 行  
    n+  –  加号,移动到下一行的第一个非空白字元,前面加上数字可以指定移动到以下 n 行
    fx  –  往右移动到 x 字元上
    Fx  –  往左移动到 x 字元上       
    tx  –  往右移动到 x 字元前
    Tx  –  往左移动到 x 字元前
    ;   –  配合 f&t 使用,重复一次
    ,   –  配合 f&t 使用,反方向重复一次   
    /string  –  往右移动到有 string 的地方
    ?string  –  往左移动到有 string 的地方
    n   — 配合 /&? 使用,重复一次      
    N   — 配合 /&? 使用,反方向重复一次
          
    n(  –  左括号,移动到句子的最前面。前面加上数字可以指定往前移动 n 个句子n)  –  右括号,移动到下个句子的最前面。前面加上数字可以指定往后移动 n 个句子
    句子由! . ? 三种符号来界定。

    n{  –  左括弧,移动到段落的最前面。前面加上数字可以指定往前移动 n 个段落
    n}  –  右括弧,移动到下个段落的最前面。前面加上数字可以指定往后移动 n 个段落。
    段落是以段落间的空白行界定。 
    nl  –  光标移到该行的第n个位置,如:6l,24l。

    8.组合而成的更多的编辑指令
    这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如 dw 是由删除指令 d 与范围 w 所组成,代表删除一个字d(elete) w(ord) 。
    指令列表如下:
    d 删除(delete)
    y 复制(yank)
    p 放置(put)
    c 修改(change)

    范围可以是下列几个:
    e 光标所在位置到该字的最後一个字母
    w 光标所在位置到下个字的第一个字母
    b 光标所在位置到上个字的第一个字母
    $ 光标所在位置到该行的最後一个字母
    0 光标所在位置到该行的第一个字母
    ) 光标所在位置到下个句子的第一个字母
    ( 光标所在位置到该句子的第一个字母
    } 光标所在位置到该段落的最後一个字母
    { 光标所在位置到该段落的第一个字母

    它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里,然後就可以用指令 p 贴到其它地方去,这是 vi 用来处理区段拷贝与搬移的办法。
    某些 vi 版本,例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现,其实是定范围的方式有点杂,实际上只有四个指令罢了。

    v   只要按下 v 键,光标所在的位置就会反白,然後就可以移动光标来设定范围,接著再直接下指令进行编辑即可。
    对於整行操作, vi 另外提供了更方便的编辑指令。
    dd  –  删除整行文字;
    cc  –  可以修改整行文字;
    yy  –  复制整行文字;
    D   –  可以删除光标到该行结束为止所有的文字。

  4. 碧蓝右耳 说:

    四、其它
        如果VI的功能只是上面这些的话,那他根本连Windows下的记事本都不如。但事实上,vi的功能是如此的强大,以至于我们必须用整整一本书才能说明。Oreilly就有一本名为Learning the vi Editor的书,联机手册也是可用的,而且简体中文的手册也已经完成。
        vi常见的功能包括语法高亮、多文件编辑和对比、16进制编辑、支持正则表达式的搜索等等。而对于程序员,代码折叠、自动补全、函数的声明和定义间的切换、与编译器的捆绑更是经常使用的功能。各种稀奇古怪的功能简直不胜枚举,更要命的是,你完全可以自己动手,给vi增加新的命令和功能。而所有这些都完全不需要用鼠标,仅仅通过键盘就可以完成。你的双手不需要离开主键盘就可以实现所有这一切。同时各个地区的用户更加不必担心语言支持的问题,简体中文的支持早已是毫无问题了。你从今天开始,就可以抛弃记事本、editplus、UltraEdit这些东西,投身到vi的怀抱。如果你还感觉到vi的不便,相信我,那只是因为你还没有熟悉他。记得常常翻阅手册,不要让编辑本身成为你编程的障碍。

留下一个回复