学习vi编辑器 —— ex 编辑器

本文详细介绍了ex编辑器的使用,包括行地址、命令范围、搜索模式等功能,以及如何在vi和ex之间切换。ex命令的灵活性使得在进行大量文本编辑时更加高效。此外,还讲解了如何保存、退出文件,以及在多个文件间进行编辑操作的方法,如复制、移动文本。了解并熟练应用ex命令,能够提升在vi编辑器中的工作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011-06-14 wcdj


(一) ex 命令
(二) 使用 ex 进行编辑
(1) 行地址
(2) 定义行的范围
(3) 行地址符
(4) 搜索模式
(5) 重新定义当前行的位置
(6) 全局搜索
(7) 组合 ex 命令
(三) 保存和退出文件
(1) 重命名缓冲区
(2) 保存部分文件
(3) 添加到现有文件中
(四) 把文件复制到另一个文件中
(五) 编辑多个文件
(1) 调用 vi 打开多个文件
(2) 使用参数列表
(3) 调用新文件
(4) 在 vi 中切换文件 —— Ctrl - ^     与     :e #      等价
(5) 在文件之间进行编辑



实际上,ex 并不是另一个编辑器,vi 是更一般、更基本的 ex 行编辑器的可视模式。由于一些 ex 命令可以节省大量的编辑时间,因此在使用 vi 时它们是非常有用的。这些命令中的大部分都可以在不离开 vi 的情况下使用。

(一) ex 命令
虽然使用 vi 进行的大部分编辑都是比较简单的,但是当你想对文件的多个部分进行大规模修改时,ex 的行定位就会显示出它的优势。
对文件调用 ex 行编辑器,将会看到有关文件总行数的信息和冒号命令提示符。
 pic
如果不给出显示一行或多行的 ex 命令,那么将不能看到文件中的任何行。
ex 命令由行地址(行号)和命令组成,它们都以回车键结束。最基本的命令之一是用来打印(到屏幕)的 p。
例如:如果在提示符后输入 1p,将会看到文件的第一行:

注意:
(1) 实际上,可以去掉 p,因为行号本身就等价于打印该行的命令。
(2) 如果要打印多行,则可以指定行号的范围(例如 1, 3 —— 两个数字用逗号分开,中间的空格可有可无)。
(3) 没有行号的命令被认为作用于当前行。因此,例如用一个单词替换另一个单词的替换命令(s)。命令执行后,已修改的行将会重新显示。
 pic

当在文件上使用一些 ex 命令后,应该对同一个文件调用 vi,这样就能看到 ex 更为熟悉的可视方式。
命令 : vi  或 : visual 将使你从 ex 转换到 vi 中。

如果要在 vi 中调用 ex 命令,则必须输入专用的底行字符 : (冒号),然后输入命令并按下 RETURN 键执行它。
例如:在 ex 编辑器中,只要在冒号提示符后输入行号就会移动到该行。如果要在 vi 中使用该命令把光标移动到文件的第6行,可以输入 :6,然后按下 RETURN 键。

(二) 使用 ex 进行编辑
许多完成正常编辑操作的 ex 命令在 vi 中都有更简单地完成相同工作的等价命令。很明显,你会用 dw 或 dd 而不是使用 ex 中的 delete命令来删除单个单词或行。但是,由于 ex 命令允许你使用单个命令对大的文本块进行修改,因此在想对许多行进行修改时,ex 命令会更有用。

注意:在 vi 中每个 ex 命令前必须有冒号。你可以使用完整的命令或该命令的缩写,关键是哪一个比较容易记忆。
完整命令      缩写命令          作用
delete             d                  删除行
move              m                 移动行
copy               co 或 t         复制行      

(1) 行地址
对于每一个 ex 编辑命令,必须给出 ex 所要编辑的行。对于 ex 的 move 和 copy 命令,还需要给出 ex 移动或复制文本的目标位置。

