标签:
在参考Learning the vi and Vim Editor的时候发现ex编辑器作为vi的父类, 对于我们深入理解vi和vi的clones的前世今生有很大的帮助, 有必要单独出一个文档来介绍一些常见常用的指令.
$ex practice 在Unix下使用ex editor叫档. 显示结果:
"practice" 6 lines, 320 characters
:
显示该文件的行数,多少个字符.停止在:冒号命令提示符.
p 打印到屏幕, 1p 打印第1行到屏幕, 可以去掉p, 因为行号本身就等价于打印该行的命令. 显示结果:
:1p
With a screen editor you can
:
用逗号隔开, 中间空格可有可无, 打印1到3行. 显示结果:
:1,3
With a screen editor you can
scroll the page, move the cursor,
delete lines, insert characters, and more,
:
vim.note已经介绍过ex的替换命令, 如果没有行号就认为作用于当前行.
:1
With a screen editor you can
:/screen/line/
With a line editor you can
命令修改后行将会重新显示.
:1s/screen/line/
With a line editor you can
使用ex进行编辑
许多ex命令完成的编辑操作在vi中都有更简单的等价命令可以完成.
但在ex命令中可以使用单个命令对大的文本块进行修改, 因此在想对许多行进行修改时,ex命令会更有用.(强调一下, ‘在vi下执行ex命令‘ 和‘在ex下执行ex命令‘是完全两回事)
记住在vi中每个ex命令前必须有:冒号.
delete d 删除行
move m 移动行
copy co 复制行
t 复制行
行地址
对于ex编辑器命令, 必须给出ex所要编辑的行.
对于ex的move和copy必须给出移动或复制文本的目标位置.
那么如何告诉ex要编辑哪些行呢?
1 使用明确的行号
2 使用能帮助你指定相对于文件中当前位置的行号的符号
3 使用搜索模式作为标识所要编辑的行的地址定义行的范围
你可以使用行号明确地定义一行或行的范围.使用明确数字的地址称为绝对行地址.
示例:
:3,18d 删除3到18行
:160,224m23 将160到224行间的内容移动到23行的后面
:23,29co100 将23到29行间的内容复制到100行的后面
:1,10# #可以暂时地显示部分行的行号.
CTRL+G 可以显示当前行的行号.
:= 显示总行数
:.= 显示当前行的行号
上面关于行号的操作可能让你觉地烟花缭乱, 但没有关系, 后面讲到配置文件的时候:setnu 命令永久显示行号, 妈妈再也不用担心我的绝对定位了.
:/pattern/= 显示一个与模式相匹配的行的行号
行地址符
表示行地址的符号叫行地址符, 常用的有以下三个:
. 表示当前行
0 表示文件中的第一行
$ 表示文件的最后一行
% 表示文件中的每一行
示例:
:.,$d 删除当前行到最后一行的文本
:20,.m$ 将20行到当前行的文本移动到最后一行后面
:%d 删除说有的行
:%t$ 将所有的文本复制一份拷贝到文本的末尾
:-,+t0 将当前行的上一行和下一行加上当前行复制到文本的开头部分
除了绝对地址以外,也可以指定一个相对当前行的地址.用符号+和-就像数字运算符一样,当将其方置在数字前面时,这些符号就会加上或减去跟在它们后面的数值.
实例:
:.,.+20d 删除当前行开始下面的20行
:226,$m.-2 将226行到文件末尾的文本移动到当前行的上2行的下面
:.,+20# 显示当前行和下面20行的行号
当前行是假定的开始位置,因此在使用+或-时缺入圆点.
如果在+和-的后面没有跟数字,它们就分别相当于+1和-1.
注意不能把加号跟减号与其后面的数字分开.否则会发生歧意.
++ 代表 当前行+1+1 就是当前行+2
--代表 当前行-1-1 就是当前行-2
搜索模式(注意 : 模式的前面和后面要用斜杆来定界)
:/pattern/d 删除一个包含pattern的行
:/pattern/+d 删除一个包含pattern的行的下面的行
:/pattern1/,/pattern2/d 删除从第一个包含pattern1的行到第一个包含pattern2的行之间的文本
:.,/pattern/m23 移动当前行到第一个匹配pattern的行之间的行到23行的后面
vi中用模式匹配进行删除操作与在ex中使用模式匹配删除操作的不同点:
d/while 删除从当前光标到光标后第一个匹配while字符之间的所有字符, 但是除这些字符以外在同一行上的字符会被保留
:.,/while/d ex会删除指定行的全部, 只要是在匹配间的行都会被删除, 同一行上的所有字符也会被删除
重新定义当前行的位置
实例:
:100,+5 p
First address exceeds second 第一地址在第二地址以后
:100;+5 p
当你使用;号时, 就会将第一个行地址当成当前行而重新计算.
:/pattern/;+10 p
打印第一个匹配/pattern/的行跟它下面10行的内容
你可以使用空格来分隔ex命令中的不同元素, 但是不能在模式里把空格作为分隔符或在替换命令的结尾使用空格.
全局搜索
在vi中使用/ 来搜索文件中的字符, ex也有全局命令g, 可以让你搜索字符并显示找出的所有包含该模式的行. 使用:g! 的作用与:g相反, 使用:g!可以搜索不包含字符的行.可以使用行地址把全局搜索限制在指定的行或行范围.
示例:
:g/pattern 寻找移动到模式最后出现的位置
:g/pattern/p 寻找并显示文件中所有符合模式的行
:g!/pattern/nu 寻找并显示所有不包含模式的行,同时显示这些行的行号
:60,124g/pattern/p 寻找并显示60行到124行之间所有符合模式的行
组合ex命令
在ex中可以使用竖直条(|).它允许用户把多个命令组合在同一个ex提示符下.在使用|时,要注意所指定的行地址.如果一个命令影响到文件中的顺序,那么下一个命令将使用新的行位置进行工作.
注 :| shell中的管线命令,在这里起到的作用跟shell中的;作用很象
:1,3d | s/thier/their/
把第一行到第三行删除.然后在当前行进行替换
:1 , 5 m 10 | g/pattern/nu
把第一行和第五行之间的内容移动到第10行的后面,然后显示所有包含模式的行并列出行号
保存和退出文件
在vi中, 命令ZZ 退出并保存文件, 命令zz 将当前行移动到屏幕中央
在ex中, 使用以下命令控制保存与退出:
:w 把缓冲区的内容写到磁盘中但不退出.可以在编辑期间使用:w保护编辑操作以避免系统瘫痪或重大的编辑错误.
:q 退出编辑器 如果对文件做了修改,在退出时会被阻拦并跳出提示.只有在没有做任何修改的情况下才能顺利的用:q退出
:wq 保存并退出,即使文件没有修改,写操作也会无条件的执行
:x 写文件并退出,只有修改了文件写操作也能进行
:wq 和 :x 虽然都是写文件并退出. 但是:wq是无条件的, 而:x是在修改过的前提下,如果没有修改就:x, 会报错: No write since last change.
:w! 强行保存 可以在只读方式下写入,但必须具有写入的权限
:q! 强行退出 不做任何修改 缓冲区内容被删除
:w practice.new
我们可以将当前缓冲区中的内容保存到一个新的文件中
:230,$w newfile
也可以选择缓冲区中的部分文本保存到一个新的文件中
:340,$w >>newfile
可以将缓冲区的部分内容追加到一个文件的尾部.很像shell中的输出重定向符, 当然学过c++或者c# 的孩儿会怒认出这是输入流, 很形象吧?
把文件复制到另一个文件中
:r filename
在当前文件中读入一个新的文件,默认插入在当前光标的下一行
:185r filename
在当前文本的185行插入一个新的文件
:$r filename
在文件尾部插入一个新的文件
:0r filename
在文件的首部插入一个新的文件
:/pattern/r filename
在匹配模式的下一行插入新的文件
编辑多个文件
编辑多个文件不用频繁的关闭和开启vi.并且可以保留已指定的缩写和命令序列,以及复制缓冲区,这样可以在文件间复制文本.
vi file1 file2
首先屏幕上显示的是file1中的内容.对file1编辑结束后,:w 保存file1,:n 命令调用下一个文件file2
:args 缩写:ar 列出在命令行上指定的文件,当前文件使用方括号括起来
:rewind 缩写 :rew 命令把当前文件重新设置为命令行上指定的第一个文件
调用新的文件
可以在ex中用:e 命令在任何时候切换到另一个文件
:e filename
调用了新的文件后vi把两个文件名记为当前文件名和备份文件名,也可以通过使用符号%和 #来表示.
:e # 返回上一个编辑的文件
:r # 读取上一个编辑的文件
:e! # 放弃对当前文本的修改,返回到上一个文件
:n! # 放弃对当前文件的修改,返回到上一个文件
:e! 放弃对当前文件的修改重新载入当前文件上次保存过的版本
:w %.new 保存当前修改到当前文件名.new的一个文件中去
如果没有首先保存当前文件,并且没有在:e和:n后面添加!来命令vi变换当前文件,那么将不允许使用上述命令来文件之间切换.
在vi中也可以使用CTRL+^ 在文件间来回切换.这个命令与:e #相同.但是对当前文件也要保存或者放弃保存,否则vi将不允许切换到前面的文件中去.
在文件之间进行编辑
当为复制缓冲区指定了单字母名时,就拥有了把文本从一个文件移动到另一个文件的渠道.当使用:e命令把一个新的文件加载到vi缓冲区时,将不会清除命名的缓冲区.因此,通过从一个文件中复制和删除文本,使用:e调用新的文件,然后把命名缓冲区展提到新的文件中,这样就可以在文件间传输文本了.
"f4yy 复制四行到缓冲区f
"fp 把缓冲区中的文本粘贴到当前光标的下面
另一个方法 :ya 复制 :pu 粘贴
示例:
:160,224ya a 讲160行到224行之间的文本复制到缓冲区a中,接下来可以使用:e命令移动到想要放置这些行的文件
:pu a 把缓冲区a中的内容粘贴到当前行的后面
常用Ex命令小结(待更新)
标签:
原文地址:http://www.cnblogs.com/alfayed/p/4649762.html