Write workspace information in lite-xl config directory

This commit is contained in:
Francesco Abbate 2021-01-03 23:36:28 +01:00
parent 8d4ba0cb34
commit d85598ce17
1 changed files with 56 additions and 7 deletions

View File

@ -2,7 +2,56 @@ local core = require "core"
local common = require "core.common" local common = require "core.common"
local DocView = require "core.docview" local DocView = require "core.docview"
local workspace_filename = ".lite_workspace.lua"
local function workspace_files_for(project_dir)
local basename = project_dir:match("[^\\/]+$")
local workspace_dir = USERDIR .. PATHSEP .. "ws"
local info_wsdir = system.get_file_info(workspace_dir)
if not info_wsdir then
local ok, err = system.mkdir(workspace_dir)
if not ok then
error("cannot create workspace directory: %s", err)
end
end
return coroutine.wrap(function()
local files = system.list_dir(workspace_dir) or {}
local n = #basename
for _, file in ipairs(files) do
if file:sub(1, n) == basename then
local id = tonumber(file:sub(n + 1):match("^-(%d+)$"))
if id then
coroutine.yield(workspace_dir .. PATHSEP .. file, id)
end
end
end
end)
end
local function load_workspace_file(project_dir)
for filename, id in workspace_files_for(project_dir) do
local load_f = loadfile(filename)
local workspace = load_f and load_f()
if workspace and workspace.path == project_dir then
os.remove(filename)
return workspace
end
end
end
local function get_workspace_filename(project_dir)
local id_list = {}
for filename, id in workspace_files_for(project_dir) do
id_list[id] = true
end
local id = 1
while id_list[id] do
id = id + 1
end
local basename = project_dir:match("[^\\/]+$")
return USERDIR .. PATHSEP .. "ws" .. PATHSEP .. basename .. "-" .. tostring(id)
end
local function has_no_locked_children(node) local function has_no_locked_children(node)
@ -150,26 +199,26 @@ end
local function save_workspace() local function save_workspace()
local root = get_unlocked_root(core.root_view.root_node) local root = get_unlocked_root(core.root_view.root_node)
local workspace_filename = get_workspace_filename(core.project_dir)
local fp = io.open(workspace_filename, "w") local fp = io.open(workspace_filename, "w")
if fp then if fp then
local node_text = common.serialize(save_node(root)) local node_text = common.serialize(save_node(root))
local dir_text = common.serialize(save_directories()) local dir_text = common.serialize(save_directories())
fp:write(string.format("return { documents = %s, directories = %s }\n", node_text, dir_text)) fp:write(string.format("return { path = %q, documents = %s, directories = %s }\n", core.project_dir, node_text, dir_text))
fp:close() fp:close()
end end
end end
local function load_workspace() local function load_workspace()
local ok, t = pcall(dofile, workspace_filename) local workspace = load_workspace_file(core.project_dir)
os.remove(workspace_filename) if workspace then
if ok then
local root = get_unlocked_root(core.root_view.root_node) local root = get_unlocked_root(core.root_view.root_node)
local active_view = load_node(root, t.documents) local active_view = load_node(root, workspace.documents)
if active_view then if active_view then
core.set_active_view(active_view) core.set_active_view(active_view)
end end
for i, dir_name in ipairs(t.directories) do for i, dir_name in ipairs(workspace.directories) do
core.add_project_directory(system.absolute_path(dir_name)) core.add_project_directory(system.absolute_path(dir_name))
end end
end end