From 9d628017e31c88ae34154b0342d81ad0e7949683 Mon Sep 17 00:00:00 2001 From: takuto Date: Wed, 28 Feb 2024 05:26:46 +0000 Subject: [PATCH 1/2] feat(setup): add option to restore tree on session restore if possible EXPERIMENTAL!! --- lua/neo-tree/defaults.lua | 1 + lua/neo-tree/setup/init.lua | 16 +++++++++++++--- lua/neo-tree/ui/renderer.lua | 10 ++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lua/neo-tree/defaults.lua b/lua/neo-tree/defaults.lua index 54ea1caaa..2055220f2 100644 --- a/lua/neo-tree/defaults.lua +++ b/lua/neo-tree/defaults.lua @@ -11,6 +11,7 @@ local config = { }, add_blank_line_at_top = false, -- Add a blank line at the top of the tree. auto_clean_after_session_restore = false, -- Automatically clean up broken neo-tree buffers saved in sessions + auto_restore_session_experimental = false, -- Try best to restore neo-tree from invalid buffers restored by auto-session plugins close_if_last_window = false, -- Close Neo-tree if it is the last window left in the tab default_source = "filesystem", -- you can choose a specific source `last` here which indicates the last used source enable_diagnostics = true, diff --git a/lua/neo-tree/setup/init.lua b/lua/neo-tree/setup/init.lua index ca99ddcac..e19df0d21 100644 --- a/lua/neo-tree/setup/init.lua +++ b/lua/neo-tree/setup/init.lua @@ -687,12 +687,22 @@ M.merge_config = function(user_config, is_auto_config) manager.redraw(source_name) end - if M.config.auto_clean_after_session_restore then - require("neo-tree.ui.renderer").clean_invalid_neotree_buffers(false) + if M.config.auto_clean_after_session_restore or M.config.auto_restore_session_experimental then events.subscribe({ event = events.VIM_AFTER_SESSION_LOAD, handler = function() - require("neo-tree.ui.renderer").clean_invalid_neotree_buffers(true) + local invalid_tree = require("neo-tree.ui.renderer").clean_invalid_neotree_buffers(true) + local restore = M.config.auto_restore_session_experimental + and vim.list_contains(M.config.sources, invalid_tree) + if restore then + vim.schedule(function () + require("neo-tree.command").execute({ + source = invalid_tree, + dir = vim.fn.getcwd(), + action = "show", + }) + end) + end end, }) end diff --git a/lua/neo-tree/ui/renderer.lua b/lua/neo-tree/ui/renderer.lua index fbce8e89d..1a9f6650d 100644 --- a/lua/neo-tree/ui/renderer.lua +++ b/lua/neo-tree/ui/renderer.lua @@ -44,15 +44,21 @@ M.clean_invalid_neotree_buffers = function(force) return end + ---@type string? + local invalid_tree_name = nil for _, buf in ipairs(vim.api.nvim_list_bufs()) do local bufname = vim.fn.bufname(buf) - local is_neotree_buffer = string.match(bufname, "neo%-tree [^ ]+ %[%d+]") + local neotree_buffer_name = string.match(bufname, "neo%-tree ([^ ]+) %[%d+]") local is_valid_neotree, _ = pcall(vim.api.nvim_buf_get_var, buf, "neo_tree_source") - if is_neotree_buffer and not is_valid_neotree then + if neotree_buffer_name and not is_valid_neotree then vim.api.nvim_buf_delete(buf, { force = true }) + if invalid_tree_name ~= "filesystem" then -- prioritize filesystem source as that is most wanted + invalid_tree_name = neotree_buffer_name + end end end cleaned_up = true + return invalid_tree_name end local resize_monitor_timer = nil From af1ff96f843ce093d75bbc52f33ba16bfe4470a7 Mon Sep 17 00:00:00 2001 From: pysan3 Date: Thu, 29 Feb 2024 00:50:04 +0900 Subject: [PATCH 2/2] fix(setup): vim.list_contains is only supported in nvim >= v0.10 --- lua/neo-tree/setup/init.lua | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lua/neo-tree/setup/init.lua b/lua/neo-tree/setup/init.lua index e19df0d21..a51e19570 100644 --- a/lua/neo-tree/setup/init.lua +++ b/lua/neo-tree/setup/init.lua @@ -692,16 +692,19 @@ M.merge_config = function(user_config, is_auto_config) event = events.VIM_AFTER_SESSION_LOAD, handler = function() local invalid_tree = require("neo-tree.ui.renderer").clean_invalid_neotree_buffers(true) - local restore = M.config.auto_restore_session_experimental - and vim.list_contains(M.config.sources, invalid_tree) - if restore then - vim.schedule(function () - require("neo-tree.command").execute({ - source = invalid_tree, - dir = vim.fn.getcwd(), - action = "show", - }) - end) + if M.config.auto_restore_session_experimental and invalid_tree then + for _, v in ipairs(M.config.sources) do + if v == invalid_tree then + vim.schedule(function () + require("neo-tree.command").execute({ + source = invalid_tree, + dir = vim.fn.getcwd(), + action = "show", + }) + end) + return + end + end end end, })