2

我正在尝试使用 vim 替换命令将特定类型的 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?

4

2 回答 2

4

一种解决方案是在行尾添加空格,然后删除到特定列。例如:

:%norm80A <C-v><Esc>d80|s\<cr>

<C-v><Esc>插入文字^[字符并结束<cr>命令。

如果你想在 VimL 中找到一行的长度,你可以使用strlen(getline(6))例如,如果你想获得第 6 行的长度。如果你想在现有的解决方案中实现它,你可以这样做

:%s/$/\=repeat(" ", 79-strlen(getline(".")))."\\"

正如 Zyx 在评论中所说,更好的方法是

:%s/$/\=repeat(" ", 80-virtcol("$"))."\\"
于 2012-11-10T17:19:42.597 回答
1

我的AlignFromCursor 插件可让您通过命令或映射将光标右侧的文本与特定列对齐。这样,您可以只附加反斜杠,然后将其对齐。

于 2012-11-11T12:01:18.823 回答