当前位置:Linux教程 - Linux - VI-经典用法

VI-经典用法



        
      vi-faq中文版(1)

    ------------ vi FAQ (第一部分)-------------

    0.0 - 引言 -- 我怎样用这个FAQ

    这个文档分为了几个部分.首先,第0节和第1节介绍了什么是vi;第2节则收录了很多新
      学者的问题,一些对vi没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入
      模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第3节是面向vi的中级用户的,它从
      问题“我如何查找和替换”开始,逐步深入,直到对vi里面的宏(Macro)的用法讨论为止.第3
      节还包括了一个vi的快速参考,有一个规范的vi命令列表.再下面,是一个有关“:set”命令的
      列表,包含了所有能定制vi环境的变量,这些变量也可以在.exrc文件中定义.

    我们已经在一个运行SunOS和UCB版本vi的机器上验证了快速参考.除了SunOS带的vi外,
      每个命令都可以在系统V和UCB版本vi运行,但是我个人并没有验证这一点.

    除非我们在文档中指明,缺省我们假定你处在命令模式下.

    我们还尝试保留尽可能多的术语,因为在原始的vi文档中使用了这些术语,尽管我可能
      忘了它的本来含义.

    如果你使用了万维网(WWW)来阅读FAQ,你可以在以下地址找到这个FAQ:
      http://www.macom.co.il/vi/index.html.

    0.1 - 索引

    第一个文件:

    0.0 - 引言 -- 我怎样用这个FAQ?
      0.1 - 索引
      0.2 - 我可以散发这个FAQ吗?
      0.3 - 你能为这个FAQ做什么?

    1.0 - 什么是vi?
      1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?
      1.2 - 噢! 这听起来不错! 有没有理由不用vi?
      1.3 - vi能在多少不同的操作系统下面运行?
      1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?
      1.5 - vi有其他一些可用的变种吗?

    2.0 - vi入门
      2.1 - 有什么游戏帮助我们学习vi吗?
      2.2 - 命令模式和插入模式有什么区别?
      2.3 - 等等,我的键盘没有键,我该怎么办?
      2.4 - 那些~s是什么东西?
      2.5 - 我无法习惯用 hjkl, 你有什么建议吗?
      2.6 - 我如何才能不存盘就退出?
      2.7 - 我怎样插入一个文件?
      2.8 - 我怎样查找文本?
      2.9 - 我怎样搜索一个控制序列?
      2.10 - 我怎样重新格式化文本?
      2.11 - 我怎样复制文本?
      2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?
      (或者,我刚才犯了个错误,我该怎么办?)
      2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?
      2.14 - 所有的:命令都是怎样处理的?

    3.0 - 怎样查找和替换?
      3.1 - 我怎样在vi中运行一个程序?
      3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?
      3.3 - 有没有使vi对程序员更友好的窍门?
      3.4 - 宏 -- 我怎样写宏?
      3.5 - 我怎样将一个功能键定义成一个宏?
      3.6 - 有没有办法缩写文本?
      3.7 - 我怎样在当前文档中做拼写检查?
      3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?
      3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在
      开放模式呀?

    第二个文件:

    4.0 - vi档案的在线帮助在哪儿?
      5.0 - 好玩的vi诀窍,无聊的宏
      5.1 - 好玩的vi诀窍
      5.2 - 好玩的宏
      6.0 - 依字母顺序的vi快速参考
      6.1 - 命令模式的输入选项(:命令)
      6.2 - 设置选项(set)
      7.0 - 建立 .exrc文件
      7.1 - .exrc文件的样本
      8.0 - vi的漏洞
      9.0 - 术语表
      10.0 - 关于vi的参考书目

    0.2 - 我可以散发这个FAQ吗?

    可以!只要你没有对它做任何修改,或者用它来赚钱.

    0.3 - 你能为这个FAQ做什么?
      首先, 把你发现的错误告诉我. 如果你有什么建议我们也很欢迎. 你认为还不清楚的地方
      告诉我们,我们同样欢迎.
      还有, 使用vi! (Spread the word) 我很抱歉我无法将所有对这个FAQ有贡献的人都列出
      来, 因为许许多多的人都给过我建议和帮助,如果我将他们都列出来的话,那么恐怕这张贡献
      者的清单将和这个文档本身一样长了.

    1.0 - 什么是vi?
      vi是个可视化的编辑器(vi就意味着可视化--VIsual). 那么,什么是可视化的编辑器呢?
      (相对于非可视化的编辑器来说)?可视化的编辑器就是可以让你在编辑文本的时候看到它们.
      今天,这听起来似乎非常普通,反之,非可视化的编辑器似乎很奇怪. 非可视化的编辑器的例子
      可以举出不少:如ed, sed和edlin(直到相当近的一段时间内,它是DOS自带的最后一个编辑器)
      等.
      vi是威廉.侨伊写的,作为BSD UNIX的一部分. 后来AT&T也开始用vi, 于是标准UNIX也开始
      用vi了.

    1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?
      vi是UNIX下面的缺省编辑器, 因此几乎近来所有的UNIX都捆绑了vi(近来是指1984年左右).
      这意味着无论何时你跨平台使用某种UNIX,你都知道在你指尖下面有一个强力的编辑器.为什么
      不是别的呢? vi是个强大的编辑器.同样,一旦你了解了vi,你就能很快的编辑你的文件,因为它
      非常能节省你的敲键次数. 由于它在插入和命令两种情况下使用不同的模式,它比大多数的不
      基于这种模式的编辑器要快. 而且,vi非常小(我机器上面的版本只有200K).还有,vi几乎能做
      任何事,只要你知道如何使它做你想做的事.

    1.2 - 噢! 这听起来不错! 有没有理由不用vi?
      有. 有一个非常好的理由: vi稍微有些难学, 如果你开始学的话,vi又慢又让人痛苦,
      当然,一旦你学会了, vi就快多了. 但是学习的过程很慢. 有人曾经问我, 如果vi是个比较
      易学的编辑器, 它是否直观(intuitive)呢? 我一般这样回答:\"是的,我们有些人是这样认为.
      但是大多数人认为我们疯了.\"

    1.3 - vi能在多少不同的操作系统下面运行?
      UNIX. 就是它. 尽管如此,还是有很多vi的变种运行在不同的操作系统上. 我就在以下一些
      操作系统上用过vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(后面有一个有关细节的列表)

    1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?
      好吧, 狡猾的家伙. 关于vi有很多很好的书:大多数讲UNIX的书至少有一章给了vi,而且
      有不少是专门讲vi的书.我没有什么偏爱. 所以你最好是问问你们那儿的vi高手们他们是从
      哪儿学来的. 还有,到处试. 用vi打开一个不重要的文档(你的论文不象是个学vi的好实验品),
      然后再到处试. 我无法想象有人学习vi却不花相当多的时间去到处试试. 记住:如果你有些
      地方不明白了, 只要敲两次键,你就又回到命令模式下了.
      我要提到的一点是,我想在这里提比较合适,就是如果要成为系统管理员或者其他对UNIX配置
      做什么修改的话,最好是学学ed或者ex,因为有些版本的UNIX没有把vi放在根分区里面,这样你
      就可能无计可施了. ed是个不错的选择.

    1.5 - vi有其他一些可用的变种吗?
      只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi.
      elvis适用于:Amiga, DOS, OS/2, Unix, VMS, Atari.
      STevie适用于: Atari ST, DOS, Unix, Mac System 7.
      Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.
      (例如ftp.hawaii.edu)
      nvi是将和BSD 4.4捆绑在一起的vi.
      vim适用于: Amiga, DOS, Mac System 7, Unix.
      Amiga, DOS,和源码可以在以下站点换取:ftp.fu-berlin.de /misc/editors/vim
      Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.
      (例如ftp.hawaii.edu)
      vile适用于: DOS, OS/2, Unix, VMS.
      xvi适用于: DOS, Unix.
      vi的变种之间很有很多差异.很多都改进了vi,大多数都可以使用在这个文档
      种列出的命令,但是有一些不同的地方.更进一步的细节,你可以参考这些变种
      附带的相应的文档.

    2.0 - vi入门
      对vi的初学者来说,有些基本的提示.第一,任何时候,手头都要有一份命令摘要.
      我们将在后面给出一个快速参考/命令摘要. 第二, 找一本vi方面的比较好的书.
      这个文档不是学vi的最佳途径(最起码现在还不是),我不敢保证这个文档能教会一个
      对vi一无所知的人, 而很多书已经做到了这一点. 但是,我们这里还是给出了不少
      提示. 对选择书籍来说,有一个标准的原则:买之前一定要仔细阅读. 要了解这本书
      对你是否有意义.确信它能在你练习vi的时候有用. 和其他的书做个比较 -- 不管怎样,
      vi可能让你感到非常莫名其妙, 而且你要确信这么一点:是书让你糊涂,而不是
      你低估了学vi的难度.
      还有, 找一些诸如\"学vi\"(vilearn),\"vi向导\"(vitutor)之类的软件来帮助你掌握
      vi的基本知识.

    2.1 - 有什么游戏帮助我们学习vi吗?
      这似乎很无聊, 但是事实上UNIX系统里面有不少游戏可以帮助你学习使用vi.这些帮助
      主要是一些基本知识. 虽然我还不知道有哪个游戏可以帮你学习vi的所有命令, 但我
      确实知道有一些可以帮助你学习使用 hjkl来移动光标. NetHack,一个类Rogue的游戏,
      就对这非常有帮助. 而且它是一个很大的游戏,能玩很长一段时间. 我没有贬低其他游戏
      的意思,这些游戏是: rogue, moria, omega, worm, snake.

    2.2 - 命令模式和插入模式有什么区别?
      vi将命令模式和插入模式区分开来,这经常被认为是vi的一个大问题,但往往这也被认为是
      vi的优势所在. 理解其中的区别是掌握vi的关键.vi启动时,开始处于命令模式;在这种模式
      下,我们可以在文件中到处移动,改变文本的某个特定区域, 剪切, 复制和粘贴文本,还有更
      多. 插入模式是指用户可以真正插入文本.换句话说,命令模式是用来在文件中移动,而插入
      模式是用来在文件中键入文本.
      有些命令,例如: a, i, c, C, O, o和其他一些可以从命令模式切换到插入模式.
      键或者^C(CRTL+C)可以脱离插入模式而返回到命令模式.
      你要适应这种差别. 它使得vi区别于其他的编辑器. 它也使你能在你的手不离开标准
      键盘做很多事情.

    2.3 - 等等,我的键盘没有键,我该怎么办?
      试试敲 ^[(CTRL+[). 如果你的键盘有一个键,再试试它.如果还不行,再试试^3.

    2.4 - 那些~s是什么东西?
      它们仅仅是用来让你知道你的文档末尾在哪儿.实际上它们并不在你的文档里面,所以
      你用不着担心它们.

    2.5 - 我无法习惯用 hjkl, 你有什么建议吗?
      首先,如果你的终端设置正确而且你连接的也没有问题的话,你可以使用箭头键.但是,
      如果你认为你要经常使用vi,那么最好是习惯使用 hjkl,因为它们敲起来更快. 而且,
      有时候连接出问题了,使得ESC序列都可能丢失了.(这样你可能就无法使用箭头键了--译注)

    2.6 - 我如何才能不存盘就退出?
      :q!可以做到这一点. 如果vi看起来冻住了,确信你没有错敲了个 ^S. 敲^Q可以解开^S.

    2.7 - 我怎样插入一个文件?
      :r
      例如,要插入文件/etc/motd, 可以敲 :r /etc/motd.
      这将把文件插入到光标处.如果你在r前面指定了一个数字,那么这条命令将把文件插入
      到那个位置.

    2.8 - 我怎样查找文本?
      /将向前查找, ?将向后查找. ??或者//将重复上次查找. 在UNIX下,这已经
      是个可爱的标准用法了. 而且, 在vi中, n将查找文本下一次的出现位置. N重复上次查找,
      不过逆转了查找的方向. 在查找中可以使用规范式.

    2.9 - 我怎样搜索一个控制序列?
      /^V^
      ^V会告诉vi照字面理解下一个字符,不要把它看作是一条命令.

    2.10 - 我怎样重新格式化文本?
      如果你的计算机有一个名叫fmt的程序, 你要做的仅仅是在命令模式下面敲!}fmt(记住,
      不要在前面加:). 这可以重新格式化你的文件,从光标所在的位置一直到当前段落的结尾.
      如果你的机器里面没有fmt这个程序, 你就得去找个类似的软件了(我记得在公共域里面有
      不少这样的程序,但是我对此了解不多)

    2.11 - 我怎样复制文本?
      这有点复杂.把这节拿出来,多看几遍;还有,一定要多做实验.
      \"yy可以把一行文本拷贝到寄存器中(这里的寄存器是vi的术语,指可以存放剪切和
      拷贝下来的东西的地方), 里面的字母必须是a到z之间的一个. \"dd可以把一行
      剪切下来放到寄存器里面. 你可以在yy或者dd前面用数字指明要拷贝或者剪切的行数.如果
      中的字母是大写的话,意味着把文本插入到寄存器中已有的文本之前.
      \"p把文本插入到光标之后,\"P把文本插入到光标之前.如果寄存器中含有某
      一行的开头或结尾,这一行将会被放到另一合适的行上. Y是yy的快捷方式. 还有, y$, yH,
      yM,等等,都是可以用的.d命令也是一样的.如果要快速的剪切和粘贴, 你就无须指定寄存器
      了.如果这样的话,你就不能往寄存器里面添加文本了.而且只要有一个删除命令的话,寄存器
      中的东西就没有了(包括x命令).
      举例来说,如果要移动上一段的话,你可以把光标移到段落的开头,敲\"a13dd,再把光标移到
      你想要放文本的地方,敲\"ap,就可以把那段文本放到光标所在的行后面.
      现在,大概你想要剪切和粘贴文本到不是行末尾的区域去.我们来看如何做到这一点:我们
      可以使用 m 命令来标记一个区域,这个字母可以和剪切/粘贴寄存器的字母相同,因为
      它们是保存在内存中的不同位置. 然后,敲\"`[yy或者dd], 这里的寄存器就是
      要保存文本的那个寄存器,是用来标记的,yy和dd是你的操作.

    2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?
      (或者,我刚才犯了个错误,我该怎么办?)
      u可以撤消你刚才的操作.U可以撤消你对当前行的修改(当然,一行对于一篇论文来说当然
      很不够了). :e!可以不保存修改而重新把你的文件调进来. 还有,你删除的文本都保存在从
      0到9编号的寄存器里.所以,\"p就可以把上第n次的删除文本粘贴出来.你可以按如下的
      方法迅速地查看所有删除的文本. 先试一个,不对的话,敲u,再试下一个.(为加速这个过程,
      这时vi中的.命令和通常的用法不一样了.它不是重复上次操作,而是试下一个寄存器,这样
      你要做的无非就是: \"1p u . u .,直到你撤消了你想撤消的删除操作)

    2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?
      :[m],[n]w 可以将从第m行到第n行之间的文本保存到所指定的文件中.
      这种行序号方法几乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w >>,
      这些文本将添加到文件的后面.

    2.14 - 所有的:命令都是怎样处理的?
      :后面的命令都是从ex编辑器里面过来的. 这就给vi加入了很多灵活性,也使vi功能更强
      大. 例如, 有很多的方法可以用来查找和替换,它们有很多的类似地方(事实上,它们在某种
      意义上说都是一样的)


      3.0 - 怎样查找和替换?
      有很多方法. 最简单的是:
      :s/old/new/g, 但是,这仅对当前行起作用..., 所以,我们用
      :%s/old/new/g, 更一般的,我们还可以用
      :[范围]s/old/new/[cg],这里,[范围]是任意的行范围,包括行号,$(文件末尾),.(当前行),
      %(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面5行).[cgi]是
      c,g,i中间的一个或者什么也没有.c告诉vi每次替换的时候要给提示,g是说对所有一行中出现
      的地方都做替换.i则是指在查找时不区分大小写.如果最后一个斜杠(/)后面没有东西的话,那
      么vi只替换在行中第一次匹配的地方.
      我比较喜欢这样做:
      :g/foobar/s/bar/baz/g, 这个命令首先搜寻foobar,然后把它变成foobaz. 它没有改变
      jailbars, 而其他的一些命令可能会改变jailbars. 这是我的方法,但是可能比较难记.
      当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果
      你在正规式里用(和)来剥离一个序列的话,你会发现你可以做很多好玩的事情.
      例如:
      :g/(foo)(bar)/s/2/1baz/g 将foobar替换成foobaz
      还有一些特殊的序列:
      & 所有查找时匹配到的东西
      [1-9] 1到9号用(和)括起来的东西
      u 下一个字符将被变成大写.
      U 以后的字符都变成大写,直到遇到e或E
      l 下一个字符将被变成小写.
      L 以后的字符都变成大写,直到遇到e或E
      [Ee] 更改大小写的选择区域的终点

    3.1 - 我怎样在vi中运行一个程序?
      :!命令 可以在vi中运行程序. :sh会启动一个交互式的外壳(SHELL).在这个外壳
      里面, 如果你愿意,你还可以再次运行vi. 当你在编辑Makefiles和配置文件来编译
      某个程序的时候,这可能比较有用. 这比:e优越之处在于它无须保存文件,而且如果
      你退出外壳的时候,vi还回到原来的地方.(当然,我还是建议你先保存一下文件)

    3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?
      不要怕! 你会收到一封电子邮件,里面就是你的论文.敲入vi -r
      (这个文件名就是系统崩溃时你正在编辑的文件)你就可以恢复出你的论文来.只敲
      vi -r将把所有可能恢复的文件都列出来.

    3.3 - 有没有使vi对程序员更友好的窍门?
      :set ai可以让vi自动对齐.
      :set sw=#,#是移动的宽度(shiftwidth),或者说TAB键的宽度(tabwidth);你可以
      用>命令来左移或右移某一行. 还有, 你可以使用 %来将{,(或[等符号
      括起来的文本都左移或右移;这时候,你必须把光标放在这些符号({,(或[)上面.
      :set sm会在你敲},]或)显示出对应匹配的{,[或(来.
      :set lisp会对lisp编程有些帮助. ()被移到s表达式(s-expressions)外面,如果
      原子(atoms)没有停止则{}将被移走.

    3.4 - 宏 -- 我怎样写宏?
      :map , 其中最多10个字符,最多100个字符. 以后,如果
      你敲了,vi就会用来取代它.所有的宏都是在命令模式下开始的,但是可以
      在你想在的模式下终止. 记住,在你想用的控制字符前面加上^V.
      :unmap 将删除这个宏. :map! 使得将插入到文档
      中去.

    3.5 - 我怎样将一个功能键定义成一个宏?
      如果是#n,n是0-9之间的一个数,那么这个宏就映射成某一个功能键了.(你
      可以试一下F1-F10之间的键--译者)

    3.6 - 有没有办法缩写文本?
      当然了. 这可是vi呀,它能做任何事情!
      :ab email [email protected] 可以在你敲完email后,把那个没有缩写
      的文本插入到文件中. :una email取消缩写.

    3.7 - 我怎样在当前文档中做拼写检查?
      这儿有一个宏可以做到这一点. 这些应该放在你的.exrc文件中(后面我们将对.exrc
      进一步讨论). 它是一个相当简单的宏. 它仅仅是调用ispell来处理当前文件.当然,你
      的系统里面一定得有ispell这个程序. 使用它的时候,只需要敲个V键就行了(因为vi并
      没有用V,所以V是一个比较合适的键)

    map V :w^M:!ispell % ^M:e!^M^M

    第二个^M使你在拼写检查完之后无须敲回车就可以到vi中.
      (译注, 在我的系统里,没有ispell,只有spell,我用它替换了ispell,工作的不错;还有,
      ^M不是两个字符,而是一个字符,通过^V^M敲进去的;另外,我个人认为第二个^M还是不要
      的好,因为直接回到vi后你就无法看到拼写检查的结果了)

    3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?
      好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理
      它.(而且,它回答了一个非常普通的问题)
      vi启动的时候处于一种特殊的模式下面,叫做\"开放模式\"; 在这种状态下,事情或多或少
      的有些不同. 删除的字符在你面前显示成一些\,vi会认为你的终端窗口只有一行. ^r
      可以把当前行重新输出. z则把当前行周围的窗口重画一遍.

    3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在开放
      模式呀?
      这儿的问题就是vi没有认出你用的终端的类型. 于是它假定你有的是个最烂的终端,
      所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放
      模式还是需要知道你的终端的一些最起码的信息的.
      现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下,
      这并没有用处. 如果你直到你的终端的类型, 你可以在UNIX提示符下面设置终端类型(在CSH
      及其变种下面,使用命令setenv TERM ;在SH及其变种下面,使用命令TERM=;
      export TERM)
      最好你能把上面的命令写在.profile文件或者.cshrc文件里面,这样你一登录它就自动地给
      你设置好了.(当然,你应该知道如何使用ed,或者你能在UNIX提示符下面设置好终端类型以便能
      使用vi, 这样你才有可能去编辑这些文件)
      如果你确实不知道你地终端类型,试一试vt100.现在大多数地终端或者终端仿真器都能仿真
      vt100. 如果这还不能生效的话,你只好去找个高手来帮你了.
      
      
    发布人:netbull 来自:JJ的Linux世界