lite-xl/data/plugins/autoreload.lua

57 lines
1.4 KiB
Lua
Raw Normal View History

2021-08-17 15:46:21 +02:00
-- mod-version:2 -- lite-xl 2.0
2019-12-28 12:16:32 +01:00
local core = require "core"
local config = require "core.config"
local Doc = require "core.doc"
local times = setmetatable({}, { __mode = "k" })
local function update_time(doc)
local info = system.get_file_info(doc.filename)
times[doc] = info.modified
end
local function reload_doc(doc)
local fp = io.open(doc.filename, "r")
local text = fp:read("*a")
fp:close()
local sel = { doc:get_selection() }
doc:remove(1, 1, math.huge, math.huge)
doc:insert(1, 1, text:gsub("\r", ""):gsub("\n$", ""))
2019-12-28 12:16:32 +01:00
doc:set_selection(table.unpack(sel))
update_time(doc)
doc:clean()
core.log_quiet("Auto-reloaded doc \"%s\"", doc.filename)
2019-12-28 12:16:32 +01:00
end
2021-10-08 23:15:25 +02:00
local on_modify = core.on_dirmonitor_modify
2019-12-28 12:16:32 +01:00
2021-10-08 23:15:25 +02:00
core.on_dirmonitor_modify = function(dir, filepath)
local abs_filename = dir.name .. PATHSEP .. filepath
for _, doc in ipairs(core.docs) do
local info = system.get_file_info(doc.filename or "")
if doc.abs_filename == abs_filename and info and times[doc] ~= info.modified then
reload_doc(doc)
break
2019-12-28 12:16:32 +01:00
end
end
2021-10-08 23:15:25 +02:00
on_modify(dir, filepath)
end
2019-12-28 12:16:32 +01:00
-- patch `Doc.save|load` to store modified time
local load = Doc.load
local save = Doc.save
Doc.load = function(self, ...)
local res = load(self, ...)
update_time(self)
return res
end
Doc.save = function(self, ...)
local res = save(self, ...)
update_time(self)
return res
end