Skip to content

Commit

Permalink
feat(ui): press <c-c> to abort any running tasks. Fixes #258
Browse files Browse the repository at this point in the history
  • Loading branch information
folke committed Dec 31, 2022
1 parent ed0583e commit d6b5d6e
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 4 deletions.
60 changes: 58 additions & 2 deletions lua/lazy/manage/process.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,44 @@ local Config = require("lazy.core.config")

local M = {}

---@type table<vim.loop.Process, true>
M.running = {}

M.signals = {
"HUP",
"INT",
"QUIT",
"ILL",
"TRAP",
"ABRT",
"BUS",
"FPE",
"KILL",
"USR1",
"SEGV",
"USR2",
"PIPE",
"ALRM",
"TERM",
"CHLD",
"CONT",
"STOP",
"TSTP",
"TTIN",
"TTOU",
"URG",
"XCPU",
"XFSZ",
"VTALRM",
"PROF",
"WINCH",
"IO",
"PWR",
"EMT",
"SYS",
"INFO",
}

---@diagnostic disable-next-line: no-unknown
local uv = vim.loop

Expand All @@ -14,6 +52,7 @@ local uv = vim.loop
---@field env? string[]

---@param opts? ProcessOpts
---@param cmd string
function M.spawn(cmd, opts)
opts = opts or {}
opts.timeout = opts.timeout or (Config.options.git and Config.options.git.timeout * 1000)
Expand Down Expand Up @@ -44,9 +83,8 @@ function M.spawn(cmd, opts)
if opts.timeout then
timeout = uv.new_timer()
timeout:start(opts.timeout, 0, function()
if handle and not handle:is_closing() then
if M.kill(handle) then
killed = true
uv.process_kill(handle, "sigint")
end
end)
end
Expand All @@ -57,6 +95,7 @@ function M.spawn(cmd, opts)
cwd = opts.cwd,
env = env,
}, function(exit_code, signal)
M.running[handle] = nil
if timeout then
timeout:stop()
timeout:close()
Expand All @@ -74,6 +113,8 @@ function M.spawn(cmd, opts)
output = output:gsub("[^\r\n]+\r", "")
if killed then
output = output .. "\n" .. "Process was killed because it reached the timeout"
elseif signal ~= 0 then
output = output .. "\n" .. "Process was killed with SIG" .. M.signals[signal]
end

vim.schedule(function()
Expand All @@ -89,6 +130,7 @@ function M.spawn(cmd, opts)
end
return
end
M.running[handle] = true

---@param data? string
local function on_output(err, data)
Expand All @@ -112,6 +154,20 @@ function M.spawn(cmd, opts)
return handle
end

function M.kill(handle)
if handle and not handle:is_closing() then
M.running[handle] = nil
uv.process_kill(handle, "sigint")
return true
end
end

function M.abort()
for handle in pairs(M.running) do
M.kill(handle)
end
end

---@param cmd string[]
---@param opts? {cwd:string, env:table}
function M.exec(cmd, opts)
Expand Down
1 change: 1 addition & 0 deletions lua/lazy/view/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ M.keys = {
details = "<cr>",
profile_sort = "<C-s>",
profile_filter = "<C-f>",
abort = "<C-c>",
}

---@type table<string,LazyViewCommand>
Expand Down
5 changes: 5 additions & 0 deletions lua/lazy/view/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ function M.create()
self:update()
end)

vim.keymap.set("n", ViewConfig.keys.abort, function()
require("lazy.manage.process").abort()
return "<c-c>"
end, { silent = true, buffer = self.buf, expr = true })

-- plugin details
self:on_key(ViewConfig.keys.details, function()
local plugin = self.render:get_plugin()
Expand Down
7 changes: 5 additions & 2 deletions lua/lazy/view/render.lua
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,9 @@ end
function M:help()
self:append("Help", "LazyH2"):nl():nl()

self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl()
self:append("Use "):append("<C-c>", "LazySpecial"):append(" to abort all running tasks."):nl():nl()

self:append("You can press "):append("<CR>", "LazySpecial"):append(" on a plugin to show its details."):nl():nl()

self:append("Most properties can be hovered with ")
self:append("<K>", "LazySpecial")
Expand All @@ -164,7 +166,8 @@ function M:help()
:append("<K>", "LazySpecial")
:append(" on a plugin anywhere else, a diff will be opened if there are updates")
:nl()
self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl()
self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl()

self:append("Use "):append("<d>", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl()
self:nl()

Expand Down

0 comments on commit d6b5d6e

Please sign in to comment.