简体   繁体   中英

Converting header or text file information to code using Linux/Vim

I found myself writing a really simple conversion from OpenCL error codes to a human readable string. The 50 or so different codes are defined in a header file like this:

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

I put all of these in a huge switch/case using expert copy/pasting:

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

Since I've recently started to use Vim, I am thinking there might be a way to do this in a more efficient way using Linux command tools and Vim. There was a similar post here where someone claimed to have done it with Emacs. Any ideas on how to avoid wasting 15 minutes with a similar task next time?

(I know that oclErrorSting() might exist but let's disregard that for generality's sake!)

You can do this in Vim with a search and replace:

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

The trick to getting the ^M in the output is to type CTRL-V and then Enter where you want put a newline in the output.

This will do the replacement on the entire file.

This works by doing a seach which matches the entire line and replacing it with your desired text. Each name is captured into a group in the search, that's what the \\(\\w\\+\\) is doing, then the matched text is used twice in the replacement.

The other generic solution for repetitive tasks is to use macros , or complex repeats are they are called in help.

Basically you start recording your inputs in a register, create a single case, and then go to the next line of your define.

See :help q for more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM