在DOS的早期,标准的编辑器是一个叫做Edlin的没有任何装饰的行_编辑器_。蒂姆-帕特森(Tim Paterson)为DOS的第一个版本编写了最初的Edlin,当时称为86-DOS,后来被称为PC-DOS和MS-DOS。帕特森曾评论说,他打算最终取代Edlin,但直到十年后,MS-DOS 5(1991年)才用全屏编辑器Edit取代Edlin。
你可能知道FreeDOS是一个开源的DOS兼容操作系统,你可以用它来玩经典的DOS游戏,运行传统的商业软件,或者开发嵌入式系统。FreeDOS与MS-DOS有很好的兼容性,"Base "包组包括那些复制MS-DOS行为的实用程序和程序。其中一个经典的程序是古老的Edlin编辑器的开源实现;Edlin是在GNU通用公共许可证第二版下发布的。
Edlin由Gregory Pietsch编写,是一个设计良好、可移植的编辑器。你甚至可以在Linux上编译Edlin。正如Gregory在免费电子书《FreeDOS 23年》中描述的那样,顶层解析输入并调用中间层,即一个名为edlib 的库,该库调用字符串和数组处理代码来完成肮脏的工作。 但除了其技术优点外,我发现当我想以 "老式 "方式编辑文本时,Edlin的使用非常愉快。
FreeDOS 1.3 RC4包括Edlin 2.18。这实际上是一个过时的版本,但你可以从Ibiblio的FreeDOS文件档案中下载Edlin2.19。你会发现两个文件--_edlin-2.19.zip_包含源代码,而_edlin-219exe.zip_只是DOS的可执行文件。下载_edlin-219exe.zip_文件,并将其解压到你的FreeDOS系统中。我已经在C:\EDLIN 中解压了我的副本。
Edlin需要一点练习来 "进入 "它,所以让我们编辑一个新的文件来展示Edlin的一些常见操作。
练习
通过输入EDLIN ,然后输入要编辑的文件名,开始编辑文件。例如,要编辑一个名为HELLO.C 的C语言编程源文件,你可以输入。
C:\EDLIN> edlin hello.c
我在这里把FreeDOS的命令全部用小写字母输入。FreeDOS实际上是_不分_大小写的_,所以_你可以用大写或小写输入命令和文件。输入edlin 或EDLIN 或Edlin 将分别运行Edlin编辑器。同样地,你可以将源文件识别为hello.c 或HELLO.C 或Hello.C 。
C:\EDLIN> edlin hello.c
edlin 2.19, copyright (c) 2003 Gregory Pietsch
This program comes with ABSOLUTELY NO WARRANTY.
It is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License -- either
version 2 of the license, or, at your option, any later
version.
hello.c: 0 lines read
*
一旦进入Edlin,你会被一个友好的* 提示所吸引。界面是相当简约的;这里没有闪亮的 "菜单 "或鼠标支持。只要在* 提示下输入一个命令,就可以开始编辑、修改行、搜索和替换、保存你的工作或退出编辑器。
由于这是一个新文件,我们需要添加新的行。我们将用_插入_命令来完成,在* 提示符下输入i 。Edlin提示符会变成: ,你将在这里输入你的新文本。当你完成添加新的文本时,在一行中输入一个句号(.)。
*i
: #include <stdio.h>
:
: int
: main()
: {
: puts("Hello world");
: }
: .
*
要查看到目前为止你所输入的文本,请使用列表命令,在* 提示符下输入l 。Edlin将一次显示一屏的行数,假设显示屏上有25行。但是对于这个简短的 "Hello world "程序来说,源代码适合在一个屏幕上显示。
*l
1: #include <stdio.h>
2:
3: int
4: main()
5: {
6: puts("Hello world");
7:*}
*
你是否注意到第7行的* ,这是文件的最后一行?那是一个特殊的标记,表示你在文件中的位置。如果你在文件中插入新的文本,Edlin会把它加在这个位置。
让我们更新C语言源文件,向操作系统返回一个代码。要做到这一点,我们需要在第7_行_上面添加一行。因为那是Edlin有标记的地方,我们可以使用i ,在这一行之前插入下一个文本。不要忘记在自己的一行中输入. ,以停止输入新的文本。
通过事后列出文件内容,你可以看到我们在正确的地方插入了新的文本,在程序中的结尾 "大括号 "之前。
*i
: return 0;
: .
*l
1: #include <stdio.h>
2:
3: int
4: main()
5: {
6: puts("Hello world");
7: return 0;
8:*}
*
但是,如果你需要编辑文件中的某一行呢?在* ,只需输入你想编辑的行号。Edlin一次只工作一行,所以你需要重新输入整行。在这种情况下,让我们更新main() 函数定义,以使用一个稍微不同的编程语法。这是在第4行,所以在提示符下输入4 ,然后重新完整地输入这一行。
之后列出文件内容,显示更新后的第4行。
*4
4:*main()
4: main(void)
*l
1: #include <stdio.h>
2:
3: int
4:*main(void)
5: {
6: puts("Hello world");
7: return 0;
8: }
*
当你做了所有你需要做的修改后,不要忘记保存更新的文件。在提示符下输入w ,将文件_写回_磁盘,然后用q ,退出Edlin,回到DOS。
*w
hello.c: 8 lines written
*q
C:\EDLIN>
快速参考指南
这个演练展示了使用Edlin编辑文件的基础知识。但Edlin所做的不仅仅是 "插入、编辑和保存"。这里有一个方便的小抄,显示了所有的Edlin功能,其中text表示一个文本字符串,filename是文件的_路径_和名称,num是一个数字(用. 表示当前行号,$ 表示最后一行的行号)。
? | 显示帮助 |
| num | 编辑一个单行 |
a | 在标记下面附加一行 |
[num]i | 在标记前插入新行 |
[num][,num]l | 列出文件(从标记的上方11行开始)。 |
[num][,num]p | 页(与列表相同,但从标记处开始)。 |
[num],[num],num,[num]c | 复制行 |
[num],[num],numm | 移动行数 |
[num][,num][?]s文本 | 搜索文本 |
[num][,num][?]rtext,text | 替换文本 |
[num][,num]d | 删除行 |
[num]t文件名 | 转移(在标记处插入一个新文件的内容 |
[num]w[文件名] | 把文件写到磁盘上 |
q | 退出Edlin |
e[文件名] | 结束(写和退出) |
程序员会有兴趣知道他们可以在Edlin中输入特殊字符,使用这些特殊代码。
\a | 警报 |
\b | 退格 |
\e | 转义 |
\f | formfeed |
\t | 水平制表符 |
\v | 垂直制表符 |
\" | 双引号 |
\' | 单引号 |
\. | 句号 |
\\ | 反斜线 |
\xXX | 十六进制数字 |
\dNNN | 十进制数 |
\OOO | 八进制数 |
\^C | 控制字符 |