From dd5d67b1e387c6ef275de16e10e02494f4edd15e Mon Sep 17 00:00:00 2001 From: Cleboost Date: Sat, 18 Jul 2026 02:31:04 +0200 Subject: [PATCH] Add Zed Provider launcher plugin (#17) * Add Zed Provider launcher plugin. Expose recent Zed workspaces in the launcher so users can reopen projects quickly. * Update Zed Provider thumbnail with launcher screenshot. Use the official Noctalia thumbnail generator export for the plugin card. * Address PR review feedback for Zed Provider. Fix thumbnail category label, refresh project cache when the query is cleared, and use noctalia.fuzzyScore for launcher filtering. * fix(zed-provider): update thumbnail with launcher category label * chore(zed-provider): reset manifest version to 1.0.0 * docs(zed-provider): align README with plugin documentation requirements * fix(zed-provider): replace min_noctalia with plugin_api * Add 'nohup' to plugin dependencies --------- Co-authored-by: Lemmy --- zed-provider/README.md | 38 +++++++++ zed-provider/plugin.toml | 34 ++++++++ zed-provider/thumbnail.webp | Bin 0 -> 33728 bytes zed-provider/translations/en.json | 11 +++ zed-provider/translations/fr.json | 11 +++ zed-provider/zed_provider.luau | 124 ++++++++++++++++++++++++++++++ 6 files changed, 218 insertions(+) create mode 100644 zed-provider/README.md create mode 100644 zed-provider/plugin.toml create mode 100644 zed-provider/thumbnail.webp create mode 100644 zed-provider/translations/en.json create mode 100644 zed-provider/translations/fr.json create mode 100644 zed-provider/zed_provider.luau diff --git a/zed-provider/README.md b/zed-provider/README.md new file mode 100644 index 0000000..eee0ef5 --- /dev/null +++ b/zed-provider/README.md @@ -0,0 +1,38 @@ +# Zed Provider + +![Zed Provider thumbnail](thumbnail.webp) + +Zed Provider integrates recent Zed workspaces with the Noctalia launcher so you +can reopen a project quickly without leaving the shell. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `cleboost/zed-provider` | +| Entry | Launcher provider: `provider` | +| Launcher Prefix | `/zed` | + +## Requirements + +Install [Zed](https://zed.dev) and ensure `zed` is available on `PATH` as +`zeditor`. The `sqlite3` command must also be available to read Zed's workspace +database. + +## Usage + +Open the Noctalia launcher and type `/zed` to list recent local Zed workspaces. +Continue typing to filter projects by name, then select one to open it with +`zeditor`. + +## Settings + +- `db_path` — path to Zed's `db.sqlite` workspace database. +- `max_results` — maximum number of projects shown in the launcher. + +## Notes + +Projects are read from Zed's workspace database, typically at +`~/.local/share/zed/db/0-stable/db.sqlite`. Remote workspaces are excluded. +The list is cached for the launcher session and refreshed when you clear the +query. diff --git a/zed-provider/plugin.toml b/zed-provider/plugin.toml new file mode 100644 index 0000000..a9743f0 --- /dev/null +++ b/zed-provider/plugin.toml @@ -0,0 +1,34 @@ +id = "cleboost/zed-provider" +name = "Zed Provider" +version = "1.0.0" +plugin_api = 3 +author = "cleboost" +license = "MIT" +icon = "folder-open" +description = "Open a recent Zed project from the launcher. Type /zed to list your projects." +tags = ["launcher", "development", "productivity"] +dependencies = ["sqlite3", "zed", "nohup"] + +[[setting]] +key = "db_path" +type = "file" +label_key = "settings.db_path.label" +description_key = "settings.db_path.description" +default = "~/.local/share/zed/db/0-stable/db.sqlite" + +[[setting]] +key = "max_results" +type = "int" +label_key = "settings.max_results.label" +description_key = "settings.max_results.description" +default = 20 +min = 1 +max = 100 + +[[launcher_provider]] +id = "provider" +entry = "zed_provider.luau" +prefix = "zed" +glyph = "bolt" +include_in_global_search = false +debounce_ms = 0 diff --git a/zed-provider/thumbnail.webp b/zed-provider/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..5ccde31d35f35ab6375882c34c768560e9128822 GIT binary patch literal 33728 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 0) and math.floor(n) or 20 +end + +local function trim(s) + return s:match("^%s*(.-)%s*$") +end + +local function projectName(path) + return path:match("([^/]+)$") or path +end + +local function shellQuote(s) + return "'" .. s:gsub("'", "'\"'\"'") .. "'" +end + +local function loadProjects(onDone) + local db = getDbPath() + local limit = getMaxResults() + local sql = string.format( + "SELECT DISTINCT paths FROM workspaces WHERE paths IS NOT NULL AND paths != '' AND remote_connection_id IS NULL ORDER BY timestamp DESC LIMIT %d;", + limit + ) + local cmd = string.format("sqlite3 -separator '\\n' %s %s 2>/dev/null", shellQuote(db), shellQuote(sql)) + + noctalia.runAsync(cmd, function(result) + local projects = {} + if result.exitCode == 0 and type(result.stdout) == "string" then + for line in result.stdout:gmatch("[^\n]+") do + local path = trim(line) + if path ~= "" then + table.insert(projects, path) + end + end + end + cachedProjects = projects + onDone(projects) + end) +end + +local function makeRows(projects, filter) + local home = noctalia.getenv("HOME") or "" + local rows = {} + for _, path in projects do + local name = projectName(path) + local score = filter == "" and 0 or noctalia.fuzzyScore(filter, name) + if score == nil then + score = noctalia.fuzzyScore(filter, path) + end + if filter == "" or score ~= nil then + local display = (home ~= "" and path:sub(1, #home) == home) and "~" .. path:sub(#home + 1) or path + table.insert(rows, { + id = path, + title = name, + subtitle = display, + icon = "zed", + score = filter == "" and nil or score, + }) + end + end + return rows +end + +local function showResults(query, projects, filter) + local rows = makeRows(projects, filter) + if #rows == 0 then + launcher.setResults(query, { + { + id = "", + title = noctalia.tr("no-projects-found"), + subtitle = filter ~= "" and noctalia.tr("filter-empty", { filter = filter }) or noctalia.tr("database-empty"), + glyph = "folder-x", + }, + }) + else + launcher.setResults(query, rows) + end +end + +function onQuery(query) + local filter = trim(query) + + if filter == "" then + cachedProjects = nil + end + + if cachedProjects then + showResults(query, cachedProjects, filter) + return + end + + launcher.setResults(query, { + { + id = "", + title = noctalia.tr("loading"), + subtitle = noctalia.tr("loading-subtitle"), + glyph = "loader", + }, + }) + + loadProjects(function(projects) + showResults(query, projects, filter) + end) +end + +function onActivate(id) + if id == "" then + return + end + noctalia.runAsync(string.format("nohup zeditor %s &>/dev/null &", shellQuote(id))) +end