Vim得到匹配线的长度

时间:2012-11-10 17:06:03

标签: regex vim

我正在尝试使用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?

2 个答案:

答案 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允许您通过命令或映射将光标右侧的文本与特定列对齐。这样,您可以添加反斜杠,然后将其对齐。