aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--plugins/projectmanager.lua133
2 files changed, 134 insertions, 0 deletions
diff --git a/README.md b/README.md
index b7d94fa..b01417e 100644
--- a/README.md
+++ b/README.md
@@ -70,6 +70,7 @@ Plugin | Description
[`motiontrail`](plugins/motiontrail.lua?raw=1) | Adds a motion-trail to the caret *([screenshot](https://user-images.githubusercontent.com/3920290/83256814-085ccb00-a1ab-11ea-9e35-e6633cbed1a9.gif))*
[`openfilelocation`](plugins/openfilelocation.lua?raw=1) | Opens the parent directory of the current file in the file manager
[`openselected`](plugins/openselected.lua?raw=1) | Opens the selected filename or url
+[`projectmanager`](plugins/projectmanager.lua?raw=1) | Save projects and load/reload them quickly
[`scale`](plugins/scale.lua?raw=1) | Provides support for dynamically adjusting the scale of the code font / UI (`ctrl+-`, `ctrl+=`)
[`scalestatus`](plugins/scalestatus.lua?raw=1) | Displays current scale (zoom) in status view (depends on scale plugin)
[`selectionhighlight`](plugins/selectionhighlight.lua?raw=1) | Highlights regions of code that match the current selection *([screenshot](https://user-images.githubusercontent.com/3920290/80710883-5f597c80-8ae7-11ea-97f0-76dfacc08439.png))*
diff --git a/plugins/projectmanager.lua b/plugins/projectmanager.lua
new file mode 100644
index 0000000..e1117a0
--- /dev/null
+++ b/plugins/projectmanager.lua
@@ -0,0 +1,133 @@
+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,
+ })
+
+keymap.add {
+ ["ctrl+p"] = "project-manager:open-project",
+ ["ctrl+shift+p"] = "project-manager:switch-project",
+}
+
+return project_manager