VIM - "Pretty" C 中结构的列格式

VIM - "Pretty" column format of structs in C

我有一些包含很多 typedefstruct 的 C 代码,在 VIM:

中看起来像这样
typedef struct {
  int         a;
  someValue*    b;
  someOtherValue* c;
} val_t;

当我通过 :set list 在 VIM 中启用 "print whitespace characters" 时,我看到代码显示如下(. 个字符表示空格,-->表示硬标签):

typedef struct {
  int->-->-->-->a;
  someValue*....b;
  someOtherValue*>>c;
} val_t;

因此,这段代码似乎到处都是硬制表符和空格的混合体,可能是因为使用不同的编辑器来维护它。我正在尝试编写一些命令来整理它。我知道我可以通过 SHIFT+V 进行视觉选择,然后通过以下方式将选择传送到 col

:'<:'>!col

然而,VIM 中的输出看起来很糟糕,因为它似乎 col 只是分隔列 "logically"(即:通过三个硬制表符),而不是词汇上的,输出如下所示:

typedef struct {
  int--->--->--->a;
  someValue*>--->--->b;
  someOtherValue*--->--->--->c;
} val_t;

有没有办法告诉 col 使用固定宽度的硬制表符对齐数据列(即:每个制表符 4 "spaces"),如下所示,以便开头结构中的变量名称在视觉上对齐?期望的结果是:

typedef struct {
  int--->--->--->--->a;
  someValue*>--->--->b;
  someOtherValue*--->c;
} val_t;

这将允许我在 per-block/per-struct 级别上重构一堆头文件,而不是花费数小时手动缩进代码块以使其看起来不错。

谢谢。

您是否卡在硬标签上?如果不是,您可能需要查看 tabular or vim-easy-align.

使用 tabular 你可以做这样的事情:

:?{?+,/}/-Tabularize/\ze\w\+;/

如需更多帮助,请参阅:

:h \ze
:h range