summary refs log tree commit diff
path: root/.vim
diff options
context:
space:
mode:
Diffstat (limited to '.vim')
-rw-r--r--.vim/lua/plugins.lua3
-rw-r--r--.vim/lua/telescope/_extensions/jobs.lua63
2 files changed, 66 insertions, 0 deletions
diff --git a/.vim/lua/plugins.lua b/.vim/lua/plugins.lua
index 39ad86f..74fe9a4 100644
--- a/.vim/lua/plugins.lua
+++ b/.vim/lua/plugins.lua
@@ -636,6 +636,9 @@ return require('packer').startup({function()
         }
       }
 
+      -- local extension
+      require('telescope').load_extension('jobs')
+
       -- required to get fzf-native working
       require('telescope').load_extension('fzf')
       require('telescope').load_extension('ui-select')
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,
+  }
+})