用包含索引向量的一系列行中的名称替换索引

时间:2015-10-13 17:41:08

标签: vim

我有一个由两部分组成的文件(Items& Vectors),如下所示:

#include <stdio.h>

#define COLOR_TABLE \
X(red, "red")       \
X(green, "green")   \
X(blue, "blue")

#define X(a, b) a,
enum COLOR {
  COLOR_TABLE
};
#undef X

#define X(a, b) b,
char *color_name[] = {
  COLOR_TABLE
};
#undef X

int main() {
  enum COLOR c = red;
  printf("c=%s\n", color_name[c]);
  return 0;
}

我想像这样修改Vectors部分:

#include <stdio.h>

#define COLOR_TABLE \
X(red)   \
X(green) \
X(blue)

#define X(t) t,
enum COLOR {
  COLOR_TABLE
};
#undef X

#define X(t) #t,
char *color_name[] = {
  COLOR_TABLE
};
#undef X

int main() {
  enum COLOR c = red;
  printf("c=%s\n", color_name[c]);
  return 0;
}

我想在Vim中独家完成。

有没有办法自动替换索引?

索引表示定义项目的行号。

我做了几次尝试混合:使用\ = line()函数的s命令来检索项目但是无处可去。

2 个答案:

答案 0 :(得分:4)

当然,你可以只使用一些Vim脚本。

:s/\v\d+/\=getline(str2nr(submatch(0)))/g

即,

  • :s ubstitute
  • 任何数字序列\v\d+
  • 使用表达式getline(str2nr(submatch(0)))的值(取整个匹配,将其转换为数字,然后获取相应行的内容),
  • 并对g行中的所有匹配进行详尽的介绍。

使用可视模式将替换命令应用于您的“矢量”#39;部分:

:'<,'>s/\v\d+/\=getline(str2nr(submatch(0)))/g

答案 1 :(得分:0)

您可以使用替换子替换表达式。

首先创建一个键/值对的字典:

let dict = { '1': 'One', '2': 'Two', '3': 'Three', '4': 'Four', '5': 'Five', '6': 'Six', '7': 'Seven', '8': 'Eight', '9': 'Nine'}

现在在文本正文上运行替换:

%s/\d/\=get(dict, submatch(0), submatch(0))/g

子替换表达式将使用匹配dict通过get()函数查找字典submatch(0)的值。

如需更多帮助,请参阅:

:h sub-replace-expression
:h get(
:h dict