使用Linux / Vim将头文件或文本文件信息转换为代码

时间:2013-04-15 18:20:40

标签: linux parsing vim opencl text-processing

我发现自己编写了一个非常简单的从OpenCL错误代码到人类可读字符串的转换。 50个左右的不同代码在头文件中定义,如下所示:

...
#define CL_INVALID_CONTEXT -34
#define CL_INVALID_QUEUE_PROPERTIES -35
#define CL_INVALID_COMMAND_QUEUE -36
#define CL_INVALID_HOST_PTR -37
...

我使用专家拷贝/粘贴将所有这些放在一个巨大的开关/案例中:

...
case CL_INVALID_CONTEXT:
  return "CL_INVALID_CONTEXT";
case CL_INVALID_QUEUE_PROPERTIES:
   return "CL_INVALID_QUEUE_PROPERTIES";
case CL_INVALID_COMMAND_QUEUE:
   return "CL_INVALID_COMMAND_QUEUE";
case CL_INVALID_HOST_PTR:
    return "CL_INVALID_HOST_PTR";
...

由于我最近开始使用Vim,我想可能有一种方法可以使用Linux命令工具和Vim以更有效的方式执行此操作。这里有一个类似的帖子,有人声称已经用Emacs完成了它。关于如何避免下次在类似任务中浪费15分钟的任何想法?

(我知道 oclErrorSting()可能存在,但为了一般性的缘故,让我们忽略它!)

2 个答案:

答案 0 :(得分:2)

您可以在Vim中执行搜索并替换:

%s/#define \(\w\+\).*/case \1:^M  return "\1";/g

在输出中获取^M的技巧是键入CTRL-V,然后键入Enter,在输出中添加换行符。

这将替换整个文件。

这可以通过进行与整行匹配并将其替换为所需文本的搜索来实现。每个名称都被捕获到搜索中的一个组中,这就是\(\w\+\)正在做的事情,然后匹配的文本在替换中被使用了两次。

答案 1 :(得分:2)

重复性任务的另一个通用解决方案是使用macros,或者在帮助中调用它们的复杂重复。

基本上,您开始在寄存器中记录输入,创建一个案例,然后转到定义的下一行。

有关详细信息,请参阅:help q