-
Notifications
You must be signed in to change notification settings - Fork 1
/
detectindent.lua
70 lines (65 loc) · 2.35 KB
/
detectindent.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
60
61
62
63
64
65
66
67
68
69
70
VERSION = "1.1.1"
local config = import("micro/config")
local util = import("micro/util")
function onBufferOpen(buf)
local spaces, tabs = 0, 0
local space_count, prev_space_count = 0, 0
local tabsizes = {}
local i = 0
while spaces + tabs < 500 and i < 1000 and i < buf:LinesNum() do
space_count = 0
local line = buf:Line(i)
local r = util.RuneAt(line, 0)
if r == " " then
space_count = string.len(util.GetLeadingWhitespace(line))
-- for tab vs space detection, ignore space indents of 1
-- which can be a false signal from C-style block comments
if space_count > 1 then
spaces = spaces + 1
end
-- treat whitespace-only lines as not changing the indent
if string.len(line) == space_count then
space_count = prev_space_count
end
-- look for an increasing number of spaces, ignoring increases of 1
-- which can be a false signal from C-style block comments
if space_count > prev_space_count + 1 then
local t = space_count - prev_space_count
if tabsizes[t] == nil then
tabsizes[t] = 1
else
tabsizes[t] = tabsizes[t] + 1
end
end
elseif r == "\t" then
tabs = tabs + 1
-- treat tabbed lines as not affecting spaced indentation
space_count = prev_space_count
elseif r == "" then
-- treat empty lines as not changing the indent
space_count = prev_space_count
end
prev_space_count = space_count
i = i + 1
end
if spaces > tabs then
buf:SetOptionNative("tabstospaces", true)
-- get the indentation change used for the largest number of lines
local tabsize = -1
local maxcount = 0
for t, count in pairs(tabsizes) do
if count > maxcount then
maxcount = count
tabsize = t
end
end
if tabsize > 0 then
buf:SetOptionNative("tabsize", tabsize)
end
elseif tabs > spaces then
buf:SetOptionNative("tabstospaces", false)
end
end
function init()
config.AddRuntimeFile("detectindent", config.RTHelp, "help/detectindent.md")
end