Split out reload functionality to actual document, and added in a thread to check the document, in the cases where it wouldn't be covered by dirwatch.
This commit is contained in:
parent
d56f4e1ee5
commit
173370694e
|
@ -466,6 +466,10 @@ local commands = {
|
||||||
command.perform("doc:save-as")
|
command.perform("doc:save-as")
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
["doc:reload"] = function()
|
||||||
|
doc():reload()
|
||||||
|
end,
|
||||||
|
|
||||||
["file:rename"] = function()
|
["file:rename"] = function()
|
||||||
local old_filename = doc().filename
|
local old_filename = doc().filename
|
||||||
|
|
|
@ -80,6 +80,16 @@ function Doc:load(filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function Doc:reload()
|
||||||
|
if self.filename then
|
||||||
|
local sel = { self:get_selection() }
|
||||||
|
self:load(self.filename)
|
||||||
|
self:clean()
|
||||||
|
self:set_selection(table.unpack(sel))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function Doc:save(filename, abs_filename)
|
function Doc:save(filename, abs_filename)
|
||||||
if not filename then
|
if not filename then
|
||||||
assert(self.filename, "no filename set to default to")
|
assert(self.filename, "no filename set to default to")
|
||||||
|
|
|
@ -14,17 +14,8 @@ local function update_time(doc)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function reload_doc(doc)
|
local function reload_doc(doc)
|
||||||
local fp = io.open(doc.filename, "r")
|
doc:reload()
|
||||||
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$", ""))
|
|
||||||
doc:set_selection(table.unpack(sel))
|
|
||||||
|
|
||||||
update_time(doc)
|
update_time(doc)
|
||||||
doc:clean()
|
|
||||||
core.log_quiet("Auto-reloaded doc \"%s\"", doc.filename)
|
core.log_quiet("Auto-reloaded doc \"%s\"", doc.filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -41,20 +32,23 @@ local function check_prompt_reload()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function check_if_modified(doc)
|
||||||
|
local info = system.get_file_info(doc.filename or "")
|
||||||
|
if info and times[doc] ~= info.modified then
|
||||||
|
if not doc:is_dirty() then
|
||||||
|
reload_doc(doc)
|
||||||
|
else
|
||||||
|
doc.deferred_reload = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local on_check = dirwatch.check
|
local on_check = dirwatch.check
|
||||||
function dirwatch:check(change_callback, ...)
|
function dirwatch:check(change_callback, ...)
|
||||||
on_check(self, function(dir)
|
on_check(self, function(dir)
|
||||||
for _, doc in ipairs(core.docs) do
|
for _, doc in ipairs(core.docs) do
|
||||||
if dir == common.dirname(doc.abs_filename) then
|
if dir == common.dirname(doc.abs_filename) then
|
||||||
local info = system.get_file_info(doc.filename or "")
|
check_if_modified(doc)
|
||||||
if info and times[doc] ~= info.modified then
|
|
||||||
if not doc:is_dirty() then
|
|
||||||
reload_doc(doc)
|
|
||||||
else
|
|
||||||
doc.deferred_reload = true
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
change_callback(dir)
|
change_callback(dir)
|
||||||
|
@ -62,10 +56,28 @@ function dirwatch:check(change_callback, ...)
|
||||||
check_prompt_reload()
|
check_prompt_reload()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local set_active_view = core.set_active_view
|
local set_active_view = core.set_active_view
|
||||||
function core.set_active_view(view)
|
function core.set_active_view(view)
|
||||||
set_active_view(view)
|
set_active_view(view)
|
||||||
check_prompt_reload()
|
check_prompt_reload()
|
||||||
|
if view.doc and view.doc.abs_filename then
|
||||||
|
local should_poll = true
|
||||||
|
for i,v in ipairs(core.project_directories) do
|
||||||
|
if view.doc.abs_filename:find(v.name, 1, true) == 1 and not v.files_limit then
|
||||||
|
should_poll = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if should_poll then
|
||||||
|
local doc = core.active_view.doc
|
||||||
|
core.add_thread(function()
|
||||||
|
while core.active_view.doc == doc do
|
||||||
|
check_if_modified(doc)
|
||||||
|
coroutine.yield(0.25)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- patch `Doc.save|load` to store modified time
|
-- patch `Doc.save|load` to store modified time
|
||||||
|
|
Loading…
Reference in New Issue