summary refs log tree commit diff
path: root/.vim/lua/telescope
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2022-04-20 14:14:49 +0200
committerRobert Günzler <r@gnzler.io>2022-04-20 14:15:04 +0200
commit04312e32f06473cd7eabacd9f86b1ba68711848a (patch)
tree7c6e4e72fbc88585e08458e9cef0f79de58a4ef8 /.vim/lua/telescope
parentddf94834b05ac5917b0818146b159614cbc47995 (diff)
vim: add local telescope extension using job.lua
Diffstat (limited to '.vim/lua/telescope')
-rw-r--r--.vim/lua/telescope/_extensions/jobs.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/.vim/lua/telescope/_extensions/jobs.lua b/.vim/lua/telescope/_extensions/jobs.lua
new file mode 100644
index 0000000..8caea2f
--- /dev/null
+++ b/.vim/lua/telescope/_extensions/jobs.lua
@@ -0,0 +1,63 @@
+local job = require('job')
+
+local pickers = require('telescope.pickers')
+local finders = require('telescope.finders')
+local conf = require('telescope.config').values
+local actions = require('telescope.actions')
+local action_state = require('telescope.actions.state')
+local entry_display = require('telescope.pickers.entry_display')
+
+local function job_entry_maker(_)
+  return function(j)
+    local displayer = entry_display.create({
+      separator = " ",
+      items = {
+        { width = 8 },
+        { remaining = true },
+      },
+    })
+    local make_display = function(e)
+      return displayer({
+        { e.value.pid, "TelescopeResultsNumber" },
+        (e.value.command .. ' ' .. table.concat(e.value.args, ' ')),
+      })
+    end
+    return {
+      value = j,
+      display = make_display,
+      ordinal = tostring(j.pid),
+    }
+  end
+end
+
+local function list_jobs(opts)
+  local jobs = {}
+  for _, j in pairs(job.current_jobs) do
+    table.insert(jobs, j)
+  end
+  if #jobs == 0 then return end
+
+  opts = vim.tbl_extend("force", { prompt_title = 'Jobs' }, opts or {})
+  pickers.new(opts, {
+    finder = finders.new_table {
+      results = jobs,
+      entry_maker = job_entry_maker(opts),
+    },
+    sorter = conf.generic_sorter(opts),
+    attach_mappings = function(prompt_bufnr, _)
+      actions.select_default:replace(function()
+        local entry = action_state.get_selected_entry()
+        if not entry then return end
+        entry.value:shutdown(1, 'SIGKILL')
+        actions.close(prompt_bufnr)
+      end)
+      return true
+    end,
+  }):find()
+end
+
+return require('telescope').register_extension({
+  exports = {
+    jobs = list_jobs,
+  }
+})