Rust代码格式化工具stylua的使用:高效、可配置的Lua代码格式化库
Rust代码格式化工具stylua的使用:高效、可配置的Lua代码格式化库
简介
StyLua是一个用Rust编写的Lua代码格式化工具,支持多种Lua方言,包括Lua 5.1、5.2、5.3、5.4、LuaJIT、Luau和CfxLua/FiveM Lua。它基于full-moon解析器构建,采用确定性格式化算法,主要遵循Roblox Lua风格指南,同时提供自定义配置选项。
安装方法
从GitHub Releases安装
可以直接下载预编译的二进制文件,默认支持所有Lua语法变体。
使用Cargo安装
对于已安装Rust环境的用户,可以通过Cargo安装:
# 安装基础版本
cargo install stylua
# 按需选择特定Lua版本支持
cargo install stylua --features lua52 # 支持Lua 5.2
cargo install stylua --features lua53 # 支持Lua 5.3
cargo install stylua --features luau # 支持Luau方言
其他安装方式
支持多种安装渠道:
- 通过npm安装
- 使用Homebrew安装
- 作为GitHub Action使用
- 通过Docker容器运行
- 作为VSCode扩展安装
基础使用
安装后,可以通过命令行格式化Lua文件:
# 格式化单个文件
stylua example.lua
# 格式化整个目录
stylua src/
# 检查文件是否需要格式化(不实际修改)
stylua --check example.lua
配置示例
示例代码展示
-- 忽略整个矩阵的格式化
-- stylua: ignore
local matrix = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
}
-- 格式化此变量
local foo = true
-- 忽略代码块格式化
-- stylua: ignore start
local bar = false
local baz = 0
-- stylua: ignore end
-- 格式化此变量
local foobar = false
配置文件示例(stylua.toml)
# 支持所有Lua语法变体
syntax = "All"
# 行宽限制
column_width = 100
# 使用Unix风格换行符
line_endings = "Unix"
# 缩进配置
indent_type = "Spaces" # 使用空格而非Tab
indent_width = 2 # 2空格缩进
# 字符串引号偏好
quote_style = "AutoPreferSingle" # 自动选择,优先单引号
# 函数调用括号
call_parentheses = "Always" # 总是保留括号
# 不折叠简单语句
collapse_simple_statement = "Never"
# 禁用require语句排序
[sort_requires]
enabled = false
完整功能示例
1. 格式化整个项目
# 递归格式化项目目录下所有.lua文件
stylua .
2. 与版本控制系统集成
# 只格式化暂存区中的Lua文件
git diff --name-only --cached | grep '.lua$' | xargs stylua
3. 使用不同配置
# 使用指定配置文件格式化
stylua --config-path .stylua.toml src/
4. 作为预提交钩子
# 在.git/hooks/pre-commit中添加
stylua --check $(git diff --name-only --cached | grep '.lua$')
if [ $? -ne 0 ]; then
echo "Code needs formatting, run 'stylua' first"
exit 1
fi
高级特性
- 部分格式化:可以精确控制哪些代码段需要跳过格式化
- 语法验证:使用
--verify
选项确保格式化后代码语法正确 - 差异检查:
--check
模式适合CI环境集成 - 多方言支持:通过配置支持不同Lua方言的特定语法
编辑器集成配置
Neovim配置示例
-- 使用null-ls集成StyLua
local null_ls = require("null-ls")
null_ls.setup({
sources = {
null_ls.builtins.formatting.stylua.with({
extra_args = { "--config-path", vim.fn.expand("~/.config/nvim/stylua.toml") },
}),
},
})
VSCode配置
{
"editor.defaultFormatter": "JohnnyMorganz.stylua",
"stylua.configPath": ".stylua.toml",
"[lua]": {
"editor.formatOnSave": true
}
}
常见问题解决
-
忽略特定代码块:
-- stylua: ignore start local badly_formatted = { a = 1, b=2, c=3 } -- stylua: ignore end
-
处理长字符串:
local long_string = [[ This is a long string that won't be reformatted because it's in a multiline literal. ]]
-
自定义缩进:
# 在stylua.toml中 indent_type = "Spaces" indent_width = 2 # 2空格缩进
StyLua通过其丰富的配置选项和稳定的格式化能力,成为Lua开发者提升代码一致性和可读性的强大工具。
1 回复
Rust代码格式化工具stylua的使用:高效、可配置的Lua代码格式化库
介绍
StyLua是一个用Rust编写的Lua代码格式化工具,具有以下特点:
- 高性能:得益于Rust的高效实现
- 可配置:支持多种格式化风格选项
- 一致性:确保团队代码风格统一
- 轻量级:无额外依赖,易于集成
安装方法
通过Cargo安装
cargo install stylua
通过包管理器安装
macOS (Homebrew):
brew install stylua
Windows (Scoop):
scoop install stylua
基本使用
格式化单个文件
stylua path/to/file.lua
格式化整个目录
stylua path/to/directory/
检查文件格式(不实际修改)
stylua --check path/to/file.lua
配置选项
创建.stylua.toml
文件来自定义格式化规则:
# 缩进设置
indent_type = "Spaces" # 或 "Tabs"
indent_width = 2
# 行宽
column_width = 80
# 行尾
line_endings = "Unix" # 或 "Windows"
# 引号风格
quote_style = "Auto" # 或 "ForceSingle", "ForceDouble"
# 其他选项
call_parentheses = "Always" # 或 "None", "OnlyOnSameLine"
示例
格式化前
local tbl={1,2,3}
function test(a,b)
return a+b
end
格式化后
local tbl = { 1, 2, 3 }
function test(a, b)
return a + b
end
完整示例
下面是一个完整的项目示例,展示如何在真实项目中使用StyLua:
- 首先安装StyLua:
cargo install stylua
- 创建项目结构:
my_lua_project/
├── src/
│ ├── main.lua
│ └── utils.lua
├── .stylua.toml
└── README.md
- 配置
.stylua.toml
:
# 使用2个空格缩进
indent_type = "Spaces"
indent_width = 2
# 最大行宽100
column_width = 100
# 强制使用双引号
quote_style = "ForceDouble"
# 函数调用保持括号
call_parentheses = "Always"
src/main.lua
格式化前:
local utils= require('utils')
local function calculate(a,b)
local sum = a+b
return sum
end
print(calculate(1,2))
- 运行格式化:
stylua src/
- 格式化后的
src/main.lua
:
local utils = require("utils")
local function calculate(a, b)
local sum = a + b
return sum
end
print(calculate(1, 2))
集成到编辑器
VS Code
- 安装"stylua"扩展
- 添加以下设置:
{
"editor.defaultFormatter": "JohnnyMorganz.stylua",
"editor.formatOnSave": true
}
Neovim
使用null-ls插件:
local null_ls = require("null-ls")
null_ls.setup({
sources = {
null_ls.builtins.formatting.stylua,
},
})
高级用法
使用预置配置
stylua --config-path /path/to/config.toml file.lua
排除文件/目录
[excludes]
"test/*.lua" = true
"vendor/" = true
性能对比
StyLua相比其他Lua格式化工具显著更快:
- 比LuaFormat快约10倍
- 比lua-fmt快约5倍
- 内存占用更低
注意事项
- 格式化会移除所有注释前的空白行
- 某些复杂表达式可能被强制换行
- 建议在版本控制前先格式化代码
StyLua是Lua开发者提升代码质量和团队协作效率的优秀工具,特别适合大型项目和团队使用。