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