From 173e89d7f4281cf4a700edd20ce59af9d298f3a7 Mon Sep 17 00:00:00 2001 From: eumis Date: Thu, 13 Nov 2025 16:55:41 +0100 Subject: [PATCH 1/5] added telescope extention --- lua/tasks/init.lua | 23 +++++++-- lua/telescope/_extensions/tasks.lua | 75 +++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 lua/telescope/_extensions/tasks.lua diff --git a/lua/tasks/init.lua b/lua/tasks/init.lua index 2773d0f..bbe43ca 100644 --- a/lua/tasks/init.lua +++ b/lua/tasks/init.lua @@ -13,12 +13,18 @@ local M = {} ---@field win integer ---@field sort_order integer ---@field channel integer +---@field last_run number + +---@alias sort +---| "recent" +---| "order" ---@class Options ---@field run_keys? string[] ---@field open_keys? string[] ---@field get_list_win_config? fun(): vim.api.keyset.win_config ---@field get_task_win_config? fun(): vim.api.keyset.win_config +---@field sort sort? local state = { list_buf = -1, @@ -68,7 +74,8 @@ function M.add(name, cmd, params) buf = -1, win = -1, sort_order = state.tasks_count, - channel = -1 + last_run = -state.tasks_count, + channel = -1, } if existing ~= nil then new_task.buf = existing.buf @@ -94,7 +101,11 @@ function M.get_all() for _, task in pairs(state.tasks) do table.insert(tasks, task) end - table.sort(tasks, function(left, right) return left.sort_order < right.sort_order end) + if M.opts.sort == "recent" then + table.sort(tasks, function(left, right) return left.last_run > right.last_run end) + else + table.sort(tasks, function(left, right) return left.sort_order < right.sort_order end) + end return tasks end @@ -146,9 +157,9 @@ function M.run(name, bufnr) vim.fn.chansend(task.channel, { cmd, "" }) vim.cmd("normal G") state.last_run_task = name + task.last_run = os.time() end - function M.run_last() local task = state.tasks[state.last_run_task] if task == nil then error("task not run yet") end @@ -186,7 +197,11 @@ function M.open_list() for name, _ in pairs(state.tasks) do table.insert(tasks, name) end - table.sort(tasks, function(left, right) return state.tasks[left].sort_order < state.tasks[right].sort_order end) + if M.opts.sort == "recent" then + table.sort(tasks, function(left, right) return state.tasks[left].last_run > state.tasks[right].last_run end) + else + table.sort(tasks, function(left, right) return state.tasks[left].sort_order < state.tasks[right].sort_order end) + end vim.api.nvim_buf_set_lines(state.list_buf, 0, -1, false, tasks) state.list_win = vim.api.nvim_open_win(state.list_buf, true, M.opts.get_list_win_config()) diff --git a/lua/telescope/_extensions/tasks.lua b/lua/telescope/_extensions/tasks.lua new file mode 100644 index 0000000..5e03340 --- /dev/null +++ b/lua/telescope/_extensions/tasks.lua @@ -0,0 +1,75 @@ +local has_telescope, telescope = pcall(require, "telescope") + +if not has_telescope then + return +end + +local action_state = require("telescope.actions.state") +local finders = require("telescope.finders") +local conf = require("telescope.config").values +local previewers = require("telescope.previewers") + +local get_task_finder = function() + return finders.new_table({ + results = require "tasks".get_all(), + ---@param entry Task + entry_maker = function(entry) + return { + value = entry, + ordinal = entry.name, + display = entry.name + } + end, + }) +end + +local define_preview = function(self, entry, _) + ---@type Task + local task = entry.value + local lines = {} + + if task.cwd ~= nil then + table.insert(lines, "cd " .. task.cwd) + end + + local cmd = task.cmd + if type(cmd) == "function" then + cmd = cmd(self.state.bufnr) + end + if type(cmd) == "string" then + cmd = { cmd } + end + for _, c in ipairs(cmd) do + table.insert(lines, c) + end + + vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) + vim.bo[self.state.bufnr].filetype = "bash" +end + +local attach_mappings = function(_, map) + map("i", "", function() require "tasks".run(action_state.get_selected_entry().value.name) end) + map("n", "", function() require "tasks".run(action_state.get_selected_entry().value.name) end) + + map("i", "", function() require "tasks".open(action_state.get_selected_entry().value.name) end) + map("n", "", function() require "tasks".open(action_state.get_selected_entry().value.name) end) + + return true +end + +return telescope.register_extension({ + exports = { + all = function(opts) + opts = opts or {} + require("telescope.pickers").new(opts, { + prompt_title = "Tasks", + finder = get_task_finder(), + sorter = conf.generic_sorter({}), + previewer = previewers.new_buffer_previewer({ + define_preview = define_preview + }), + attach_mappings = attach_mappings + }):find() + end, + }, +}) From c033504fb97ffb3a0573e7ec9713366ebfb90c49 Mon Sep 17 00:00:00 2001 From: eumis Date: Thu, 13 Nov 2025 16:56:46 +0100 Subject: [PATCH 2/5] updated readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 7362186..9d9a8ab 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Run shell commands(tasks) in dedicated terminal windows. - install using your favorite plugin manager [lazy.nvim](https://github.com/folke/lazy.nvim) + ```lua { "eumis/tasks.nvim" @@ -15,6 +16,7 @@ Run shell commands(tasks) in dedicated terminal windows. ``` [mini.deps](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-deps.md) + ```lua add({ source = "eumis/tasks.nvim" @@ -22,6 +24,7 @@ add({ ``` [packer](https://github.com/wbthomason/packer.nvim) + ```lua use { "eumis/tasks.nvim" @@ -47,6 +50,9 @@ tasks.open_last() -- Open/close list of tasks tasks.toggle_list() + +-- Open list of tasks in telescope +require("telescope").extensions.tasks.all() ``` ```vim From a008ee62b8ccddcc69960ba3147d30f8a579ea28 Mon Sep 17 00:00:00 2001 From: eumis Date: Thu, 13 Nov 2025 17:04:32 +0100 Subject: [PATCH 3/5] fixed highlight --- lua/telescope/_extensions/tasks.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/telescope/_extensions/tasks.lua b/lua/telescope/_extensions/tasks.lua index 5e03340..d3e2f57 100644 --- a/lua/telescope/_extensions/tasks.lua +++ b/lua/telescope/_extensions/tasks.lua @@ -44,7 +44,7 @@ local define_preview = function(self, entry, _) end vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) - vim.bo[self.state.bufnr].filetype = "bash" + require('telescope.previewers.utils').highlighter(self.state.bufnr, "bash") end local attach_mappings = function(_, map) From 100221beb2f8291141e7fa310f898ad6f2a741bf Mon Sep 17 00:00:00 2001 From: eumis Date: Thu, 13 Nov 2025 17:09:30 +0100 Subject: [PATCH 4/5] updated readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d9a8ab..95037de 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ require "tasks".setup { run_keys = { "r", "" }, -- keys to run task from tasks list open_keys = { "o" }, -- keys to open task buffer from tasks list get_list_win_config = get_float_win_config, -- returns config for vim.api.nvim_open_win for list window - get_task_win_config = get_float_win_config -- returns config for vim.api.nvim_open_win for task window + get_task_win_config = get_float_win_config, -- returns config for vim.api.nvim_open_win for task window + sort = "recent", -- "recent" - tasks run most recently are first, "order" - tasks in added order } ``` From c9f3853430922a9489dff624a2802e49e14fadc7 Mon Sep 17 00:00:00 2001 From: eumis Date: Thu, 13 Nov 2025 17:10:10 +0100 Subject: [PATCH 5/5] updated readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95037de..315bfdd 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,6 @@ require "tasks".setup { open_keys = { "o" }, -- keys to open task buffer from tasks list get_list_win_config = get_float_win_config, -- returns config for vim.api.nvim_open_win for list window get_task_win_config = get_float_win_config, -- returns config for vim.api.nvim_open_win for task window - sort = "recent", -- "recent" - tasks run most recently are first, "order" - tasks in added order + sort = "order", -- "order" - tasks in added order, "recent" - tasks run most recently are first } ```