Write workspace information in lite-xl config directory
This commit is contained in:
parent
8d4ba0cb34
commit
d85598ce17
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue