Vim:源代码格式化

8

请看枚举:

enum TestEnum
{
    First = 1,
    Second = 2,
    Unknown = 3,
    TestTestTest = 100,
    Zero = 0,
    Foo = 123,
}

如何使用Vim的全部功能重新格式化它?

enum TestEnum
{
    First           = 1,
    Second          = 2,
    Unknown         = 3,
    TestTestTest    = 100,
    Zero            = 0,
    Foo             = 123,
}

个人而言,我会逐行移动并缩进。这与我在任何常规编辑器中所做的方式相同。如何正确地执行此操作?

对于类成员也是一样的:

class Foo
{
    SuperFoo foo1;
    RegularFoo foo2;
    SuperiorFoo foo3;
    YetAnotherFoo foo4;
    Bar bar;
}

转换为类似于以下内容

class Foo
{
    SuperFoo        foo1;
    RegularFoo      foo2;
    SuperiorFoo     foo3;
    YetAnotherFoo   foo4;
    Bar             bar;
}

谢谢


1
+1. 这是一个有趣的问题。但它似乎非常特定。可能可以使用脚本来完成,但我非常怀疑是否存在原生命令来做这样的事情。 - ereOn
没错,确实如此。在那里使用本地的点操作或类似的东西会很好。 - Stas
1
有插件可以做到这一点,这是有原因的 - 至少没有像 :Align = 这样简单的本地命令。 - Cascabel
2
虽然这种格式可能很好看,但当你需要创建差异并添加一个新的、长的选项时,它就变得非常糟糕了。在这种情况下,你将不得不更新许多行,这会产生相当丑陋的差异。 - ThiefMaster
3个回答

11

3

Align.vim插件可能是最好的选择,但如果你希望在标准安装上方便使用,你可以通过awk过滤来获得一些通用功能,而不需要太多的工作。

对于TestEnum,你可以这样做:

'<,'>!awk '{printf "^I\%-20s\%-20s\%-20s\n", $1, $2, $3}'

在视觉上选择大括号内的内容(在这里使用viB非常棒)。

对于Foo,您需要执行以下操作

'<,'>!awk '{printf "^I\%-20s\%-20s\n", $1, $2}'

你可能可以使用 awk for 循环将其变成可变宽度,但这样会牺牲此处易于快速输入的简单版本的优势。

如果你有 unix 工具 col 方便,你可以尝试:

'<,'>!col -x

但在这里,您的实际使用情况会有很大差异,因为这不是该实用程序的预期用途。

你不需要反复撤销和重复来正确设置awk中的列宽;你可以使用可视块模式(ctrl-v)来裁剪一点,假设你估计过高了。 - Cascabel

0

Align或Tabular听起来是不错的选择,但我还要提到Unix实用程序column,它非常棒,更多的人应该知道。
显然是Unix特定的。(在openSuSE 12.3上,它在util-linux包中;在其他发行版上可能不同。)
要在vim中调用它,请可视化选择要对齐的行,然后
:!column -t
因此,使用vim为您填充的可视范围,当您选中行时,您会得到:
:'<,'>!column -t
(默认情况下,它以空格分隔,但您可以使用-s <separator>选项更改。)
它会将每个列对齐,使其长度恰好足够长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接