2013-04-15 40 views
1

我发现自己写了一个从OpenCL错误代码到人类可读字符串的非常简单的转换。 50个左右不同的代码在头文件中定义如下:使用Linux/Vim将头文件或文本文件信息转换为代码

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

我用专家的复制/粘贴把所有的这些在一个巨大的switch/case:

... 
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

您可以用搜索为此在Vim中并替换:

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

诀窍在输出中获得^M将输入CTRL-V,然后Enter您希望在输出中放置换行符。

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

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

+0

谢谢,这听起来像我正在寻找! –

+1

@VictorSand您可以在换行符中使用'\ r',而不是''。要仅使用复制粘贴的字符串粘贴,请选择(映射​​类似于'nnoremap gV“\'[”。getregtype(v:register)[0]。“\']”'会有帮助,它会选择粘贴的字符串if粘贴后你没有做任何编辑动作)并输入上面的命令而不用引导'%'。 – ZyX

2

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

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

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