可以使用下面几种方式来指定行地址:
[1] 使用明确的行号。
[2] 使用能帮助你指定相对于文件中当前位置的行号的符号。
[3] 使用搜索模式作为标识所要编辑的行的地址。

(2) 定义行的范围
可以使用行号明确地定义一行或行的范围。使用明确数字的地址称为绝对行地址。
例如:
:3,18d                        删除3~18行
:160,224m23           移动160~224行到23行的下面
:23,29co100            复制23~29行并把它们粘贴到100行的后面    

注意:
(1) 为了更容易地使用行号进行编辑,可以把所有的行号显示在屏幕的左边。命令 :set number 或 :set nu 或 :se nu。取消 :set nonumber。
(2) 为了暂时地显示部分行的行号,可以使用 # 符号。例如  :1,10#    将显示从1到10的行号。
(3) 也可以使用 CTRL-G 命令来显示当前行号。
(4) 另一种指定行号的方法是使用 ex 的 = 命令。
:=                          显示总行数
:.=                         显示当前行的行号
:/pattern/=         显示第一个与模式相匹配的行的行号          

(3) 行地址符
也可以使用表示行地址的符号。
点(.)          当前行
$                    文件的最后一行
%                   文件中的每一行,它等同于 1,$ 的组合

例如:
: . , $d                 删除从当前行到文件末尾之间的文本
:20 , . m$           把从20行到当前行的文本移动到文件的结尾
:%d                     删除文件中所有行
:%t$                   复制所有行并把它们粘贴到文件的尾部(成为连续的副本)
 
除了绝对行地址以外,也可以指定一个相对当前行的地址。符号 + 和 - 就像数学运算符一样,当将其放置在数字前面时,这些符号就会加上或减去跟在它们后面的数值。例如:
: . , . +20d             删除从当前行开始向下的20行
: 226 , $m . -2      把226行到文件末尾的文本移动到当前行上面的第二行
: . , +20#               显示从当前行下面20行的行号(实际上,由于当前是假定的开始位置,因此在使用 +或- 时不需要输入圆点(.))

注意:
(1) 如果在 +和- 的后面没有数字,它们就分别相当于 +1和-1。
(2) ++和-- 相当于 +2和-2。
(3) 在相对地址中,不能把加号或减号与其后面的数字分开。例如:+10 表示“接下来的10行”,而 +  10则表示“接下来的11(1+10)行”,这可能不是我们预计或期望的结果。
(4) 数字 0 代表文件的开头(虚构的 0 行)。0 等同于 1- 。
: - , + t0       复制三行(从光标上面的行到光标下面的行),并把它们粘贴到文件的开头。

(4) 搜索模式
ex 定位行的另一种方法是使用搜索模式。例如:
:/pattern/d                                 删除下一个包含模式pattern的行
:/pattern/ +d                             删除下一个包含模式pattern的行的下面的行(也可以使用 +1 来代替单独的 +)
:/pattern1/ , /pattern2/d         将从第一个包含模式pattern1的行到第一个包含模式pattern2的行之间的内容删除
: . , /pattern/m23                       将从当前行(.)到第一个包含模式pattern的行之间的文本移动到23行的后面

注意:
(1) 模式的前面和后面要用斜杠来定界。
(2) 如果在 vi 和 ex 中使用模式进行删除操作,那么将会发现这两个编辑器的操作方式是不同的。例如:
d/while                    vi 的模式删除命令把从光标位置到单词while之间的文本删除掉,并保留两行的剩余部分。
: . , /while/d            ex 命令会删除指定行的全部,在这种情况下是指当前行和包含模式的行。在它们范围之内的所有行都将删除。

(5) 重新定义当前行的位置
有时,在命令中使用相对行地址可能会带来意想不到的结果。
例如:假设光标在第一行,我们想显示第100行和它下面的5行,如果输入:
:100 , +5 p
我们将得到“First address exceeds second.”的错误信息。命令失败的原因是由于第二个行地址是相对于当前光标位置(第一行)计算的,因此命令实际上是:
:100 , 6 p
我们需要的是使该命令把第100行当作“当前行”的方法,即使光标位于第一行时也是如此。

