From 24f27a7eac9687f9b1703440a0289c2690bb63df Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Sat, 15 Apr 2023 00:22:33 +0200 Subject: [PATCH 1/2] fix: close previously open code action windows --- lua/rust-tools/code_action_group.lua | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lua/rust-tools/code_action_group.lua b/lua/rust-tools/code_action_group.lua index 66900bf..d39ae75 100644 --- a/lua/rust-tools/code_action_group.lua +++ b/lua/rust-tools/code_action_group.lua @@ -102,6 +102,13 @@ local function on_primary_quit() M.cleanup() end +local function cleanup_state(state) + if state.winnr then + utils.close_win(state.winnr) + state.clear() + end +end + local function on_code_action_results(results, ctx) M.state.ctx = ctx @@ -116,7 +123,7 @@ local function on_code_action_results(results, ctx) return end - M.state.primary.geometry = compute_width(action_tuples, true) + local geometry = compute_width(action_tuples, true) M.state.actions.grouped = {} @@ -139,10 +146,12 @@ local function on_code_action_results(results, ctx) end end + cleanup_state(M.state.primary) + M.state.primary.geometry = geometry M.state.primary.bufnr = vim.api.nvim_create_buf(false, true) M.state.primary.winnr = vim.api.nvim_open_win(M.state.primary.bufnr, true, { relative = "cursor", - width = M.state.primary.geometry.width, + width = geometry.width, height = vim.tbl_count(M.state.actions.grouped) + vim.tbl_count(M.state.actions.ungrouped), focusable = true, @@ -249,15 +258,8 @@ local function on_secondary_quit() end function M.cleanup() - if M.state.primary.winnr then - utils.close_win(M.state.primary.winnr) - M.state.primary.clear() - end - - if M.state.secondary.winnr then - utils.close_win(M.state.secondary.winnr) - M.state.secondary.clear() - end + cleanup_state(M.state.primary) + cleanup_state(M.state.secondary) M.state.actions = {} M.state.active_group_index = nil @@ -276,14 +278,14 @@ function M.on_cursor_move() M.state.secondary.clear() end - M.state.secondary.geometry = compute_width(value.actions, false) + local geometry = compute_width(value.actions, false) M.state.secondary.bufnr = vim.api.nvim_create_buf(false, true) M.state.secondary.winnr = vim.api.nvim_open_win(M.state.secondary.bufnr, false, { relative = "win", win = M.state.primary.winnr, - width = M.state.secondary.geometry.width, + width = geometry.width, height = #value.actions, focusable = true, border = "rounded", @@ -353,9 +355,7 @@ M.state = { secondary = { bufnr = nil, winnr = nil, - geometry = nil, clear = function() - M.state.secondary.geometry = nil M.state.secondary.bufnr = nil M.state.secondary.winnr = nil end, From 10f28fe5938bd44b8f6e23722a7f7f656f861260 Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Sun, 21 May 2023 00:25:47 +0200 Subject: [PATCH 2/2] feat: close code action when leaving buffers --- lua/rust-tools/code_action_group.lua | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lua/rust-tools/code_action_group.lua b/lua/rust-tools/code_action_group.lua index d39ae75..255f34c 100644 --- a/lua/rust-tools/code_action_group.lua +++ b/lua/rust-tools/code_action_group.lua @@ -264,6 +264,7 @@ function M.cleanup() M.state.actions = {} M.state.active_group_index = nil M.state.ctx = {} + M.state.left_buf = nil end function M.on_cursor_move() @@ -338,6 +339,38 @@ function M.on_cursor_move() end end +-- Handles win leave and enter in order to get if any code action win needs to be closed. +local close_on_exit_group = vim.api.nvim_create_augroup( + "rust-tools-code-actions-close-on-exit", + { clear = true } +) + +vim.api.nvim_create_autocmd("WinLeave", { + group = close_on_exit_group, + callback = function(args) + if args.buf == M.state.primary.bufnr or args.buf == M.state.secondary.bufnr then + M.state.left_buf = args.buf + else + M.state.left_buf = nil + end + end +}) + +vim.api.nvim_create_autocmd("WinEnter", { + group = close_on_exit_group, + callback = function(args) + if not M.state.left_buf then + return + end + + if args.buf == M.state.primary.bufnr or args.buf == M.state.secondary.bufnr then + return; + end + + M.cleanup() + end +}) + M.state = { ctx = {}, actions = {}, @@ -360,6 +393,7 @@ M.state = { M.state.secondary.winnr = nil end, }, + left_buf = nil, } function M.code_action_group()