local Job = require ('plenary.job') local spinner_ok, spinner = pcall(require, 'spinner.core') local M = { current_jobs = {} } local strip_ansi = function(line) return line:gsub(string.char(27) .. '[[0-9;]*m', '') end --create a new job and register --@return ~/.local/share/nvim/site/pack/packer/start/plenary.nvim/lua/plenary/job.lua function M.jobstart(opts) opts = opts or {} -- default options -- opts.enable_recording = true opts.enable_spinner = (opts.enable_spinner or true) and spinner_ok opts.populate_quickfix = opts.populate_quickfix or true local title if opts.format_title then title = opts.format_title(opts.command, opts.args) opts.format_title = nil else title = opts.command end opts.on_start = vim.schedule_wrap(function(j) table.insert(M.current_jobs, j.pid, j) if opts.populate_quickfix then -- clear quickfix vim.fn.setqflist({}, 'r') end if opts.enable_spinner then spinner.on_attach(j.pid, title, vim.fn.bufnr()) spinner.on_progress('begin', j.pid, j.pid) end end) opts.on_exit = vim.schedule_wrap(function(j, _) table.remove(M.current_jobs, j.pid) if opts.populate_quickfix then vim.cmd([[doautocmd QuickFixCmdPost]]) -- vim.fn.setqflist({}, 'r', { -- lines = {}, -- id = j.pid, -- }) end if opts.enable_spinner then spinner.on_progress('end', j.pid, j.pid) spinner.on_exit(nil, nil, j.pid) end end) opts.on_stdout = vim.schedule_wrap(function(error, data, j) if error then vim.notify('error: ' .. error) return end -- handle error? if opts.populate_quickfix and data then vim.fn.setqflist({}, 'a', { title = title, lines = {strip_ansi(data)}, efm = '%m', id = j.pid, }) end end) opts.on_stderr = vim.schedule_wrap(function(error, data, j) if error then vim.notify('error: ' .. error) return end -- handle error? if opts.populate_quickfix and data then vim.fn.setqflist({}, 'a', { title = title, lines = {strip_ansi(data)}, efm = '%m', id = j.pid, }) vim.cmd([[doautocmd QuickFixCmdPost]]) end end) local j = Job:new(opts) j:start() return j end function M.make(extra_args) local makeprg = vim.fn.expandcmd(vim.opt.makeprg:get()) -- split makeprg into command + args local args = vim.split(makeprg, ' ') local command = args[1] table.remove(args, 1) -- detect makefile local cwd = vim.fn.expand('%:p:h') cwd = require('lspconfig.util').root_pattern('Makefile')(cwd) local extra_args = extra_args or {} table.foreach(extra_args, function(_, v) table.insert(args, v) end) return M.jobstart { command = command, args = args, cwd = cwd, } end function M.sh(command_string) return M.jobstart { command = vim.env.SHELL, args = {'-c', command_string}, -- strip 'sh -c' from the title (used by progress reporting etc.) format_title = function(_, args) return require('plenary.collections.py_list')(args):slice(2,#args):join(' ') end } end return M