ex 提供了这样的方法:当你使用分号代替逗号时,就会将第一个行地址当成当前行而进行重算。例如:
:100 ; +5 p                      等价于   :100 , 106 p
:/pattern/ ; +10 p          显示下一个包含模式pattern的行和它下面的10行

(6) 全局搜索
在 vi 中使用 /(斜杠)来搜索文件中的字符模式。
ex 也有全局命令 g,可以让你搜索模式并显示找出的所有包含该模式的行。命令 :g! 的作用与 :g 相反,使用 :g!(或它的同义词 :v)可搜索不包含模式的行。
可以对文件中所有行使用全局命令,也可以使用行地址把全局搜索限制在指定的行或行范围内。
:g/pattern                       寻找(移动到)模式pattern在文件中最后出现的位置(??? 我尝试了下,是全部输出,与 :g/pattern/p 效果相同)
:g/pattern/p                   寻找并显示文件中所有包含模式pattern的行
:g!/pattern/nu                寻找并显示文件中所有不包含模式pattern的行,同时还显示这些行的行号
:60 , 124g/pattern/p     寻找并显示第60行到124行之间所有包含模式pattern的行

注意:也可以将 g 用于全局替换。

(7) 组合 ex 命令
你不必一直输入冒号来开始新的 ex 命令。在 ex 中,竖直条(|)是命令分隔符,它允许用户把多个命令组合在同一个 ex 提示符下(与此类似的是分号分隔UNIX shell提示符下的多个命令)。
在使用 | 时,要注意所指定的行地址。如果一个命令影响到文件中行的顺序,那么下一个命令将使用新的行位置进行工作。例如:
:1 , 3d | s/thier/their/             把1到3行删除,然后在当前行(该行是调用 ex 提示符以前的第4行)进行替换
:1 ,5 m 10 | g/pattern/nu      把1到5行移动到第10行的后面,然后显示所有包含模式pattern的行和行号

注意:使用空格会使命令更容易阅读。

(三) 保存和退出文件
我们已经学习了退出并写(保存)文件的 vi 命令 ZZ。但是由于 ex 命令可以进行更好地控制,因此用户经常想使用它们来退出文件。
:w          把缓冲区写(保存)到文件中但不退出,可以(和应该)在编辑会话期间使用 :w 来保护编辑操作以避免系统瘫痪或重大的编辑错误。
:q          退出编辑器(并返回UNIX提示符)
:wq       写文件并退出编辑器,即使没有修改文件,写操作也会无条件的进行
:x          写文件并退出编辑器,只有修改了文件,写操作才能进行 (注意 :当编辑源代码和使用根据文件的修改时间来执行操作的make时,:wq 和 :x 之间的区别是很重要的。)

vi 对缓冲区中现有文件和你所做的编辑操作进行保护。例如,如果对文件调用 vi 进行了编辑,但不保存编辑就退出,那么 vi 将给如下的错误信息:
No write since last change.
虽然这些警告能防止严重的错误,但是有时可能需要执行这些命令,在命令的后面加上感叹号(!)将忽略 vi 的警告。例如 :w! 或 :q!
注意:
(1) :w! 可以把编辑保存到使用 vi -R 或 view 以只读方式打开的文件中(假设你对该文件具有写权限)
(2) :q! 命令是个基本的编辑命令,它允许你在退出时不影响原来的文本,忽略在本次会话中进行的所有编辑。缓冲区中的内容将被删除。

(1) 重命名缓冲区
也可以使用 :w 将整个缓冲区(正在编辑的文件的副本)保存到新文件中。

假设打开了包含600行的“practice”文件,并且进行了大量的编辑。如果要退出但又想同时保存老版本的“practice”和新编辑的版本以进行比较,使用下面的命令可以把已编辑的缓冲区保存到名为“practice.new”的文件中:
:w practice.new

