diff options
| author | Robert Günzler <r@gnzler.io> | 2022-04-20 14:14:49 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2022-04-20 14:15:04 +0200 |
| commit | 04312e32f06473cd7eabacd9f86b1ba68711848a (patch) | |
| tree | 7c6e4e72fbc88585e08458e9cef0f79de58a4ef8 /.vim/lua | |
| parent | ddf94834b05ac5917b0818146b159614cbc47995 (diff) | |
vim: add local telescope extension using job.lua
Diffstat (limited to '.vim/lua')
| -rw-r--r-- | .vim/lua/plugins.lua | 3 | ||||
| -rw-r--r-- | .vim/lua/telescope/_extensions/jobs.lua | 63 |
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, + } +}) |