跳转至主要内容

在对OpenVOS内核进行修改时,我发现自己面临着修改大约150个文件的任务。这意味着要把它们保留在源代码控制系统中,更新版权,添加修改历史记录行,并对代码进行修改(就是添加一个#include预处理器语句。 我知道,如果我只是简单地开始手工做这些工作,会花很长时间。 所以我使用了几个捷径来更快地完成工作。

我使用的第一个技巧是创建一个我需要编辑的所有文件的列表。 我使用我们的源码控制系统来生成这个列表,但它不是以一种我可以轻松使用的形式。 所以我捕获了命令的输出,并使用emacs键盘宏将其按摩成命令宏。 如果你以前从来没有使用过emacs键盘宏,那你就大饱眼福了。 如果你已经使用过它们,你可以跳过这部分,继续下一个技巧。

emacs编辑器有一个命令,可以在输入编辑请求时进行记录。 在OpenVOS emacs和GNU emacs中,开始记录命令的命令是"ESC-(",之后你输入的每一个命令都会被执行和记录。 当你准备停止记录时,你输入"ESC-)"。 你可以通过输入"ESC-m"(在OpenVOS emacs中)或"^X-e"(在GNU emacs中)来一次性执行键盘宏。 键盘宏非常适合编辑高度重复的文件,这正是我所面临的情况。 下面是一个简化的例子,使用的是以字母"a"开头的POSIX函数列表。

列表

文件:17, Block:19

r 2 abort.c

r 1 access.c

r 1 adjtime.c

r 1 aio_cancel.c

r 1 aio_error.c

r 1 aio_fsync.c

r 1 aio_read.c

r 1 aio_return.c

r 1 aio_suspend.c

r 1 aio_write.c

r 2 alarm.c

r 1 altzone.c

r 1 asctime.c

r 1 asctime_r.c

r 1 asprintf.c

r 1 assert.c

R 1 Atexit.C

我需要编辑这个缓冲区,让每一行都像这样。

修复中止.c

其中fixup.cm是一个命令巨集,它将完成几个任务(稍后再谈)。 所以我删除了前几行,这样emacs缓冲区里就只剩下重复的文件列表了。 我把光标放在第一行的开头,输入"ESC-("开始记录,然后继续编辑这一行,删除前两个"字",用字符串"fixup"代替。然后我把光标留在下一行的开始处,用"ESC-)"结束录音。 下面是我输入的具体顺序(使用OpenVOS emacs键绑定)。

ESC-( ESC-d ESC-d fixup ^N ^A ESC-)

现在第一行已经被编辑好了,我的光标在第二行的开头。由于一切正常,我就输入了。

ESC-99 ESC-m

来编辑文件的其余部分。 由于缓冲区的行数少于99行,所以这个宏一直运行到缓冲区结束,然后停止。然后我把缓冲区写成"fixup_all.cm"。

下一步是写"fixup.cm"命令宏。 我决定先更新版权,更新修改历史,然后进入emacs,这样我就可以手动添加#include语句。 当我还在 emacs 中时,我创建了一个新的键盘宏来在光标处插入必要的 #include 语句。

ESC-( #include "sample.h" ESC-)

由于每个文件我都要输入和退出emacs,所以我必须永久保存这个宏,并将其绑定到一个键上。 emacs请求将当前键盘宏保存为永久宏的命令是"save_macro",但它没有默认的键绑定。 要执行它一次,键入

ESC-r save_macro

它将提示你为这个新的宏取一个名字。 我把我的宏命名为"add_include_file"。 然后我编辑了我的start_up.emacs文件,包含了这一行。

set_key ^z-i add_include_file

所以现在我退出了 emacs 并重新启动了它,这样我就可以确保 set_key 语句能够正常工作。然后我输入了 fixup.cm 的文本。 我使用了行编辑器,因为我认为这是最简单的更新修改历史的方法。

&begin_parameters

文件路径名,要求

&end_parameters

!"add_copyright &file&"。

&attach_input

!"行编辑&file& -no_backup -no_verbose"。

l/修改历史结束/

-1

i

**10-05-17被Paul Green修改为... */。

.

撰写

退出

&detach_input

emacs &file&

归来

这个宏会添加(或更新)版权信息,在我们用来标记修改历史部分结束的注释前添加修改历史行,然后进入emacs,这样我就可以手动找到添加%include语句的地方。

我现在有两个命令宏。"fixup_all.cm" 和 "fixup.cm".前者对每个要修改的文件都会调用后者一次。 然后,我通过输入"fixup_all"开始了我的马拉松式编辑会话,我所要做的就是找到插入#include语句的地方,输入"^Z-i",把文件写出来,然后退出。 剩下的工作由宏来完成。

即使花了很多时间来写宏,我还是通过创建这些编辑器和命令宏节省了很多时间和精力(可能还有一些错别字)。 它还把一个沉闷的任务变成了一个更有趣的任务。

希望你觉得这些信息有用。暂时就到这里吧。

© 2024Stratus Technologies.