(2) 保存部分文件
在编辑时,有时只想把文件的一部分保存为一个单独的新文件。
为了保存文件的部分文本,可以把 ex 行地址和写命令 w 结合起来使用。例如:
: 230 , $  w newfile             将从第230行到文件末尾的文本保存到“newfile”中
: . , 600 w newfile               将从当前行到第600行的文本保存到“newfile”中

(3) 添加到现有文件中
可以使用UNIX的重定向添加符(>>)和 w 把缓冲区的全部或部分内容添加到现有文件尾。例如:
:1 , 10 w newfile | 340 , $ w     “newfile”文件将包含从1到10行和从340行到缓冲区尾部的内容

(四) 把文件复制到另一个文件中
有时想把系统中已有的文本或数据复制到正在编辑的文件中,在 vi 中可以使用 ex 命令读取另一个文件的内容:
:read filename
或者使用缩写形式:
:r filename
该命令把filename文件的内容插入到本文件中光标位置后面的行的开始。如果想指定不是光标所在的行,那么只需在 read 和 r 命令之前输入行号(或其他行地址)即可。
:185 r /home/wcdj/data        读取同一个文件并把它放在第185行的后面

注意:是读取整个文件,而不是部分文件。

读取文件的其他方法有:
:$ r /home/wcdj/data                    将要读取的文件放到当前文件的尾部
:0 r /home/wcdj/data                    将要读取的文件放到当前文件的开始
:/pattern/ r /home/wcdj/data      将要读取的文件放到当前文件中包含模式pattern的行的后面

(五) 编辑多个文件
ex 命令可以在多个文件之间进行切换。同时编辑多个文件的好处是速度快。如果正在与其他用户共享系统,那么退出当前文件然后再以要编辑的文件进入 vi 是需要时间的。在同一编辑会话中,在文件之间切换不仅能加速访问,而且还能保留已指定的缩写和命令序列,以及复制缓冲区,这样可以在文件之间复制文本。

(1) 调用 vi 打开多个文件
在首次调用 vi 时,可以指定要编辑的多个文件,然后使用 ex 命令在文件之间进行切换。例如:
$ vi file1 file2
首先编辑 file1,在完成第一个文件的编辑后,ex 的 :w 命令写(保存)file1,:n 命令调用下一个文件 file2。

(2) 使用参数列表
参数列表中,ex 命令不仅仅是使用 :n 移动到下一个文件。:args 命令(缩写 :ar)列出在命令行上指定的文件,当前文件使用方括号 [ ] 括起来。
: rewind (: rew)命令把当前文件重新设置为命令行上指定的第一个文件。"first <="
: last 命令(elvis和vim提供了)用来移动到命令行上的最后一个文件。"=> last"

(3) 调用新文件
你不必在编辑会话的开始调用多个文件,可以使用 ex 的 :e 命令在任何时候切换到另一个文件。
如果想在 vi 中编辑另一个文件,那么首先需要保存当前文件(:w),然后给出命令:
:e filename

在一个时刻,vi 把这两个文件名记为当前和备用文件名,也可以通过使用符号 %(当前文件名)和 #(备用文件名)来指定。
由于 # 允许你在两个文件之间来回切换,即,:e # (注意:只对相临近的两个文件有效)
: e!         放弃编辑操作并返回到当前文件上次保存过的版本中
与 # 相比,% 主要用于把当前缓冲区的内容写到新文件中。由于 % 代表当前文件名(假设当前文件名为 file),因此
:w file.new       等价于 :w %.new

(4) 在 vi 中切换文件 —— Ctrl - ^     与     :e #      等价
由于切换到前面的文件会经常发生,因此,不必移动到 ex 命令下进行这种操作。
vi 的 ^^命令(control键+插入符号键)可以实现这种功能。使用这个命令与输入 :e # 相同。

注意:与 :e # 相同,如果没有保存当前缓冲区,那么 vi 将不允许切换到前面的文件中。(??? 尝试了下,发现不保存也可以切换)

