From c4b95a906dfb70c33926260d6ad8fc217b5312e4 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 7 Oct 2024 20:52:03 -0400 Subject: [PATCH] minor improvement to ':q' behaviour prevents odd and slightly annoying situation when ':q' is used and the file tree was open. if quitting the last non-file-tree window, you then get left with a full-screen file tree instead of quitting neovim. this fixes that. --- nvim/lua/autocmds.lua | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/nvim/lua/autocmds.lua b/nvim/lua/autocmds.lua index 3c945c1..b1ec96d 100644 --- a/nvim/lua/autocmds.lua +++ b/nvim/lua/autocmds.lua @@ -54,3 +54,44 @@ vim.api.nvim_create_autocmd('BufEnter', { end end, }) + +-- Borrowed from nvim-tree wiki recipe: +-- https://github.com/nvim-tree/nvim-tree.lua/wiki/Recipes#make-q-and-bd-work-as-if-tree-was-not-visible +-- Make :bd and :q behave as usual when tree is visible +vim.api.nvim_create_autocmd({ 'BufEnter', 'QuitPre' }, { + nested = false, + group = vim.api.nvim_create_augroup('gered-bufenter-quitpre-nvim-tree', { clear = true }), + callback = function(e) + local tree = require('nvim-tree.api').tree + + -- Nothing to do if tree is not opened + if not tree.is_visible() then + return + end + + -- How many focusable windows do we have? (excluding e.g. incline status window) + local winCount = 0 + for _, winId in ipairs(vim.api.nvim_list_wins()) do + if vim.api.nvim_win_get_config(winId).focusable then + winCount = winCount + 1 + end + end + + -- We want to quit and only one window besides tree is left + if e.event == 'QuitPre' and winCount == 2 then + vim.api.nvim_cmd({ cmd = 'qall' }, {}) + end + + -- :bd was probably issued an only tree window is left + -- Behave as if tree was closed (see `:h :bd`) + if e.event == 'BufEnter' and winCount == 1 then + -- Required to avoid "Vim:E444: Cannot close last window" + vim.defer_fn(function() + -- close nvim-tree: will go to the last buffer used before closing + tree.toggle { find_file = true, focus = true } + -- re-open nivm-tree + tree.toggle { find_file = true, focus = false } + end, 10) + end + end, +})