我有一个由两部分组成的文件(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命令来检索项目但是无处可去。
答案 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