1

我发现自己编写了一个从 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()可能存在,但为了一般性,我们忽略它!)

4

2 回答 2

2

你可以在 Vim 中通过搜索和替换来做到这一点:

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

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

这将对整个文件进行替换。

这通过执行匹配整行并将其替换为您想要的文本来工作。每个名称在搜索中被捕获到一个组中,这就是\(\w\+\)正在做的事情,然后在替换中使用匹配的文本两次。

于 2013-04-15T18:27:35.457 回答
2

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

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

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

于 2013-04-16T07:25:49.397 回答