71 lines
2.3 KiB
Lua
71 lines
2.3 KiB
Lua
VERSION = "1.1.0"
|
|
|
|
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.Settings["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.Settings["tabsize"] = tabsize
|
|
end
|
|
elseif tabs > spaces then
|
|
buf.Settings["tabstospaces"] = false
|
|
end
|
|
end
|
|
|
|
function init()
|
|
config.AddRuntimeFile("detectindent", config.RTHelp, "help/detectindent.md")
|
|
end
|