(5) 在文件之间进行编辑
当为复制缓冲区指定了单字母名字时,就拥有了把文本从一个文件移动到另一个文件的便捷方法。
当使用 :e 命令把新文件加载到 vi 缓冲区时,将不会清除命名缓冲区。因此,通过从一个文件中复制或删除文本(如果需要,可以到多个命名缓冲区中),使用 :e 调用新文件,然后把命名缓冲区粘贴到新文件中,这样就可以在文件之间传输文本了。
例如:
$vi file1    打开file1
"f4yy         复制4行到缓冲区f
:w              保存文件
:e file2      使用 :e 进入文件 file2 中,移动光标到要放置复制的文本的位置
"fp            把缓冲区f中已复制的文本粘贴到光标的下面

注意:另一个把文本从一个文件移动到另一个文件的方法是使用 ex 的 :ya(复制)和 :pu(粘贴)命令。虽然这些命令与等价的 vi 命令:y和p 的工作方式相同,但是它们要与 ex 的行地址范围和命名缓冲区一起使用。
例如:
:160,224 ya a        将把第160到224行复制到缓冲区a中,接下来可以使用 :e 命令移动到想要放置这些行的文件
: pu a                      把缓冲区a中的内容粘贴到当前行的后面




 

特色功能: *快速启动 *极致Metro UI *快速上手 *支持皮肤简介 *支持皮肤版权修改 *支持搜索 ex编辑器#历史版本: #3.2——2014-6-1 *修复皮肤绘图功能失效 *修复按钮位置错乱 #3.1——2014-5-15 *加入自动更新功能。 *加入非默认编辑器修正功能。 *修正易语言安装目录读取错误BUG。 *修正在很多皮肤和素材时界面缓冲卡顿BUG。 *修正与eapi.fne(应用接口支持库)冲突对话框“死缠烂打”。 *其他多项细节改进。 #3.0——2014-5-11 *改进UI,酷炫视觉,极致Metro(WP+Win8)风格,极简、极易上手使用体验。 *可调节窗口大小,最小960*600。 *修正素材列表无法显示BUG(感谢 @EX大神 指导)。 *修正素材动画框不绘画BUG *继续优化启动速度,0.3秒可以启动。 *修改软件名称为:“ex编辑器#” *其他多项细节改进。 #2.2——2014-5-7 *继续提升启动速度20%,0.4秒启动。 *加入皮肤搜索历史记录功能。 *修正皮肤素材参数读取错误BUG。 *优化程序体积。 *优化界面,控制透明度,更Metro。 *其他多项细节改进。 #2.1——2014-5-6 *全新wpMetro界面,华丽登场。 *大面积更换EX_UI控件编写。 *使用静态编译,启动速度提高300%。 *加入皮肤搜索功能。 *列表可直接看到简介。 *默认控件更改为wpMetro风格控件。 *加入颜色选择器获得焦点时滚动鼠标快速换色。 *加入文件关联。 *画板颜色更改BUG修复。 *界面布局改进。 *其他多项细节改进。 #2.0 ——2014-4-30 1.改进界面,更加美观大方、科学合理。 2.开启exui简介功能,并可以建立、查看、修改简介。 3.皮肤素材画笔增加可选背景色功能,并可保存颜色设置。 4.增加修改数据功能,可以修改作者、控件名、简介。 5.改进新建页面,加入保存历史记录功能。 6.加入更多快捷键。 安装说明: *为保证可以正常使用本程序功能,请将整个文件夹解压到易语言安装目录, *解压后主程序路径应该为:X:\…\易语言安装目录\ex_ui\ex_ui属性选择对话框.exe(#3.1版本后可以自动提示纠正路径和文件名,除非你选择了取消,忽略) ——ex编辑器#(天朝红雨修改版) 版权声明: *程序基于【每一天,为明天】的开源软件“EX-UI皮肤编辑器1.0”核心修改优化, *程序已对上个版本做了有限的优化,但离完美差之甚远,保持开源,望能抛砖引玉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值