1、Vi编辑器的基本使用方法 vi分为三种状态:命令模式(Command mode):控制光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式和底行模式;插入模式(Insert mode):只有在此模式下才可以做文字输入,按ESC回到命令行模式;底行模式(Last line mode):将文件保存或退出 vi,也可以设置编辑环境,如寻找字符串、列出行号等。 进入 vi:在系统提示符号$下输入 vi myfile,就进入 vi全屏幕编辑画面。初态为:命令模式。只有插入模式才能够输入文字。 1、插入模式的命令简介 在命令模式下: 按i切换进入插入模式后从光标当前位置开始输入文字;I 从光标所在
2、的列的第一个非空白字符前面开始插入文字。 按a进入插入模式后从光标所在位置的下一个位置开始输入文字;A 从光标所在列最后面的地方开始新增资料。 按o进入插入模式后并插入新的一行,从行首开始输入文字;O 从光标所在列上方新增1列并进入插入模式。 在插入模式下只能一直输入文字,如果输错了字则只能按ESC转到命令模式来删除。 2、命令模式的命令简介 移动 vi 用小写英文字母h、j、k、l分别控制光标左、下、上、右移一格。按ctrl+b:屏幕往“后”移动一页 按ctrl+f:屏幕往“前”移动一页 按ctrl+u:屏幕往“后”移动半页 按ctrl+d:屏幕往“前”移动半页按0:移到当前行的开头 按G:
3、移动到文章的最后 按$:移动到光标所在行的“行尾” 按:移动到光标所在行的“行首” 按w:光标跳到下个字的开头 按e:光标跳到下个字的字尾 按b:光标回到上个字的开头 按#l:光标移到该行的第#个位置,如:5l, 56l 删除 x:每按一次,删除光标所在位置的“后面”一个字符 #x:例如,6x表示删除光标所在位置的“后面”6 个字符 X:大写的 X,每按一次,删除光标所在位置的“前面”一个字符 #X:例如,20X表示删除光标所在位置的“前面”20 个字符 dd:删除光标所在行 #dd:从光标所在行开始删除#行 复制 yw:将光标所在之处到字尾的字符复制到缓冲区中 #yw:复制#个字到缓冲区 y
4、y:复制光标所在行到缓冲区 #yy:例如,6yy表示拷贝从光标所在的该行“往下数”6 行文字 p:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能 替换 r:替换光标所在处的字符 R:替换光标所到之处的字符,直到按下ESC键为止 恢复 u:如果您误执行一个命令,可以马上按下u,回到上一个操作。按多次“u”可以执行多次回复 更改 cw:更改光标所在处的字到字尾处 c#w:例如,c3w表示更改 3个字 跳行 ctrl+g列出光标所在行的行号 #G:例如,15G,表示移动光标至文章的第 15行行首3、底行模式命令简介 在使用底行模式之前,请记
5、住先按ESC键确定您已经处于命令模式下后,再按:冒号即可进入底行模式 a) 列出行号 set nu:输入set nu后,会在文件中的每一行前面列出行号 b) 跳到文件中的某一行 #:#号表示一个数字,在冒号后输入一个数字,按回车键就会跳到该行,如输入数字 15回车,就会跳到文章的第 15行 c) 查找字符 /关键字:先按/键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可一直按n往后寻找到您要的关键字 ?关键字:先按?键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可一直按n往前寻找到您要的关键字 d) 保存文件 : w filename (输入 w filename将
6、文章以指定的文件名 filename保存) : wq (输入wq,存盘并退出 vi) : q! (输入 q!, 不存盘强制退出 vi) 游标的移动本节所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode)下的移动,原始的 vi 只能在 c-mode 移动,在 insert-mode 只做文字的输入,而不做游标的移动。当然 vim 及 elvis 的方向键是不论在那一种 mode 皆可移动自如。基本的游标移动h 左,或 Backspace 或方向键j 下,或 Enter 或 +(要 Shift 键),或方向键k 上,或 方向键或 -(不必 Shift 键)l
7、 右,或 Space 或方向键Ctrl-f 即 PageDown 翻页。Crtl-b 即 PageUp 翻页。使用 hjkl 键的移动是为了使手不必离开打字区(键盘中央的部位),以加快打字的速度,如果各位不习惯,那就使用方向键吧!Backspace 及 Space 的移动方式是到了行首或行尾时会折行,但方向键或 hl 键的移动则在行首或行尾时您继续按也不会折行。转折换行的功能是 vim 的扩充功能, elvis 无此功能。jk 及使用方向键的上下移动游标会尽量保持在同一栏位。使用 Enter,+,- 的上下移动,游标会移至上(下)一行的第一个非空白字元处。好像有点复杂,各位就暂时使用方向键来移
8、动就简单明白了!等您爱上了 vim 后再来讲究吧。 进阶的游标移动0 是数目字 0 而不是英文字母 o。或是 Hmoe 键,移至行首,(含空白字元)。 移至第一个非空白字元,注意,要 Shift 键。$ 移至行尾,或 End 键。要 Shift 键。以上两个按键是源自规则表示式(regular expression),在 regexp 中 是匹配行首,$ 是匹配行尾。 G 移至档尾(最后一行的第一个非空白字元处)gg 至档首(第一行之第一个非空白字元处)gg 是 vim 的扩充功能,在 elvis 或原始 vi 中可用 1G 来移至档首(是数字 1 不是英文字 l)。G 之原意是 goto,指
9、移至指定数目之行首,如不指定数目,则预设是最后一行。 w 移至次一个字(word)字首。当然是指英文单字。W 同上,但会忽略一些标点符号。e 移至前一个字字尾。E 同上,但会忽略一些标点符号。b 移至前一个字字首。B 同上,但会忽略一些标点符号。H 移至萤幕顶第一个非空白字元。M 移至萤幕中间第一个非空白字元。L 移至萤幕底第一个非空白字元。这和 PageDown,PageUp 不一样,内文内容并未动,只是游标在动而已。 n| 移至第 n 个字元(栏)处。注意,要用 Shift 键。n 是从头起算的。:n 移至第 n 行行首。或 nG。特殊的移动) 移至下一个句子(sentence)首。( 移
10、至上一个句子(sentence)首。 移至下一个段落(paragraph)首。 移至上一个段落(paragraph)首。sentence 是以 . ! ? 为区格。paragraph 是以空白行为区格。 % 这是匹配 ,() 用的,例如您的游标现在在 上只要按 %,就会跑到相匹配的 上。写程式时满好用的。另还有一些 vim 的特殊按键,但这得留待最后才来讲述,否则各位恐怕会头昏眼花了。基本编辑指令这个单元就开始进入主题了。下编辑指令都是在 commond-mode (c-mode),就是您一进入 vim 时的模式,只能下指令,不能键入文字。如果印象模糊,请瞄一下第一个单元的内容。这个单元说的是
11、基本的指令,有些比较特殊的编辑指令,因为太有个性了,所以会独立成一个单元来说明。进入 i-mode 的指令i 在游标所在字元前开始输入文字(insert)。a 在游标所在字元后开始输入文字(append)。o 在游标所在行下开一新行来输入文字(open) 。I 在行首开始输入文字。此之行首指第一个非空白字元处,要从真正的第一个字元处开始输人文字,可使用 0i 或 gI(vim)。 A 在行尾开始输入文字。这个好用,您不必管游标在此行的什么地方,只要按 A 就会在行尾等著您输入文字。 O 在游标所在行上开一新行来输入文字。J 将下一行整行接至本行(Joint)。并无相对的 split 功能,可在
12、 i-mode 下按 Enter 来达成 ,当然如果您熟 macro 的话,可自行定义。使用 J 时,预设会消去本行的 EOL,且上下行接缝间会留下一个空白字元,这符合英文习惯,却对中文会造成困扰,欲不留空白字元,可使用 gJ(大写 J)指令,但这是 vim 的扩充功能,elvis 不适用。请您随便找一个档案来试看看,光看文字说明太抽象了。 删除指令x 删除游标所在处之字元。在 vim 及 elvis 亦可用 Del 键。X 删除游标前之字元。不可使用 Spaceback 键。vim 可以正确使用以上两个指令于中文,会删去一个中文字 elvis 则不行,一个中文字要删两次,即使用 xx。dd
13、删除一整行(delete line)。dw 删除一个字 (delete word)。不能适用于中文。dG 删至档尾。d1G 删至档首。或 dgg( 创建于: 2004-10-09 11:04:16,修改于: 2004-10-09 11:04:16,已浏览296 次,有评论 0 条 发表于: 2002-09-26 10:09 发表主题: vi 命令常见问题解答 -vi 命令常见问题解答 作者:译者 Elale vi-faq 中文版 0.0 - 引言 - 我怎样用这个 FAQ 这个文档分为了几个部分.首先,第 0 节和第 1 节介绍了什么是 vi;第 2 节则收录了很多新 学者的问题,一些对 vi
14、 没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入 模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第 3 节是面向 vi 的中级用户的,它从 问题“我如何查找和替换”开始,逐步深入,直到对 vi 里面的宏(Macro )的用法讨论为止.第 3 节还包括了一个 vi 的快速参考 ,有一个规范的 vi 命令列表 .再下面,是一个有关“:set”命令的 列表,包含了所有能定制 vi 环境的变量 ,这些变量也可以在.exrc 文件中定义. 我们已经在一个运行 SunOS 和 UCB 版本 vi 的机器上验证了快速参考 .除了 SunOS 带的 vi外, 每个命令都可以在系统 V
15、 和 UCB 版本 vi 运行,但是我个人并没有验证这一点. 除非我们在文档中指明,缺省我们假定你处在命令模式下. 我们还尝试保留尽可能多的术语,因为在原始的 vi 文档中使用了这些术语,尽管我可能 忘了它的本来含义. 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
16、能在多少不同的操作系统下面运行? 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 -
17、我怎样复制文本? 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 - 我怎样在当
18、前文档中做拼写检查? 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 - 关于 v
19、i 的参考书目 0.2 - 我可以散发这个 FAQ 吗? 可以!只要你没有对它做任何修改,或者用它来赚钱. 0.3 - 你能为这个 FAQ 做什么? 首先, 把你发现的错误告诉我. 如果你有什么建议我们也很欢迎. 你认为还不清楚的地方 告诉我们,我们同样欢迎. 还有, 使用 vi! (Spread the word) 我很抱歉我无法将所有对这个 FAQ 有贡献的人都列出 来, 因为许许多多的人都给过我建议和帮助,如果我将他们都列出来的话,那么恐怕这张贡献 者的清单将和这个文档本身一样长了. 1.0 - 什么是 vi? vi 是个可视化的编辑器(vi 就意味着可视化-VIsual). 那么,什么
20、是可视化的编辑器呢? (相对于非可视化的编辑器来说)?可视化的编辑器就是可以让你在编辑文本的时候看到它们. 今天,这听起来似乎非常普通,反之,非可视化的编辑器似乎很奇怪. 非可视化的编辑器的例子 可以举出不少:如 ed, sed 和 edlin(直到相当近的一段时间内 ,它是 DOS 自带的最后一个编辑器) 等. vi 是威廉.侨伊写的,作为 BSD UNIX 的一部分. 后来 AT在这种模式 下,我们可以在文件中到处移动,改变文本的某个特定区域, 剪切, 复制和粘贴文本,还有更 多. 插入模式是指用户可以真正插入文本.换句话说,命令模式是用来在文件中移动,而插入 模式是用来在文件中键入文本.
21、 有些命令,例如: a, i, c, C, O, o 和其他一些可以从命令模式切换到插入模式. 键或者 C(CRTL+C)可以脱离插入模式而返回到命令模式. 你要适应这种差别. 它使得 vi 区别于其他的编辑器. 它也使你能在你的手不离开标准 键盘做很多事情. 2.3 - 等等,我的键盘没有键,我该怎么办? 试试敲 (CTRL+). 如果你的键盘有一个键,再试试它.如果还不行,再试试3. 2.4 - 那些s 是什么东西? 它们仅仅是用来让你知道你的文档末尾在哪儿.实际上它们并不在你的文档里面,所以 你用不着担心它们. 2.5 - 我无法习惯用 hjkl, 你有什么建议吗? 首先,如果你的终端设
22、置正确而且你连接的也没有问题的话,你可以使用箭头键.但是, 如果你认为你要经常使用 vi,那么最好是习惯使用 hjkl,因为它们敲起来更快. 而且, 有时候连接出问题了,使得 ESC 序列都可能丢失了.(这样你可能就无法使用箭头键了-译注) 2.6 - 我如何才能不存盘就退出? :q!可以做到这一点. 如果 vi 看起来冻住了,确信你没有错敲了个 S. 敲Q 可以解开S. 2.7 - 我怎样插入一个文件? :r 例如,要插入文件/etc/motd, 可以敲 :r /etc/motd. 这将把文件插入到光标处.如果你在 r 前面指定了一个数字,那么这条命令将把文件插入 到那个位置. 2.8 -
23、我怎样查找文本? /将向前查找, ?将向后查找. ?或者/将重复上次查找 . 在 UNIX 下,这已经 是个可爱的标准用法了. 而且, 在 vi 中, n 将查找文本下一次的出现位置. N 重复上次查找, 不过逆转了查找的方向. 在查找中可以使用规范式. 2.9 - 我怎样搜索一个控制序列? /V V 会告诉 vi 照字面理解下一个字符,不要把它看作是一条命令. 2.10 - 我怎样重新格式化文本? 如果你的计算机有一个名叫 fmt 的程序, 你要做的仅仅是在命令模式下面敲!fmt(记住, 不要在前面加. 这可以重新格式化你的文件,从光标所在的位置一直到当前段落的结尾. 如果你的机器里面没有
24、fmt 这个程序, 你就得去找个类似的软件了(我记得在公共域里面有 不少这样的程序,但是我对此了解不多) 2.11 - 我怎样复制文本? 这有点复杂.把这节拿出来,多看几遍;还有,一定要多做实验. “yy 可以把一行文本拷贝到寄存器中(这里的寄存器是 vi 的术语,指可以存放剪切和 拷贝下来的东西的地方), 里面的字母必须是 a 到 z 之间的一个. “dd 可以把一行 剪切下来放到寄存器里面. 你可以在 yy 或者 dd 前面用数字指明要拷贝或者剪切的行数.如果 中的字母是大写的话,意味着把文本插入到寄存器中已有的文本之前. “p 把文本插入到光标之后,“P 把文本插入到光标之前.如果寄存器
25、中含有某 一行的开头或结尾,这一行将会被放到另一合适的行上. Y 是 yy 的快捷方式. 还有, y$, yH, yM,等等,都是可以用的.d 命令也是一样的.如果要快速的剪切和粘贴, 你就无须指定寄存器 了.如果这样的话,你就不能往寄存器里面添加文本了.而且只要有一个删除命令的话,寄存器 中的东西就没有了(包括 x 命令 ). 举例来说,如果要移动上一段的话,你可以把光标移到段落的开头,敲“a13dd,再把光标移到 你想要放文本的地方,敲“ap,就可以把那段文本放到光标所在的行后面. 现在,大概你想要剪切和粘贴文本到不是行末尾的区域去.我们来看如何做到这一点:我们 可以使用 m 命令来标记一
26、个区域,这个字母可以和剪切/粘贴寄存器的字母相同,因为 它们是保存在内存中的不同位置. 然后,敲“yy 或者 dd, 这里的寄存器就是 要保存文本的那个寄存器,是用来标记的,yy 和 dd 是你的操作. 2.12 - 啊! 我刚才敲了一个 dG,然后我的论文就没有了! 我该怎么办? (或者,我刚才犯了个错误,我该怎么办 ?) u 可以撤消你刚才的操作.U 可以撤消你对当前行的修改 (当然 ,一行对于一篇论文来说当然 很不够了). :e! 可以不保存修改而重新把你的文件调进来. 还有,你删除的文本都保存在从 0 到 9 编号的寄存器里.所以,“p 就可以把上第 n 次的删除文本粘贴出来.你可以按
27、如下的 方法迅速地查看所有删除的文本. 先试一个,不对的话,敲 u,再试下一个.(为加速这个过程, 这时 vi 中的.命令和通常的用法不一样了 .它不是重复上次操作,而是试下一个寄存器,这样 你要做的无非就是: “1p u . u .,直到你撤消了你想撤消的删除操作) 2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办? :m,nw 可以将从第 m 行到第 n 行之间的文本保存到 所指定的文件中. 这种行序号方法几乎在所有的:命令下都可以使用. 如果你用命令:m,n w , 这些文本将添加到文件的后面. 2.14 - 所有的:命令都是怎样处理的? :后面的命令都
28、是从 ex 编辑器里面过来的. 这就给 vi 加入了很多灵活性 ,也使 vi 功能更强 大. 例如, 有很多的方法可以用来查找和替换,它们有很多的类似地方(事实上,它们在某种 意义上说都是一样的) 3.0 - 怎样查找和替换? 有很多方法. 最简单的是: :s/old/new/g, 但是,这仅对当前行起作用., 所以,我们用 :%s/old/new/g, 更一般的,我们还可以用 :范围s/old/new/cg, 这里,范围 是任意的行范围,包括行号,$(文件末尾),.( 当前行), %(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面 5 行).cgi 是 c,g,
29、i 中间的一个或者什么也没有.c 告诉 vi 每次替换的时候要给提示,g 是说对所有一行中出现 的地方都做替换.i 则是指在查找时不区分大小写 .如果最后一个斜杠(/)后面没有东西的话,那 么 vi 只替换在行中第一次匹配的地方 . 我比较喜欢这样做: :g/foobar/s/bar/baz/g, 这个命令首先搜寻 foobar,然后把它变成 foobaz. 它没有改变 jailbars, 而其他的一些命令可能会改变 jailbars. 这是我的方法,但是可能比较难记. 当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果 你在正规式里用(和)来剥离一个序列的话,
30、你会发现你可以做很多好玩的事情. 例如: :g/(foo)(bar)/s/2/1baz/g 将 foobar 替换成 foobaz 还有一些特殊的序列: 你可以 用命令来左移或右移某一行. 还有, 你可以使用 %来将,(或 等符号 括起来的文本都左移或右移;这时候,你必须把光标放在这些符号(,( 或) 上面. :set sm 会在你敲,或) 显示出对应匹配的,或(来. :set lisp 会对 lisp 编程有些帮助. ()被移到 s 表达式(s-expressions) 外面,如果 原子(atoms)没有停止则 将被移走 . 3.4 - 宏 - 我怎样写宏 ? :map , 其中最多 10
31、个字符,最多 100 个字符. 以后,如果 你敲了,vi 就会用来取代它.所有的宏都是在命令模式下开始的,但是可以 在你想在的模式下终止. 记住,在你想用的控制字符前面加上V. :unmap 将删除这个宏 . :map! 使得将插入到文档 中去. 3.5 - 我怎样将一个功能键定义成一个宏? 如果是#n,n 是 0-9 之间的一个数,那么这个宏就映射成某一个功能键了.(你 可以试一下 F1-F10 之间的键- 译者) 3.6 - 有没有办法缩写文本? 当然了. 这可是 vi 呀,它能做任何事情 ! :ab email ellidzmidway.uchicago.edu 可以在你敲完 email
32、 后,把那个没有缩写 的文本插入到文件中. :una email 取消缩写. 3.7 - 我怎样在当前文档中做拼写检查? 这儿有一个宏可以做到这一点. 这些应该放在你的.exrc 文件中 (后面我们将对.exrc 进一步讨论). 它是一个相当简单的宏 . 它仅仅是调用 ispell 来处理当前文件.当然,你 的系统里面一定得有 ispell 这个程序. 使用它的时候,只需要敲个 V 键就行了(因为 vi 并 没有用 V,所以 V 是一个比较合适的键) map V :wM:!ispell % M:e!MM 第二个M 使你在拼写检查完之后无须敲回车就可以到 vi 中. (译注, 在我的系统里,没有
33、 ispell,只有 spell,我用它替换了 ispell,工作的不错;还有, M 不是两个字符,而是一个字符,通过VM 敲进去的;另外,我个人认为第二个M 还是不要 的好,因为直接回到 vi 后你就无法看到拼写检查的结果了) 3.8 - 我手头有一个硬拷贝的终端, 我还能用 vi 吗? 好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理 它.(而且,它回答了一个非常普通的问题 ) vi 启动的时候处于一种特殊的模式下面 ,叫做“开放模式“; 在这种状态下,事情或多或少 的有些不同. 删除的字符在你面前显示成一些,vi 会认为你的终端窗口只有一行. r 可以把当前行重
34、新输出. z 则把当前行周围的窗口重画一遍. 3.9 - 好了,是不是处在开放模式下的原因呀 ?! 但是我现在没有用硬拷贝终端,它还是在开放 模式呀? 这儿的问题就是 vi 没有认出你用的终端的类型 . 于是它假定你有的是个最烂的终端, 所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放 模式还是需要知道你的终端的一些最起码的信息的. 现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下, 这并没有用处. 如果你直到你的终端的类型, 你可以在 UNIX 提示符下面设置终端类型(在CSH 及其变种下面,使用命令 setenv TER
35、M ; 在 SH 及其变种下面,使用命令 TERM=; export TERM) 最好你能把上面的命令写在.profile 文件或者.cshrc 文件里面,这样你一登录它就自动地给 你设置好了.(当然,你应该知道如何使用 ed,或者你能在 UNIX 提示符下面设置好终端类型以便能 使用 vi, 这样你才有可能去编辑这些文件 ) 如果你确实不知道你地终端类型,试一试 vt100.现在大多数地终端或者终端仿真器都能仿真 vt100. 如果这还不能生效的话 ,你只好去找个高手来帮你了. 4.0 - vi 档案的在线帮助在哪儿? 有一个 vi 的 FAQ,其中列出了 vi 档案的所有在线文件. 同时它
36、还列出了这些文档 的镜象站点. 最主要的一个地址是 alf.uib.no,但是这些文档在很多很多地地方 都保存着. vi-archive faq 把它们都给列出来了.你在下载这些文件之前一定要 核对一下这个 FAQ.因为很有可能有一个站点比去挪威的站点更近更快些. 一个镜象站点是 cs.uwp.edu/pub/vi, 另一个是 monu6.cc.monash.edu.au/pub/Vi, 这些站点上有很多有关 vi 的文件 ,还有一些 vi 的变种版本 ;当然,UCB 版本的 vi 是 肯定有的, 还有许多的宏. 5.0 - 好玩的 vi 诀窍,好玩的宏 这一节主要讲述一些无聊的诀窍和一些无聊
37、的宏.事实上,任何 vi 的诀窍和宏我们 都欢迎,只要它们不是过分冗长. 如果有人向我建议而我也认为确实值得加的话, 我会考虑加进去的. 5.1 - 好玩的 vi 诀窍 xp 删除光标下的字符,再把粘贴到后面去.换句话说,它交换了当前两个字符 的位置. ddp 和 xp 类似,不过是交换两行的位置. uu 撤消和重复上次所做的修改.(这可以使你不改变什么东西就可以到你上次所 做的修改处) 5.2 - 好玩的宏 和垂直上方的字符交换位置 map * kxjphxkP 折行 map g $80|F r (译注,我对这条宏表示疑问!) 改变大多数单词的大小写 map v ywmno:s/./g (译
38、注,这条好象也不大对!) 在当前的单词周围加上和 map * i 在当前的单词周围加上和 map * i 在当前的单词周围加上“和“ map *“ i“ (这几条也太无聊了吧- 译注) 在当前的单词周围加上和 map! (咦,好象又有问题?-译注) 从光标处把当前行分开,在下一行开头加上一个号( 例如,引用 USENET).如果加上了单词的折行 功能那么最后一个单词可能被折在第一行. map g may0Oay$:s/./ /g (不对吧-译注) 插入一个字符 map g i$r 6.0 - 依字母顺序的 vi 快速参考 . 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键 (h,
39、j,k,l,w,b 等等)或者是指行号 . # (这里#代表一个数字) 执行 n 次后面的命令. : 进入 ex 模式 ) 下一句 ( 上一句 下一段 上一段 下一节 上一节 0 行的开头 $ 行的末尾 行的第一个非空白字符 + 下一行的开头 - 上一行的开头 (空格) 下一个字符 (回车) 下一行 / 向前搜索 ? 向后搜索 % 查找当前小(中,大) 括号的匹配字符 , 逆向重复上一个 f,F,t 或 T 操作 ; 重复上一个 f,F,t 或 T 操作 . 重复上一个操作 转到标记处 转到标记所在行的开头 查找前回到上一个做标记的地方 查找前回到上一个做标记所在行的开头 切换字符的大小写 “
40、 保存到寄存器中 ! 重复上一次 SHELL 命令 ! 把后面的文本送给命令, 取代输出 (例如, !fmt 把当前的段落 送给命令 fmt 处理,然后用 fmt 返回的东西替换输出.) 右移当前段落一个移动宽度(shiftwidth) % 从当前到匹配小(中,大)括号之间的文本右移 把读入到当前文档 :r ! 把的输出插入到当前文本中 :nr 把插入到第 n 行 :! 运行,然后返回 :sh 转到 SHELL :so 读取, 再执行文件里面的命令 (译注-文件中的命令应该都是一些 ex 命令) 保存之后退出 :wq 保存之后退出 :l1,l2w 把第 l1 和第 l2 行之间的文本写到中去
41、,如果没有指定, vi 就假定是当前文件,如果没有指定 l1,l2,就假定是整个文件( 就成了:w) :w 添加到末尾. 也可以使用行号 :w! 覆盖当前文件 :q 退出 :q! 不存盘就退出 :e 不离开 vi 编辑 :e! 重新编辑当前文件,忽略所有的修改 :n 编辑下一个文件 :e +n 从第 n 行开始编辑,如果超过了末尾,就从末尾开始编辑 :e# 编辑替换文件( 如果使用了命令:e,替换文件就指的是原始文件) :args 显示所有要编辑的文件 :rew 重新回到第一个编辑的文档 :map m n 创建一个宏( 使 m 做 n) :map! m n 创建一个插入模式的宏(使 m 做 n
42、) :unmap m 删除宏 m :unmap! m 删除插入模式的宏 m :ab 缩写,敲的时候用取代 :unab 取消缩写 :set 设置. 6.2 - 设置选项(set) 可以使用括号中的缩写形式. 语法: :set (如果需要参数的话 ) 也可以在一行中指定多个选项 :set ? 显示出当前这个选项的参数值 :set all 则显示所有的选项值 对那些无须参数的选项来说,使用:set no就可以把它给关了 选项: 缺省值: 含义: autoindent (ai) noai 使新行自动缩进,和上(下) 行的位置对齐 autoprint (ap) ap 每条命令之后都显示出修改之处 aut
43、owrite (aw) noaw 在:n,:!命令之前都自动保存文件 beautify (bf) nobf 在输入的时候忽略所有的控制字符 (除了制表键(tab),换行(newline),进纸(formfeed) directory= (dir=) /tmp 存放缓冲区的目录名 edcompatible noedcompatible 在替换的时候使用类 ed 的用法 errorbells (eb) errorbells 出错的时候响铃 exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc 文件 hardtabs= (ht=) 8 设置硬制表的边界 ignore cas
44、e (ic) noic 正规式里忽略大小写 lisp nolisp 打开 lisp 模式 list nolist 显示所有的制表键和行的结尾 magic magic 可以使用更多的正规表达式 mesg mesg 允许向终端发送消息 number (nu) nonumber 显示行号 open open 允许开放和可视化 optimize (opt) optimize 优化吞吐量,打印时不发回车 paragraphs= (para=) IPLPPPQPPLIbp 设置 配合 f回到首文件:rew;查看当前编辑缓冲文件状态: args。 2.修改包含某一字符串的文件可与 grep 命令结合使用,如
45、欲编辑当前目录下含有 abc字串的所有 C 源程序:vigrep 1 abc .c 3.编辑在缓存中的两个文件快速切换命令: :e 或 Ctrl 使用 Ctrl 命令更便捷,但如终端类型不正确该功能将无效。 4.将一个文件的部分内容读入另一文件中,有以下两种操作方式: (1)将欲读入的内容用 w 命令写入一临时文件,再用 r 命令读入。该方法笨拙,临时文件需清理。 (2)将欲读入的内容写入一临时缓存器后再切换到目标文件,将光标移至需读入内容处,从缓存器中提出。 写入缓存器 a 命令:起始行 mk 结束行ayk 从缓存器 a 中提出:ap 该方法操作方便快捷,不会产生垃圾文件 5.放弃一修改过的
46、文件,重新编辑。 (1)使用命令 :q!强行退出后再 vi flname 重新进入。 (2)使用命令 :e! 强行重编辑更便捷。 6.定位文件尾用 G 比:更快捷,段落定位用 (和)键,括号匹配定位用,定位行首 0,定位行尾,两行连接 J。 7.行左移,行右移 ,该命令用于调整源码缩进格式简便快速。 8.大小写字母自动切换命令:shilft,屏幕刷新 Ctrl1。 9.当编辑的移动键失效时可用:map 命令,但如终端类型不正确该命令将无效。 10.替换命令的特殊处理:文件行首用标识,行尾用标识。 如:1,s/abc/g 表示文件行首加入 abc 字串 1,.s/abc/g 表示文件首行至光标所
47、在行行尾加入 abc 字串 11.在 vi 命令状态直接读入一外部命令执行结果: !外部命令 如: !date 直接读入一系统日期 12.在 vi 中也可输入非 ASCII 码,如欲输入打印机的换页控制码L(码值为 12),其输入方法是先输 Ctrlv 再输 Ctrl1 即可,其中 Ctrlv 是静默值。 13.显示 vi 文本中的隐含字符: set list 取消显示:set nolist 。 14.临时退出至 shell 状态命令:sh ,退出 shell 后将回到原编辑状态,在同一缓存中编辑另一文件:e flname 。 vi 编辑器命令很丰富,但没必要各个都需掌握,只要掌握以上提及的基
48、本命令与技巧,即可自如高 效的编辑文件了。=作者:Wilbur Lang 无论在什么系统上,文本编辑器也许都算得上是最普通和最有用的工具了。一个文本编辑器是一个创建、修改文本和数据对象的程序。他和字处理程序和桌面出版程序的区别是他只处理 plain ASCII 文本,没有格式信息。后者更倾向于处理复杂的文档。一个典型的字处理软件都有图形化的用户界面 (GUI)和 “what-you-see-is-what-you-get“ 的效果。 文本编辑器的一般用途是处理简单的 ASCII 文本、源程序、 e-mail 等等。因此,他们都对相应的处理对象有一定的扩展。例如格式化相应的程序语言 (C+, Lisp, HTML 等)。详细的例子我们将在后面介绍。 我们在这里将为您介绍 UNIX 世界中最常见的编辑器:vi 。您也会发现在这个世界上还有一种人狂热地喜欢 VI。 全屏幕编辑器 VS 行编辑器 全屏幕编辑器就是指用户工作的时候他可