返回 2026-05-09
🛠 工具 / 开源

掌握 Zig fmt 的两条实用技巧Steering Zig Fmt

matklad.github.io·2026-05-08

本文分享了两个提高 Zig 代码格式化效率的技巧:一是利用 `zig fmt` 自动对齐复杂表达式;二是通过自定义 `.zigfmtignore` 文件排除特定目录或文件不被格式化。这些技巧可显著提升大型项目的代码一致性维护效率。

使用 zig fmt 的两个小技巧。如果你正在编写 Zig 代码,或者正在实现一个代码格式化工具,请阅读以下内容。

对我来说,zig fmt 比我用过的任何其它格式化工具都要好:rustfmt、IntelliJ 内置的格式化器、deno fmt。zig fmt 是可控的。对于每一种语法结构,它都提供了多种排版方式,具体采用哪一种,取决于文件中当前的内容。

更容易通过一对例子来说明:

    f(1, 2,
      3);

// -> zig fmt ->

    f(1, 2, 3);
    f(1, 2,
      3,);

// -> zig fmt ->

    f(
        1,
        2,
        3,
    );

根据末尾是否有逗号,函数调用可以格式化为单行,也可以每个参数占一行。

实际使用中,你决定希望代码如何排版,添加几个逗号,按下重新格式化快捷键(我的是 , p),剩下的就交给 zig fmt 处理。这比让格式化工具猜测要好得多。90% 优秀的代码排版都体现在逻辑块之间的空行和恰到好处的中间变量选择上,因此不如干脆做出关键选择,而不是完全依赖工具消除这些选择。

我知道有一个非平凡的格式化自定义点:数组的列式布局:

    .{ 1, 2, 3,
       4, 5, 6, 7, 8, 9, 10, 11,  };

人们可能会认为末尾加逗号会导致每行一个元素,但对于数组,zig fmt 还会考虑第一行的换行位置。在这种情况下,换行出现在前三个元素之后,因此我们得到每行三个数字,并且对齐排列:

    .{
        1,  2,  3,
        4,  5,  6,
        7,  8,  9,
        10, 11,
    };

这真是太酷了!

此外,通过巧妙使用 ++,可以灵活调整每行的元素数量。当我需要将 --key value 对传递给子进程时,通常会这样格式化:

try run(&(.{ "aws", "s3", "sync", path, url } ++ .{
    "--include",            "*.html",
    "--include",            "*.xml",
    "--metadata-directive", "REPLACE",
    "--cache-control",      "max-age=0",
}));

需要完整排版与评论请前往来源站点阅读。