aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/workspace.lua58
1 files changed, 37 insertions, 21 deletions
diff --git a/plugins/workspace.lua b/plugins/workspace.lua
index bb5e0d4..b40ab4b 100644
--- a/plugins/workspace.lua
+++ b/plugins/workspace.lua
@@ -36,26 +36,40 @@ local function get_unlocked_root(node)
end
-local function save_docview(dv)
- return {
- filename = dv.doc.filename,
- selection = { dv.doc:get_selection() },
- scroll = { x = dv.scroll.to.x, y = dv.scroll.to.y }
- }
+local function save_view(view)
+ local mt = getmetatable(view)
+ if mt == DocView then
+ return {
+ type = "doc",
+ filename = view.doc.filename,
+ selection = { view.doc:get_selection() },
+ scroll = { x = view.scroll.to.x, y = view.scroll.to.y },
+ text = not view.doc.filename and view.doc:get_text(1, 1, math.huge, math.huge)
+ }
+ end
+ for name, mod in pairs(package.loaded) do
+ if mod == mt then
+ return { type = "view", module = name }
+ end
+ end
end
-local function load_docview(t)
- local ok, doc = pcall(core.open_doc, t.filename)
- if not ok then
- return DocView(core.open_doc())
+local function load_view(t)
+ if t.type == "doc" then
+ local ok, doc = pcall(core.open_doc, t.filename)
+ if not ok then
+ return DocView(core.open_doc())
+ end
+ local dv = DocView(doc)
+ if t.text then doc:insert(1, 1, t.text) end
+ doc:set_selection(table.unpack(t.selection))
+ dv.last_line, dv.last_col = doc:get_selection()
+ dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x
+ dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y
+ return dv
end
- local dv = DocView(doc)
- doc:set_selection(table.unpack(t.selection))
- dv:update() -- prevents scrolling-to-make-caret-visible on initial frame
- dv.scroll.x, dv.scroll.to.x = t.scroll.x, t.scroll.x
- dv.scroll.y, dv.scroll.to.y = t.scroll.y, t.scroll.y
- return dv
+ return require(t.module)()
end
@@ -65,8 +79,9 @@ local function save_node(node)
if node.type == "leaf" then
res.views = {}
for _, view in ipairs(node.views) do
- if getmetatable(view) == DocView and view.doc.filename then
- table.insert(res.views, save_docview(view))
+ local t = save_view(view)
+ if t then
+ table.insert(res.views, t)
if node.active_view == view then
res.active_view = #res.views
end
@@ -83,8 +98,8 @@ end
local function load_node(node, t)
if t.type == "leaf" then
- for _, dv in ipairs(t.views) do
- node:add_view(load_docview(dv))
+ for _, v in ipairs(t.views) do
+ node:add_view(load_view(v))
end
if t.active_view then
node:set_active_view(node.views[t.active_view])
@@ -108,6 +123,7 @@ end
local function load_workspace()
local ok, t = pcall(dofile, workspace_filename)
+ os.remove(workspace_filename)
if ok then
local root = get_unlocked_root(core.root_view.root_node)
load_node(root, t)
@@ -119,7 +135,7 @@ local run = core.run
function core.run(...)
if #core.docs == 0 then
- load_workspace()
+ core.try(load_workspace)
local exit = os.exit
function os.exit(...)