-
Notifications
You must be signed in to change notification settings - Fork 1
/
zigfmt.lua
59 lines (49 loc) · 1.61 KB
/
zigfmt.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
VERSION = "0.1.1"
PLUGIN_NAME = "zigfmt"
local micro = import("micro")
local config = import("micro/config")
local shell = import("micro/shell")
local COMMAND_NAME = "zigfmt"
local LINTER_NAME = "zigfmt"
local function fullOptionName(name)
return PLUGIN_NAME .. "." .. name
end
local ONSAVE_OPTION_NAME = "fmt"
local ONSAVE_OPTION = fullOptionName(ONSAVE_OPTION_NAME)
local LINTER_OPTION_NAME = "lint"
local LINTER_OPTION = fullOptionName(LINTER_OPTION_NAME)
-- /path/to/test.zig:1:51: error: expected ';', found '}'
local ERROR_PATTERN = "%f:%l:%c: %m"
config.RegisterCommonOption(PLUGIN_NAME, ONSAVE_OPTION_NAME, true)
config.RegisterCommonOption(PLUGIN_NAME, LINTER_OPTION_NAME, true)
function init()
config.MakeCommand(COMMAND_NAME, zigfmt, config.NoComplete)
config.AddRuntimeFile(PLUGIN_NAME, config.RTHelp, "help/zigfmt.md")
if linter then
linter.makeLinter(LINTER_NAME, "zig", "zig", {"fmt", "--check", "%f"}, ERROR_PATTERN, {}, false, false, 0, 0, function(buf)
return buf.Settings[LINTER_OPTION]
end)
end
end
function onSave(bp)
local shouldFmt = bp.Buf:FileType() == "zig" and bp.Buf.Settings[ONSAVE_OPTION]
if shouldFmt then
zigfmt(bp)
end
return true
end
function zigfmt(bp)
bp:Save()
local output, err = shell.ExecCommand("zig", "fmt", bp.Buf.Path)
-- any failure here is a parse error, the linter will handle that
if err then
return
end
-- no files were changed (zig fmt prints the name of changed files)
if output == "" then
return
end
-- the file was changed by zig fmt, so reload it
bp.Buf:ReOpen()
micro.InfoBar():Message("Formatted " .. bp.Buf.Path)
end