diff options
author | rxi <rxi@users.noreply.github.com> | 2020-08-30 10:05:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-30 10:05:26 +0100 |
commit | 9772b3668c7ae1dd58090f31947a8e977d81da4d (patch) | |
tree | 266f1c8be91091fe17e1b38f250b664e0eedeb1f /plugins/projectmanager.lua | |
parent | 0d8c4544abc0a7ebff018ceacdbcd4ab9ff9cce2 (diff) | |
parent | 85000337cec3ccb97caa367784c60d2041c9d56a (diff) | |
download | lite-xl-plugins-9772b3668c7ae1dd58090f31947a8e977d81da4d.tar.gz lite-xl-plugins-9772b3668c7ae1dd58090f31947a8e977d81da4d.zip |
Merge pull request #86 from terickson001/project_manager
Added projectmanager.lua
Diffstat (limited to 'plugins/projectmanager.lua')
-rw-r--r-- | plugins/projectmanager.lua | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/plugins/projectmanager.lua b/plugins/projectmanager.lua new file mode 100644 index 0000000..b5a66e3 --- /dev/null +++ b/plugins/projectmanager.lua @@ -0,0 +1,128 @@ +local project_manager = {} + +local core = require "core" +local command = require "core.command" +local common = require "core.common" +local keymap = require "core.keymap" + +local projects_file = ".lite_projects.lua" + +project_manager.projects = {} + +local function load_projects() + local ok, t = pcall(dofile, EXEDIR .. "/" .. projects_file) + if ok then project_manager.projects = t end +end + +load_projects() + +local function serialize(val) + if type(val) == "string" then + return string.format("%q", val) + elseif type(val) == "table" then + local t = {} + for k, v in pairs(val) do + table.insert(t, "[" .. serialize(k) .. "]=" .. serialize(v)) + end + return "{" .. table.concat(t, ",") .. "}" + end + return tostring(val) +end + +local function save_projects() + local fp = io.open(EXEDIR .. "/" .. projects_file, "w") + if fp then + fp:write("return ", serialize(project_manager.projects), "\n") + fp:close() + end +end + +local function path_base_name(str) + local pattern = "[\\/]?([^\\/]+)[\\/]?$" + return str:match(pattern) +end + +function project_manager.add_project() + local proj_dir = system.absolute_path(".") + local proj_name = path_base_name(proj_dir) + core.command_view:set_text(proj_name) + core.command_view:enter("Project Name", + function(text) + if text then + project_manager.projects[text] = proj_dir + save_projects() + end + end) +end + +local function get_project_names() + local t = {} + for k, v in pairs(project_manager.projects) do table.insert(t, k) end + return t +end + +local function project_lister(func) + local projects = get_project_names(); + core.command_view:enter("Open Project", func, function(text) + local res = common.fuzzy_match(projects, text) + for i, name in ipairs(res) do + res[i] = { + text = name, + info = project_manager.projects[name], + } + end + return res + end) +end + +function project_manager.rename_project(func) + project_lister(function(text, item) + if item then + core.command_view:set_text(item.text) + core.command_view:enter("Rename ".. item.text, + function(_text) + if _text then + project_manager.projects[_text] = project_manager.projects[item.text] + project_manager.projects[item.text] = nil + save_projects() + end + end) + end + end) +end + +function project_manager.open_project() + project_lister(function(text, item) + if item then + system.exec(string.format("%q %q", EXEFILE, item.info)) + end + end) +end + +function project_manager.switch_project() + project_lister(function(text, item) + if item then + system.exec(string.format("%q %q", EXEFILE, item.info)) + os.exit() + end + end) +end + +function project_manager.remove_project() + project_lister(function(text, item) + if item then + project_manager.projects[item.text] = nil + save_projects() + end + end) +end + +command.add(nil, { + ["project-manager:open-project"] = project_manager.open_project, + ["project-manager:switch-project"] = project_manager.switch_project, + ["project-manager:add-project"] = project_manager.add_project, + ["project-manager:remove-project"] = project_manager.remove_project, + ["project-manager:rename-project"] = project_manager.rename_project, + }) + +return project_manager |