跳至主要内容

在对 OpenVOS 内核进行修改时,我发现自己需要修改大约 150 个文件。这意味着要在源代码控制系统中锁定这些文件,更新版权信息,添加修改历史记录,并进行代码修改(具体操作是添加一条 #include 预处理器语句)。我知道,如果只是靠手动来做这些工作,恐怕要花上很长时间。  因此,我使用了一些快捷方法来加快工作进度。

我首先采取的策略是列出所有需要编辑的文件。我利用我们的源代码控制系统生成了这份列表,但生成的格式并不便于直接使用。  于是,我捕获了该命令的输出结果,并利用 Emacs 键盘宏将其加工成一个命令宏。如果你从未使用过 Emacs 键盘宏,这将是一次美妙的体验。如果你已经用过,可以跳过这一部分,直接进入下一个技巧。

Emacs 编辑器提供了一项命令,可在输入时记录编辑操作。在 OpenVOS Emacs 和 GNU Emacs 中,开始记录命令的命令均为“ESC-(”。此后您输入的每条命令都会被执行并记录下来。当您准备停止记录时,输入“ESC-)”。   您可以通过输入“ESC-m”(在 OpenVOS Emacs 中)或“^X-e”(在 GNU Emacs 中)来一次性执行该键盘宏。键盘宏非常适合编辑高度重复的文件,而这正是我当时面临的情况。以下是一个简化的示例,使用了一组以字母“a”开头的 POSIX 函数列表:

列表

文件数:17,区块数: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

我需要编辑这个缓冲区,使每一行都呈现如下形式:

修复 abort.c

其中 fixup.cm 是一个能够完成多项任务的命令宏(稍后详述)。于是,我删除了前几行,使得 Emacs 缓冲区中只剩下那份重复的文件列表。  将光标置于第一行开头,我输入“ESC-(”开始录制,随后编辑该行,删除前两个“单词”并替换为字符串“fixup”。接着,我将光标移至下一行开头,并输入“ESC-)”结束录制。  以下是我输入的精确操作序列(使用 OpenVOS Emacs 键绑定):

ESC-( ESC-d ESC-d 修正 ^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 保存宏

系统会提示你输入要与该新宏关联的名称。我将我的宏命名为“add_include_file”。随后,我编辑了 start_up.emacs 文件,使其包含以下这一行:

set_key ^z-i add_include_file

于是,我退出 Emacs 并重新启动,以确保 set_key 语句能正常工作。随后,我输入了 fixup.cm 中的文本。我使用了行编辑器,因为我觉得这是更新修改历史记录最简单的方法。

&begin_parameters

文件路径名,req

&end_parameters

!add_copyright &file&

&attach_input

!line_edit &file& -no_backup –no_verbose

l/修改历史结束/

-1

i

/* 2017年10月5日由Paul Green修改为…… */

.

退出

&detach_input

emacs &file&

&return

该宏将添加(或更新)版权信息,在用于标记修改历史记录部分结尾的注释之前插入修改历史记录行,然后进入 Emacs,以便我手动查找添加 %include 语句的位置。

我现在有两个命令宏:“fixup_all.cm”和“fixup.cm”。 前者会针对每个需要修改的文件调用后者一次。随后,我输入“fixup_all”开启了这场马拉松式的编辑工作,我只需找到需要插入 #include 语句的位置,输入“^Z-i”,保存文件并退出即可。剩下的工作都由宏来完成。

尽管编写这些宏花了一些时间,但通过创建这些编辑器和命令宏,我仍然节省了大量时间和精力(可能还避免了一些拼写错误)。这也让原本枯燥的任务变得有趣多了。

希望这些信息对您有所帮助。今天就先说到这里。