diff --git a/data/core/init.lua b/data/core/init.lua index d964b624..9de283ad 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -1123,6 +1123,7 @@ function core.dir_rescan_add_job(dir, filepath) end +-- no-op but can be overrided by plugins function core.on_dirmonitor_modify() end diff --git a/data/plugins/autoreload.lua b/data/plugins/autoreload.lua index 55a2d99e..9978092e 100644 --- a/data/plugins/autoreload.lua +++ b/data/plugins/autoreload.lua @@ -5,14 +5,11 @@ local Doc = require "core.doc" local times = setmetatable({}, { __mode = "k" }) -local autoreload_scan_rate = 5 - 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") @@ -28,23 +25,19 @@ local function reload_doc(doc) core.log_quiet("Auto-reloaded doc \"%s\"", doc.filename) end +local on_modify = core.on_dirmonitor_modify -core.add_thread(function() - while true do - -- check all doc modified times - for _, doc in ipairs(core.docs) do - local info = system.get_file_info(doc.filename or "") - if info and times[doc] ~= info.modified then - reload_doc(doc) - end - coroutine.yield() +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 end - - -- wait for next scan - coroutine.yield(autoreload_scan_rate) end -end) - + on_modify(dir, filepath) +end -- patch `Doc.save|load` to store modified time local load = Doc.load