我正在尝试使用vim substitute命令将特定于类型的C代码转换为宏代码。此示例代码段
#define LIST_GEN_FUNCS(TYPE)
struct list_##TYPE* list_generate() {
struct list_##TYPE* ret = malloc(sizeof(struct list));
ret->len = 0; ret->first = 0;
return ret;
}
需要看起来像这样:
#define LIST_GEN_FUNCS(TYPE)
struct list_##TYPE* list_generate() { \
struct list_##TYPE* ret = malloc(sizeof(struct list)); \
ret->len = 0; ret->first = 0; \
return ret; \
} \
要做到这一点,我需要一种方法来填充所有具有空格的列,直到固定的行长度,然后在每行结束后添加'\'。
%s/$/\= submatch(0) . " " . repeat(" ", 78 - LENGTH_OF_LINE)
现在,这是我的问题。我无法找到如何获得匹配线的长度。谁能告诉我,插入什么作为LENGTH_OF_LINE?
答案 0 :(得分:4)
一种解决方案是在行尾添加空格,然后删除到特定列。例如:
:%norm80A <C-v><Esc>d80|s\<cr>
<C-v><Esc>
插入文字^[
字符,<cr>
结束命令。
如果你想在VimL中找到一条线的长度,你可以使用strlen(getline(6))
,例如,如果你想获得第6行的长度。如果你想在现有的解决方案中实现它,你可以做到< / p>
:%s/$/\=repeat(" ", 79-strlen(getline(".")))."\\"
正如Zyx在评论中所说,更好的方法是
:%s/$/\=repeat(" ", 80-virtcol("$"))."\\"
答案 1 :(得分:1)
我的AlignFromCursor plugin允许您通过命令或映射将光标右侧的文本与特定列对齐。这样,您可以添加反斜杠,然后将其对齐。