D0I:10.13374/j.issn1001-053x.1984.04.005 北京钢铁学院学报 1984年第4期 屏幕编辑程序Y一edit的研制 软件开发室余重三 摘 要 编辑程序是计算机系统中基本应用软件包之一。文章论述了北京钢铁学院软件开发室研制成功的屏幕编 辑程序Y一edit的主婴设计思想和结构特点 Y-一edit是在U如x操作系统支持下,用C语言编写的,具有很好的可移植性。采用终端虚拟化的方法,Y一 edt可以在任何终端使用。定义了控制命令和对应控制健的语法,给用户提供了自己定义控制命令和对应控 制健的便利。采用GaP工作区域结构和简化控制命令。以提高响应速度。 通过研制Y一edit,为设计系统应用程序提供了成功的经验。 前 言 正象作家希望有一支得心应手的笔去写作修改文章,使用计算机的用户也希望有一 个灵活方便,功能齐全的编辑程序去编写修改程序。编辑程序是计算机系统中基本应用 软件包之一。 最近我们在北京钢铁学院软件开发中心Intel86/330x机上,设计,研制了一个可用 于任何CRT终端的屏幕编辑程序Y-©dit,具有结构合理,简单易学,使用方便,响应速 度快等特点,达到预期效果。 编辑程序的现状及Y一edit的特点: 随着计算机迅速发展,推广应用,越来越多的人们使用计算机去完成各种工作,其中 必须的一步,就是通过各种方式向计算机输入或修改程序。通过在纸带卡片上穿孔输入, 修改文件的方法是不能适应用户需要,正在逐步被淘汰。编辑程序应运而生,很快被用户 所熟悉和掌握,成为编写、修改程序的得力工具。目前国内引进的各种计算机大多都配备 了功能大小不等的编辑程序。 但并不是所有计算机配备了功能齐全的编辑程序,部分编辑程序也有不足之处。比如 Intel系列中微处理机86/330x虽然配备了Unix操作系统的行编辑程序ed和屏幕编辑程序 Vi,实际上仅具有Unix操作系统ed和Vi的部分功能,不能很好地满足用户要求。 各个公司用于移动CRT终端光标的控制代码串是各种各样的,所以大多数屏幕编辑程 序是按照特定CRT终端设计的。这样要使用屏幕编辑程序,就必须使用该公司的CRT终端 设备。这种情况,限制了屏幕编辑程序在各种CRT终端的使用。 每个屏幕编辑程序都有一套固定的控制命令与对应的控制健,用户无法根据自己习惯 去更改或重新定义控制命令与对应的控制健。这就要求用户每使用一个新的屏幕编辑程 55
北 京 钢 铁 学 院 学 报 年 第 期 屏幕编辑程序 一 的研制 软件开 发 室 余重三 摘 要 编辑程序是计算机 系统中基本应用软件包之一 。 文章论述了北京钢铁学院软件开发室研制成功 的 屏幕编 辑程序 一 的主要设计思想和结构 特点 一 是在 川 操作系统支持下 ,用 语言编写 的 ,具有很好的可移植性 。 采用终端虚拟化的方 法 , 一 可以在任何终端使用 。 定义了控制命令和对应控制键的语法 , 给用户提供了 自己定义控制命令和对应控 制键的便利 。 采用 工作区域结构和简化控制命令 。 以提高响应速度 。 通过研制 一 , 为设计系统应用 程序提供了成功 的 经 验 。 启介 护 日 巨 正象作家希望有一 支得心应手的笔去写作修改文章 , 使用计算机的用 户 也希望 有 一 个灵活方便 , 功能齐全的编辑程序去 编写修改程序 。 编辑程序是计算机系统中 基 本 应 用 软件包之一 。 最近我们在北京钢铁学 院软件开 发中心 机上 , 设计 , 研制 了 一个可用 于任何 终端的屏 幕编辑程序 一 , 具有 结构合理 , 简单易学 , 使用方 便 , 响应速 度快等特点 , 达到预期效果 。 编辑程序的现状及丫一 的特点 随着计算机迅 速发展 , 推广应 用 , 越来越多 的人们使用计算机去完成各种工 作 , 其中 必须的一 步 , 就是 通过 各种方式 向计算机输入或修改程序 。 通过在纸带卡片上穿孔输入 , 修改文件的方法是不 能适应用户 需要 , 正在逐步被淘汰 。 编辑程序应运而生 , 很快被用户 所熟悉和掌握 , 成为 编写 、 修改程序的得力工具 。 目前国 内引进 的各种计算机大多都配备 了功能大小不等的编辑程序 。 但并不是所有计算机配备了功能齐全的编辑程序 , 部分编辑程序也有不足之 处 。 比如 系列中微处理 机 虽然配备 了 操作系 统 的行编辑程序。 和屏 幕编辑 程 序 , 实际上仅具有 操作系统 和 的部分功能 , 不能很好地满足用户要求 。 各个公司用于移动 终端光标 的控制 代码 串是 各种各样的 , 所 以大多数屏幕编辑程 序是按 照特定 终端设计的 。 这样要使用屏 幕编辑程序 , 就必须使用该公司 的 终端 设备 。 这种情况 , 限制 了屏 幕编辑程序在各种 终端的使用 。 每个屏幕编辑程序都有一 套固定的控制命令 与对 应 的控制键, 用户无法根据 自己习 惯 去更改或重新定义控制命令与对应的控制键 。 这就要求用户每使用一个新的 屏 幕 编 辑 程 导 ‘口 DOI :10.13374/j .issn1001-053x.1984.04.005
序,就要重新学习,熟悉该编辑程序所规定的一套控制命令与对应的控制键。 除了上述问题外,引进的编辑程序的一个较普遍问题是我们一般得到的是目标程序, 而不是源程序,难以对编辑程序的功能进行修改和扩充。 我们决定自己编写屏幕编辑程序,以解决以上问题。要求Y一edit屏幕编辑程序具有 以下特点: 1.独立于特定的CRT终端设备,能在任何CRT终端上使用。 2。用户可根据自己的习惯重新定义控制命令与对应的控制键 3。响应速度是编辑程序的重要指标,我们要求Y一edit的响应速度高于Vi。 概 述 Y一edit是在Intel86/330x上设计、运行的,Intel86/330X是美国Intel公司在1982年推 出的一个高性能微机系统。主存256K,可扩充到1M,(现为640K),配有35MB温盘和 1MB软盘。· Intel86/330x采用Xenix操作系统(Unix第七版本)是多用户分时操作系统,最多可 接9个CRT终端,(现为三个CRT终端,主终端为Televideo Models95O,其余为Model-- 910)。有较丰富的系统软件,可以运行多种算法语言和系统程序语言。 考虑Unix操作系统是相当成功的操作系统,C语言是功能很强的系统程序语言,Unix 本身是用C语言编写的,C语言可以直接调用Unix系统程序,使用Uix文件系统,我们 决定采用C语言编写Y一edit程序,在Unit操作系统支持下运行。 主要设计思想 在设计Y一edit时,首先考虑使Y一edit在任何终端都能使用,通常想到的方法是使终 端虚拟化。虚拟终端是人们假定的终端,它具有一些标准参数,如终端屏幕的行数,列数, 光标移动的延迟时间等:和一些标准功能,如光标上移一行,下移一行,清除屏幕一行字符, 清除整个屏幕等等。我们以虚拟终端的这些标准参数,标准功能做为Y一edit设计的依据。 在Unix操作系统中,有一个文件/etc/termcap'它把各个制造商的各种起止同步无顺序 终端的属性,做为数据记录下来(见表1)。 表1终端属性数据库(/etc/tenmcap的主要项目 (一共有92个项目,*表示基本功能) al·add new blank line ¥插入空白行 am automatic margins 左右边自动换行(yes/no) be back cursor 光标向左 bs back space work BS有效吗?(yes/no) bt back tab 反方向列表 cd clear to end of display 共清除到画面末尾 ce clear to end of line 清除到行末(=HO一CD) cl clear screen 光清除整个画面 66
序 , 就要重新学习 , 熟悉该编辑程序所规定的一 套控制命 令与对应的控制键 。 除 了上述 间题外 , 引进的编辑程序的一个较普遍 问题是 我们一般得到的是 日标程序 , 而不是源程序 , 难 以对编辑程序的功能进行修改和扩充 。 我们决定 自己 编写屏 幕编辑程序 , 以解决以上 问题 。 要 求 一 屏 幕编辑程序具有 以下特点 独立于特定的 终端设备 , 能在任何 终端上使用 。 用户可根据 自己的习惯 重新定 义控制命令 与对应的控制键 响应速度是 编辑程序的重要指标 , 我们要求 一 的 响应 速度高于 。 概 述 一 是在 上设计 、 运行的 。 是美国 公司在 年报 出的一 个高性能微机系统 。 主存 , 可扩充到 , 现 为 , 配有 温盘 和 软盘 。 一 采用 议操作系统 第七 版本 是 多用户分 时操作系统 , 最 多 可 接 个 终端 , 现为 三个 终 端 , 主终端为 , 其余为 。 有较丰富的系统软件 , 可 以运行多种算法语言和系 统程序语言 。 考虑 操作系统是相 当成功的操作系统 , 语言是功能很强的系统程序语言 , 本身是用 语言编写的 , 语言可 以直接调 用 系统程序 , 使用 文件系 统, 我 们 决定采用 语 言 编写 一 程序 , 在 操作系统支持下运行 。 主要设计 思想 在设计 一 时 , 首先考虑使 一 在任何终端都能使用 , 通常想到的方 法是使终 端虚 拟化 。 虚拟终端是人们假定的终端 , 它具有一 些标准参数 , 如终端屏 幕的行数 , 列数 , 光 标移动的延 迟 时间等,和一 些 标准功能 , 如光标上移一行 ,下 移一行 , 清除屏 幕一 行字符 , 清除整个屏 幕等等 。 我们 以虚 拟终端的这些标准参数 , 标准功能做为 一 设计的依据 。 在 操作系统中 ,有一个文件 它把各个制造商的各种起止 同步无顺序 终端的属性 , 做为 数据记 录下 来 见表 。 表 终端属性数据库 的主要项 目 一 共有 个项 目 , 关 表示基本功能 · 关 插入空 白行 左右边 自动换行 光标向左 有效吗 反方 向列表 关 清除到画面末尾 清除到行末 一 釜 清除整个画面 月
cm cursor motion 移到光标(X,Y) C○#80 1行长=80个字符 dc delete character 并清除字符 dl delect line 米清除行 do down linc 光标向下 ei end insert mode 插入状态结束 ho home cursor 光标向左上 ic insert character 插入字符 im enter insert mode 转到插入状态 ip pad after char inserted 并插入后的插入(pad) is clear screen labels 清除画面标记 li#24 lines per frame 画面行数=24 nd non-destructive space 光标向右 os overstrike works 可重复工作(yes/no) ta tab *标记 tc entry of similar terminal 参考其它项目 upup line 光标向上 当Y一edit被调用,起动时,它从文件/etc/ttytype确定现行终端类型,然后打开 /etc/termcap文件,找到相应的终端标准参数的具体值和实现标准功能的特定控制字符 串,并赋给虚拟终端的上述参数的T一STR数据结构。Y一edit是通过Ttyset.c模块完成 这些工作。其框图见图1。 业Y一edit要执行虚拟终端的某标雅功能时,通过与该标准功能相对应的T一STR数 据结构,得到实际终端能接受并执行的控制字符串,然后向实际终端发出此控制字符申, 去完成该标准功能。这样就实现了Y一edit在任何终端都能使用的要求。 其次考虑向用户提供能自己定义控制命令和对应控制键的便利。 Y一cdit定义了一组说明各种控制命令所对应的控制键的语句、语法、语义的规范。 首先Y一edit定义了一套控制命令符号,用大写字母串表示,如: D-L表示删除光标左边字符 D-R表示刷除光标右边字符 L表示光标左移 R表示光标右移 U表示光标上移 WRITE表示写一个文件 CD表示改变目录路经,等等。 然后又规定了控制键字符串的 语法、语义规则,如:“AA”表示控制A, “AXb”表示控制X,字符b, AW”=WRITE,表示按控制W,是写入文件命令。 7
。 一 。 移 到光标 , 行长 个 字符 斧 清 除字符 关 清 除行 光标 向下 插 入状 态结束 光标向左上 插入字符 转到插入状 态 关 擂入后的插入 清除画 面标记 画 面行数 光标 向右 可重 复工作 关 标 记 参考其它项 目 光标向 上 当 一 被调 用 , 起动 时 , 它从文件 八 确定现行终端类 型 , 然 后 打 开 文件 , 找 到相应 的终端标准参数的具 体值和 实现 标准功能的特定 控 制 字 符 串 , 并赋给虚 拟终端的上述 参数的 一 数据结构 。 一 是通过 模 块 完成 这些工作 。 其框图见 图 。 当 一 要 执行虚 拟终端 的某 标准功能 时 , 通 过 与该标准功能相对应的 一 数 据 结构 , 得到 实际终端能接受并执 行的控制 字符 串 , 然后 向实际终端发 出此控制字符 串 , 去完成该 标准功能 。 这样就 实现 了 一 在任何终端都能使用的要 求 。 其次考虑向用户提供能 自己定 义控制命 令和 对应 控制键的便 利 。 一 定 义 了一 组 说 明各种控制命 令所对应 的控制键 的语 句 、 语 法 、 语 义的规范 。 首先 一 定 义 了一 套控制命 令符 一 号 , 用大写 字母 串表示 , 如 一 表 示 删 除 光 标 左边字符 一 表示删除光标 右边字符 表示光标左移 表 示光标右移 表示 光标 移 表 示 写 一个文件 表 示 改变 目录 路经 , 等等 。 然 后 又规定 了控制键 字符 串的 语法 、 语 义规则 , 如 “ 人 ” 表 示控制 , “ ” 表示控制 , 字符, 人 ” 表示按拉制 , 是 写入文件命 令 。 乒
“AK”=U,表示按控制K,是光标上移一行的命令, 如果某些终端有功能键F0、F1…F8等,Y-edit定义条件语句和功能键符号,比如: if TERM=Vi200 K0=CD] K1=WRITE endif 表示如果终端类型是Vi200,按功能键F0,是改变目录路经命令,按功能键F1,是 写入文件命令。 读入现行终端类型 这样用户可以按照上述规范去定义控制 命令和对应的控制键字符串,建立一个控制 键文件。当Y一edit运行时,它有一个Key 打开/ctc/termcap 文件 board链表,每一个节点表示一组控制命令 到相应终端入口 及其对应的控制键字符串,在节点用一个两 叉树表示它们的对应关系,左叉存放命令符 号(如D-L,D-R)右叉存放对应的控制健 价成拟终揣基木参数赋值, 字符串。Y一edit可以从用户指定的控制健文 COL-CNT=相应终端行宽 件读入用户定义的控制命令与对应控制健字 ROW-CNT=相应终端行数 符串,建立起相应的控制键链表。当用户从 键盘输入控制字符串时,Y-一edit就可以从 给虚拟终滞帮本功能赋值,如 该链表中找到对应的命令符号,调用相应的 仁c一eol=清除一行字符的控制字中 子程序去执行该命令。这样,就给用户提供 tc-cos=清除屏幕的控制字符中 了自己定义控制命令和对应控制键的便利。 t-c-dc=删除一个字符的控制字串 读入控制键文件和建立控制健链表是由 Keybrd.c模式完成的,其框图见图2。 我们是从两方面考虑去提高Y一edit的响 返回主控程序 应速度的: 图1 Ttyset.c模块流程图 1。屏幕编辑工作区域采用GAP的结构。 在Y一ebt,存放被编辑文件的内存工作区域不是连续地存放被编辑文件的,而是分 成三段(见图3) (1)bof到top段,存放文件开始到光标的部分。 (2)bof到eof段,存放光标到文件结束的部分 (3)top到bot段,是空白的间隙GAP区域。 由于屏幕编辑中使用最频繁的删除、修改、增添等命令都是以光标在文件的位置为起 始点,采用GAP结构,使字符的别除,增添等命令都是以光标在文件的位置为起始点, 采用GAP结构,使字符的删除,增添都是在GAP区域完成的,大大减少了由于增添或别 除字符而在工作区域移动被编辑文件的工作量,提高了响应的速度。 2。简化控制键的输入方式: 58
“ 人 ” , 表示按控制 , 是光 标上移一行的命令 , 如果某些 终端有功能键 、 , , 表示如果终端类型是 ’ 卜 · · … 等 , 一 定义条件语句和功能键符号 , 比如 按功能键 , 是 改变 目录路经命令, 按功能键 , 是 读入 现行 终端类型 打开 八 文件 到 相 应 终端 入 口 给 虎 担终端 荃 木参数 赋值 , 一 相应 终端行宽 , 相应 终端行 数 给 虚拟 终端 墓 本 功能 赋 值 , 如 “ 一 二 畜青除一行字符的控 制字串 一 清除屏幕 的控 制字符 串 一 “ 一 “ 二 删 除一 个字符的控制字串 返回主 控程 序 图 模块流程图 写入文件命令 。 这样用户可 以按照上述规范去定义控制 命令和对应 的控制键字符串 , 建立一个控制 键文件 。 当 一 运行时 , 它有一个 链表 , 每一个节点表示一组控制 命 令 及其对应 的控制键字符 串 , 在节点用一个两 又树表示 它们 的对应关系 , 左叉存放命令符 号 如 一 , 一 右叉存放对应的控制键 字符 串 。 一 可 以从用户 指定的控制健文 件读入用户定义的控制命令与对应控制键字 符 串 , 建立起相应 的控制键链表 。 当用户 从 键盘输入控制字符 串时 , 一 就可 以从 该 链表 中找到对 应 的命令符号 , 调用相 应 的 子程序去执行该命令 。 这样 , 就给用户提供 了 自己定义控制命令和对应 控制键的便利 。 读入控制键文件和建立控制键链 表 是 由 。 模式完成 的 , 其框 图见 图 我们是从两方面考虑去提高 一 的响 应 速度 的 屏 幕编辑工作区域采 用 的结 构 。 在 一 , 存放被编辑文件的内存工作区域不是 连续地存放被编辑文件的 , 而是 分 成三段 见 图 到 段 , 存放文件开始到光标的部分 。 到 段 , 存放光标到文件结束的部分 到 段 , 是 空 白的间隙 区域 。 由于屏 幕编辑中使用最频繁的删 除 、 修改 、 增添等命 令都是 以光标在文件的位置为起 始 点 , 采用 结构 , 使字符的 删除 , 增添 等命令都是 以光标在文件 的位置为 起始 点 , 采用 结构 , 使字符的删除 , 增添都是在 区域完成 的 , 大大减少 了由于 增添 或删 除字符而在工作区域移动被编辑文件的工作量 , 提高了响应的速度 。 。 简化控制键的输入方式
打开指定的控制钱文件 是文件结束吗? 否 返同主控程序 读入一行字符 是说明语 赋值语宫: 条件语句 语法错误: 言,跳过 获得Keyboard 到相应CRT类型 输出错误信患 这行字符 链表的一个节点。把 把功能键代表的字符 控制健字符串赋给节 串赋给Keyboard 节点的左叉。把相应 控制命令赋给节点的 链表的一个节点的 左义。 右叉 把相应控制命令赋 给节点的右叉 Kcyboard 链表 tr Next Next 键表结束 #tok-str Nucl match- "AH L”.“八L” “R” FO aCD”F1D。4 write” “ESC7P” “ESC7Q” 图2 koybrd..c模块流程图和keyboard链表示意图 (1)在编辑命令中,使用最频繁的莫过于删除或增添字符的命令了。因此简化删除和 增漏字符命令的输入方式,对提高响应速度效果最显著。在Y一edit中增添字符,只需要 从健盘上直接输入所增添的字符:删除字符,只需要选择相应删除命令,一般只按一次控 制健就可以了 相比较之下,屏幕编辑程序Vi,增加字符前,要按输入增舔开始命令,‘a',增添字 符后,要按输入结束命令八',这样既使增加一个字符,也要按健三次(输入命令两次, 字符本身一次)。降低了响应速度。 (2)Y一edit绝大多数控制健是不可见字符(如控制A,控制B…等),这样控制 字符与增添的字符(一般是可见字符)相区别,减少了要增深字符是控制健字符时的麻 ,提高了响应速度。 59
寸 ‘ 开于肯定的控制键 文件 返同主控程序 读 入一行字符 是说 明语 赋值语 言 条到件相语应旬 类型 输语出法错错误误信息 言 , 跳过 获得 把功能键代表的 字符 这行字符 链表的一 个节点 。 把 串赋给 上 ‘ , 。 ‘ 一 六 ‘ , 含 夕幻沈七 链表的一个节点的 左叉 。 侄 键 子付 币 然万 一 把相应控制 命令斌 节点的左叉 。 把相应 给节点的右叉 控制命令赋 给节点的 右叉 书 镇表结束 “ 八 ’, , 图 了 。 模块流程图和 了 链表示愈图 、 在编辑命令 中 ,使用最频繁的莫过于删除或增添字符的命令了 。 因此简化侧除和 增举宇特命令的输入方式 , 对提高响应 速度效果最显著 。 在 一 中增添字符 , 只 舫 要 从健盘上直接输入所增添的字符, 删除字符 , 只 需要选择相应删除命令 , 尸般只按一 次控 制键就可 以 了 相比较之下 , 屏幕编辑程序 , 增加字符前 , 要按输入增添开始命令 , ‘ ’ , 增添字 符后 , 要按输入结束命令 ‘ ’ , 这样既使增加一个字符 , 也要按键三次 物入命令两 次 , 字符本身一 次 。 降低 了响应速度 。 一 绝大多数控制键是不可见字符 如控制 , 控制 二 等 , 这样 控 制 字符与增添的字符 一般是可见字符 相 区别 , 减少 了要增添字符是控制键字符 时 的 麻 级 , 提高了响应速度