--- The `:Heph ` user-command surface. Tactical/Organizational task --- views (next/list/capture/...) arrive with slice 11b; this is the knowledge- --- base core (journal, links). local M = {} local ATTENTIONS = { "white", "orange", "red", "blue" } --- subcommand -> handler(args: string[]) M.subs = { -- knowledge base today = function() require("heph.journal").open() end, journal = function(args) require("heph.journal").open(args[1]) end, follow = function() require("heph.link").follow() end, open = function(args) if args[1] then require("heph.node").open(args[1]) end end, search = function(args) local query = table.concat(args, " ") if #query == 0 then require("heph.util").notify("usage: :Heph search ", vim.log.levels.WARN) return end local nodes = require("heph.rpc").call("search", { query = query }) require("heph.picker").select(nodes, { prompt = "heph search: " .. query, format = function(n) return string.format("[%s] %s", n.kind, n.title) end, }, function(choice) if choice then require("heph.node").open(choice.id) end end) end, -- tasks next = function(args) require("heph.view").next({ scope = args[1] }) end, list = function(args) require("heph.view").list({ attention = args[1] }) end, capture = function(args) local title = table.concat(args, " ") if #title == 0 then require("heph.util").notify("usage: :Heph capture ", vim.log.levels.WARN) return end require("heph.picker").select(ATTENTIONS, { prompt = "attention for: " .. title }, function(attention) require("heph.task").capture(title, { attention = attention }) require("heph.util").notify("captured: " .. title) end) end, attention = function(args) if args[1] then require("heph.task").set_attention_current(args[1]) else require("heph.picker").select(ATTENTIONS, { prompt = "attention" }, function(choice) if choice then require("heph.task").set_attention_current(choice) end end) end end, done = function() require("heph.task").set_state_current("done") end, drop = function() require("heph.task").set_state_current("dropped") end, skip = function() require("heph.task").skip_current() end, log = function(args) require("heph.task").log_append_current(table.concat(args, " ")) end, } --- `:Heph` entry point. function M.run(opts) local args = opts.fargs local sub = args[1] if not sub then require("heph.util").notify("usage: :Heph <" .. table.concat(M.names(), "|") .. ">", vim.log.levels.WARN) return end local handler = M.subs[sub] if not handler then require("heph.util").notify("unknown subcommand: " .. sub, vim.log.levels.ERROR) return end local ok, err = pcall(handler, vim.list_slice(args, 2)) if not ok then require("heph.util").notify(tostring(err), vim.log.levels.ERROR) end end --- Sorted subcommand names. function M.names() local names = vim.tbl_keys(M.subs) table.sort(names) return names end --- Completion: subcommand names at the first position. function M.complete(arglead, cmdline, _cursorpos) -- Only complete the subcommand token (first arg after :Heph). if cmdline:match("^%s*Heph%s+%S*$") then return vim.tbl_filter(function(n) return n:find(arglead, 1, true) == 1 end, M.names()) end return {} end return M