vi 简介 原文网址:http://school.21tx.com/2005/03/13/16342.html vi 是visual edit 的缩写 进入vi vi test.txt 离开vi :q! 离开vi,并放弃刚在缓冲区内编辑的内容。 :wq 将缓冲区内的资料写入磁盘中,并离开vi。 :ZZ 同wq :x 同wq :w 将缓冲区内的资料写入磁盘中,但并不离开vi。 :q 离开vi,若文件被修改过,则会被要求确认是否放弃修改的内容,此指令可与: w 配合使用。 Vi 的操作模式 Vi 提供两种操作模式: 输入模式(insert mode) 指令模式(command mode) 当使用者进入vi后,即处于指令模式下,此刻键入任何字符皆被视为指令。 输入模式: a (append) 在光标之后输入信息。 A 在该行之末加入信息 i (insert) 在光标之前输入信息 I 在该行之首加入信息 o (open) 在当前行之下新增一行,供输入信息 O 在当前行之上新增一行,供输入信息 指令模式: h 向前移一个字符 j 向下移一个字符 k 向上移一个字符 l 向后移一个字符 指令模式下的视窗移动: 视窗往下卷一页 视窗往上卷一页 视窗往下卷半页 视窗往上卷半页 视窗往下卷一行 视窗往上卷一行 指令模式: B    移至该行第一个字符,若光标在该行第一字符则光标移至上一行第一字符。 b    由游标所在位置之前一个字串的第一个字元 cc 删除整行,修改整行的内容。 D   以行为单位,删除游标在内后面的所有字符。 db 删除该行光标前字符 dd 删除该行 de 删除自光标开始后面的字符 d加字符   删除光标所在位置至字符之间的单 E      移至该行最后字符,若光标在该行最后字符则光标移至下一行最后字符 e      由游标所在位置至该字串的最后一个字元 G 移至该档案的最后一行  0 移至该行之首 M 移至视窗的中间那行 L 移至视窗的最后一行 l 向后移一个字符 0 由游标所在位置该行的第一个字元 nG 移至该档案的第n行 n+ 自游标所在位置向后移n行至该行的第一字符 n- 自游标所在位置向前移n行至该行的第一字符 R 进入取代状态,直到《ESC》为止 s 删除游标所在字元,并进入取代模式直到《ESC》 S 删除游标所在之该行资料,并进入输入模式直到《ESC》 w 由游标所在位置之下一个字串的第一个字元 x 删除游标所在该字元。 X 删除游标所在之前一字元。 r 用接于此指令之后的字元取代(replace)游标所在字元 yy yank整行,使游标所在该行复制到记忆体缓冲区 显示该行之行号、档案名称、档案中最末之行号、游标所在行号占总行号之百分比 $ 由游标所在位置至该行的最后一个字元。 ) 由游标所在位置至下一个句子的第一个字元。 ( 由游标所在位置至该句子的第一个字元。 { 由游标所在位置至该段落的最后一个字元。 } 由游标所在位置至该段落的第一个字元 yank和delete可将指定的资料复制到记忆体缓冲区,而藉有put指令可将缓冲区内的资料复制到荧幕上 例如: 移动一行 :在该行执行dd 游标移至目的地 执行p 复制一行 :在该行执行yy 游标移至目的地 执行p 删除、复制及修改指令介绍: d(delete)、c(change)和y(yank)这一类的指令在vi 中的指令格式为: operation+scope=command (运算子)(范围) 运算子: d 删除指令。删除资料,但会将删除资料复制到记忆体缓冲区。 y 将资料(字组、行列、句子或段落)复制到缓冲区。 p 放置(put)指令,与d和y配合使用。可将最后delete或yank的资料放置于 游标所在位置之行列下。 c 修改(change)指令,类似delete于insert的组合。删除一个字组、句子等 资料,并插入新键入的资料。 指令重复:在指令模式中,可在指令前加入一数字n,则此指令动作会重复执行n次。 例如: 删除10行 :10dd 复制10行 :10yy 取消前一动作(undo):即复原执行上一指令前的结果。 u 恢复最后一个指令之前的结果。 U 恢复游标该行之所有改变。 搜寻:在vi中可搜寻某一字串,使游标移至该处。 /字串 往游标之后寻找该字串。 ?字串 往游标之前寻找该字串。 n 往下继续寻找下一个相同的字串。 N 往上继续寻找下一个相同的字串。 资料的连接: J 句子的连接。将游标所在之下一行连接至游标该行的后面。 若某行资料太长亦可将其分成两行,只要将游标移至分开点,进入输入模式(可利用a、i等指令)在按《ENTER》即可。 使用vi  作为Unix最重要的编辑工具,熟练的掌握vi对于开发人员和系统管理员同样的重要。下面是我的vi的使用经验,希望能够对大家有所帮助。 一.我们先看一下vi的设置项。 ignorecase/noignorcase 忽略/不忽略大小写 tabstop=n 设置tab相当于n个空格 list/nolist 显示/不显示制表符 number/nonumber 显示/不显示行号 二.vi的编辑命令 ndd或nD 删除n行 nyy 拷贝n行 ma 定义宏,使用'a调用 “a 定义缓冲区 /string 查找string字符串 s/old_str/new_str/g 用new_str串替换old_str . 重复上一次操作/光标所在行 ctrl+g 在屏幕底显示文件信息 shift+g 到文件尾 shift+a 到行尾 shift+i 到行首(最先面的字符) ctrl+f/ctrl+d 向下翻一屏/半屏 ctrl+b/ctrl+u 向上翻一屏/半屏 h/l/j/k 向前/后/下/上移动 u 恢复上一个操作 e filename 编辑另一个文件 e# 切换会上一个文件 n 当一次编辑多个文件时,编辑下一个文件;也可以 是重复上一个查找 r filename 从filename中读内容到光标的下一行 w filename 将当前文件的内容写到filename中 sh 暂退出编辑文件,但此文件仍处于编辑状态, 用exit或ctrl+d回到编辑文件 ! 在编辑状态下,执行shell命令 !! 重复执行上一个shell命令 ^ 表示行首 $ 表示行尾 g line_no 到line_no行 shift+5 扩号的匹配(包括小扩号,大扩号,中扩号) n<> 将n行向左/右移动一个tab键的距离的位置 cw 替换一个词 三.举例 1.删除文件中的几行 到删除的开始处 ma 到删除的结束处 d'a 2.拷贝文件中的几行 到拷贝的开始处 ma 到拷贝的结束处 y'a 3.替换文件中所有匹配的字符 替换文件中的 lesson为course s/lesson/course/g 注意:可能替换含有lesson的其他词 4.替换文件中一个区域的字符 start_line, end_line %s/lesson/course/g 或者 采用宏的方式 ‘a,. %s/lesson/course/g #需要定义宏;'.'是指光标所在行 5.替换一个文件中某些词 比如替换none为nothing 查找 /none 替换 cw,输入nothing,按键盘Esc 继续查找 n 替换 . 6.重复执行一个shell命令 编译一个程序 保存编辑后的文件 :w 编译文件 :!make 修改文件后,在保存 :w 再编译 :!! 7.在两个文件互拷贝 第一种方法: 编辑源文件 vi source_file 到拷贝的部分开始处 ma 到拷贝的部分结束处 :.,'a w tempfile 退出当前文件 :q 编辑目的文件 vi dest_file 到拷贝的地方 :r tempfile 第二种方法: 编辑源文件 vi source_file 到拷贝的部分开始处 ma 到拷贝的部分结束处 “ay'a 不退出源文件编辑目的文件 :e dest_file 到拷贝的地方 “ap