From 7d5d1415c200915955b689f8e980e5eb12e5d637 Mon Sep 17 00:00:00 2001 From: mpaulson Date: Thu, 30 Nov 2023 15:44:07 -0700 Subject: [PATCH] fix: leaving the window now destroys both border and content win --- lua/harpoon/autocmd.lua | 4 ++++ lua/harpoon/buffer.lua | 18 +++++++++++------- lua/harpoon/init.lua | 3 +-- lua/harpoon/test/ui_spec.lua | 19 +++++++++++++++++++ lua/harpoon/ui.lua | 10 +++++++++- 5 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 lua/harpoon/autocmd.lua diff --git a/lua/harpoon/autocmd.lua b/lua/harpoon/autocmd.lua new file mode 100644 index 0000000..de76e21 --- /dev/null +++ b/lua/harpoon/autocmd.lua @@ -0,0 +1,4 @@ +local augroup = vim.api.nvim_create_augroup +return augroup("Harpoon", {}) + + diff --git a/lua/harpoon/buffer.lua b/lua/harpoon/buffer.lua index e0bdc9f..b08b72b 100644 --- a/lua/harpoon/buffer.lua +++ b/lua/harpoon/buffer.lua @@ -1,4 +1,6 @@ local utils = require("harpoon.utils") +local HarpoonGroup = require("harpoon.autocmd") + local M = {} local HARPOON_MENU = "__harpoon-menu__" @@ -18,8 +20,6 @@ end ---strings back into the ui. it feels gross and it puts odd coupling ---@param bufnr number function M.setup_autocmds_and_keymaps(bufnr) - --[[ - -- TODO: Do the highlighting better local curr_file = vim.api.nvim_buf_get_name(0) local cmd = string.format( @@ -31,9 +31,7 @@ function M.setup_autocmds_and_keymaps(bufnr) .. "call matchadd('HarpoonCurrentFile', '\\V'.path.'\\$')", curr_file:gsub("\\", "\\\\") ) - print(cmd) vim.cmd(cmd) - --]] if vim.api.nvim_buf_get_name(bufnr) == "" then vim.api.nvim_buf_set_name(bufnr, get_harpoon_menu_name()) @@ -71,6 +69,7 @@ function M.setup_autocmds_and_keymaps(bufnr) bufnr ) ) + -- TODO: Do we want this? is this a thing? -- its odd... why save on text change? shouldn't we wait until close / w / esc? --[[ @@ -89,9 +88,14 @@ function M.setup_autocmds_and_keymaps(bufnr) bufnr ) ) - vim.cmd( - "autocmd BufLeave ++nested ++once silent lua require('harpoon').ui:toggle_quick_menu()" - ) + + vim.api.nvim_create_autocmd({ "BufLeave" }, { + group = HarpoonGroup, + pattern = "__harpoon*", + callback = function() + require("harpoon").ui:toggle_quick_menu() + end + }) end ---@param bufnr number diff --git a/lua/harpoon/init.lua b/lua/harpoon/init.lua index 45857c6..20530df 100644 --- a/lua/harpoon/init.lua +++ b/lua/harpoon/init.lua @@ -3,6 +3,7 @@ local Data = require("harpoon.data") local Config = require("harpoon.config") local List = require("harpoon.list") local Listeners = require("harpoon.listeners") +local HarpoonGroup = require("harpoon.autocmd") -- setup -- read from a config file @@ -48,8 +49,6 @@ function Harpoon:setup(partial_config) ---TODO: should we go through every seen list and update its config? if self.hooks_setup == false then - local augroup = vim.api.nvim_create_augroup - local HarpoonGroup = augroup("Harpoon", {}) vim.api.nvim_create_autocmd({ "BufLeave", "VimLeavePre" }, { group = HarpoonGroup, diff --git a/lua/harpoon/test/ui_spec.lua b/lua/harpoon/test/ui_spec.lua index 2d5adee..6912203 100644 --- a/lua/harpoon/test/ui_spec.lua +++ b/lua/harpoon/test/ui_spec.lua @@ -70,4 +70,23 @@ describe("harpoon", function() eq(created_files, list:display()) end) + + it("using :q to leave harpoon should quit everything", function() + harpoon.ui:toggle_quick_menu(harpoon:list()) + + local bufnr = harpoon.ui.bufnr + local win_id = harpoon.ui.win_id + + eq(vim.api.nvim_buf_is_valid(bufnr), true) + eq(vim.api.nvim_win_is_valid(win_id), true) + eq(vim.api.nvim_get_current_buf(), bufnr) + + vim.cmd [[ q! ]] -- TODO: I shouldn't need q! here + + eq(vim.api.nvim_buf_is_valid(bufnr), false) + eq(vim.api.nvim_win_is_valid(win_id), false) + eq(harpoon.ui.bufnr, nil) + eq(harpoon.ui.win_id, nil) + end) + end) diff --git a/lua/harpoon/ui.lua b/lua/harpoon/ui.lua index 66814cc..20cc546 100644 --- a/lua/harpoon/ui.lua +++ b/lua/harpoon/ui.lua @@ -4,6 +4,7 @@ local DEFAULT_WINDOW_WIDTH = 69 -- nice ---@class HarpoonUI ---@field win_id number +---@field border_win_id number ---@field bufnr number ---@field settings HarpoonSettings ---@field active_list HarpoonList @@ -16,6 +17,7 @@ HarpoonUI.__index = HarpoonUI function HarpoonUI:new(settings) return setmetatable({ win_id = nil, + border_win_id = nil, bufnr = nil, active_list = nil, settings = settings, @@ -37,8 +39,13 @@ function HarpoonUI:close_menu() vim.api.nvim_win_close(self.win_id, true) end + if self.border_win_id ~= nil and vim.api.nvim_win_is_valid(self.border_win_id) then + vim.api.nvim_win_close(self.border_win_id, true) + end + self.active_list = nil self.win_id = nil + self.border_win_id = nil self.bufnr = nil self.closing = false @@ -73,7 +80,8 @@ function HarpoonUI:_create_window() Buffer.setup_autocmds_and_keymaps(bufnr) self.win_id = win_id - vim.api.nvim_win_set_option(self.win_id, "number", true) + self.border_win_id = popup_info.border.win_id + vim.api.nvim_win_set_option(win_id, "number", true) vim.api.nvim_win_set_option(win_id, "winhl", "Normal:HarpoonBorder") return win_id, bufnr