如何在 VIM 中将代码与左右缩进对齐



我有这个代码:

struct
{
uint32_t                rsvd0           :  8;
uint32_t                tag             :  8;       
uint32_t                status_qualifer : 16;
} dw0;

我想像下面这样格式化它:

struct
{
uint32_t                rsvd0 :  8;
uint32_t                  tag :  8;
uint32_t      status_qualifer : 16;
} dw0;

如何在 vim 中执行此操作。

谢谢

我想出了这样的东西:

/vs{10}(<w+>)(s{2,})?ze :
:%s//21

注意:我正在使用非常神奇的搜索v使搜索更容易

在替换部分,我们使用正则表达式组 ((,因此我们忽略了第二个单词s{10}之前的 10 个空格。您可以更改要删除的空格数。 然后我们正在创建一个与第二个单词匹配的组(<w+>).之后两个空格或更多(可选(s{2,})?。然后,我们使用很棒的 vimze,空格和冒号来完成比赛。

该命令使用最后一个搜索//该搜索由组 2 替换,后跟组 1。

我的最终结果是:

struct
{
uint32_t                rsvd0 :  8;
uint32_t                  tag :  8;
uint32_t      status_qualifer : 16;
} dw0;

另一种方法涉及两个全局命令,其中第一个 只是删除了列之间的一堆空格。

:g/_t/normal wel10x
:g/  :/normal wwelldt:bP

注意:您可以选择上面的行并运行::@+。我已经测试了这些命令,这同样适用于第一个解决方案。

第一个全局命令在与_t匹配的行处执行普通命令 命令是:

we ....................... jump to the first word and to the end of it
l ........................ move one position to the right
10x ...................... erases 10 chars

seccond 全局命令在与:匹配的行上运行 至少两个空格后昏迷。

ww ....................... jump to the second word
e ........................ jump to the end of the word
ll ....................... move the cursor twice to the right
dt: ...................... delete until before :
bP ....................... move to the word before and pastes the default register

欲了解更多信息:

:h ze
:h magic
:h regex
:h normal
:h global

对于对齐,有三个众所周知的插件:

  • 古老的对齐 - 帮助人们对齐文本、eqn、声明、表格等
  • 现代表格
  • 竞争者 vim-easy-align

您的问题是评估每个插件的绝佳候选者。查看他们的文档页面,尝试一下您看起来最有希望和最容易理解的文档页面。(最好在这里报告,并附上评论,你选择了哪一个。

最新更新