diff --git a/README.md b/README.md index 87ac7529..4ce3c3e9 100644 --- a/README.md +++ b/README.md @@ -397,6 +397,7 @@ require("neo-tree").setup({ use_float = true, use_snacks_image = true, use_image_nvim = true, + force = nil -- Set to true/false to always open/close, respectively }, }, -- Read `# Preview Mode` for more information @@ -945,8 +946,9 @@ require("neo-tree").setup({ "toggle_preview", config = { use_float = false, - -- use_image_nvim = true, -- use_snacks_image = true, + -- use_image_nvim = true, + -- force = nil, -- title = 'Neo-tree Preview', }, }, @@ -959,6 +961,24 @@ Anything that causes Neo-tree to lose focus will end preview mode. When `use_float = false`, the window that was taken over by preview mode will revert back to whatever was shown in that window before preview mode began. +The `toggle_preview` command also takes a `force` option which will force the +preview to open/close if set to true/false, respectively. This can be used for +"auto-preview"-like behavior like: + +```lua + require('neo-tree').setup({ + event_handlers = { + { + event = 'after_render', + handler = function(state) + state.config = { use_float = true, force = true } + state.commands.toggle_preview(state) + end + } + } + }) +``` + You can choose a custom title for the floating window by setting the `title` option in its config. diff --git a/doc/neo-tree.txt b/doc/neo-tree.txt index b43da873..bf04e71e 100644 --- a/doc/neo-tree.txt +++ b/doc/neo-tree.txt @@ -435,7 +435,8 @@ an existing split by configuring the command like this: config = { use_float = false, use_snacks_image = true, - use_image_nvim = true + use_image_nvim = true, + force = nil } }, ["l"] = "focus_preview", @@ -445,10 +446,31 @@ an existing split by configuring the command like this: } }) < + Anything that causes Neo-tree to lose focus will end preview mode. When `use_float = false`, the window that was taken over by preview mode will revert back to whatever was shown in that window before preview mode began. +The `toggle_preview` command also takes a `force` option which will force the +preview to open/close if set to true/false, respectively. This can be used for +"auto-preview"-like behavior like: + +>lua + require('neo-tree').setup({ + event_handlers = { + { + event = 'after_render', + handler = function(state) + state.config = { use_float = true, force = true } + state.commands.toggle_preview(state) + end + } + } + }) +< + +You can choose a custom title for the floating window by setting the `title` option in its config. + If you want to work with the floating preview mode window in autocmds or other custom code, the window will have the `neo-tree-preview` filetype. diff --git a/lua/neo-tree/defaults.lua b/lua/neo-tree/defaults.lua index 5957b9e0..2eb1e6d2 100644 --- a/lua/neo-tree/defaults.lua +++ b/lua/neo-tree/defaults.lua @@ -408,15 +408,13 @@ local config = { [""] = "open", -- [""] = { "open", config = { expand_nested_files = true } }, -- expand nested file takes precedence [""] = "cancel", -- close preview or floating neo-tree window - ["P"] = { - "toggle_preview", - config = { - use_float = true, - use_snacks_image = true, - use_image_nvim = true, - -- title = "Neo-tree Preview", -- You can define a custom title for the preview floating window. - } - }, + ["P"] = { "toggle_preview", config = { + use_float = true, + use_snacks_image = true, + use_image_nvim = false, + -- force = nil, + -- title = "Neo-tree Preview", -- You can define a custom title for the preview floating window. + } }, [""] = { "scroll_preview", config = {direction = -10} }, [""] = { "scroll_preview", config = {direction = 10} }, ["l"] = "focus_preview", diff --git a/lua/neo-tree/sources/common/preview.lua b/lua/neo-tree/sources/common/preview.lua index b7801a10..c4df11ac 100644 --- a/lua/neo-tree/sources/common/preview.lua +++ b/lua/neo-tree/sources/common/preview.lua @@ -474,10 +474,10 @@ function Preview:clearHighlight() end end -local toggle_state = false +local showing = false Preview.hide = function() - toggle_state = false + showing = false if instance then instance:revert() end @@ -511,12 +511,15 @@ end ---@param state neotree.State Preview.toggle = function(state) - if toggle_state then + state.config = state.config or {} + local should_hide = state.config.force and (state.config.force == false) or showing + local should_show = state.config.force and (state.config.force == true) or not showing + if should_hide then Preview.hide() - else + elseif should_show then Preview.show(state) if instance and instance.active then - toggle_state = true + showing = true else Preview.hide() return @@ -527,7 +530,7 @@ Preview.toggle = function(state) event = events.VIM_CURSOR_MOVED, handler = function() local did_enter_preview = vim.api.nvim_get_current_win() == instance.winid - if not toggle_state or (did_enter_preview and instance.config.use_float) then + if not showing or (did_enter_preview and instance.config.use_float) then return end if vim.api.nvim_get_current_win() == winid then diff --git a/lua/neo-tree/sources/manager.lua b/lua/neo-tree/sources/manager.lua index 5cb35dbf..f6b241d6 100644 --- a/lua/neo-tree/sources/manager.lua +++ b/lua/neo-tree/sources/manager.lua @@ -217,9 +217,9 @@ end M.get_state_for_window = function(winid) winid = winid or vim.api.nvim_get_current_win() local bufnr = vim.api.nvim_win_get_buf(winid) - local source_status, source_name = pcall(vim.api.nvim_buf_get_var, bufnr, "neo_tree_source") - local position_status, position = pcall(vim.api.nvim_buf_get_var, bufnr, "neo_tree_position") - if not source_status or not position_status then + local source_name = vim.b[bufnr].neo_tree_source + local position = vim.b[bufnr].neo_tree_position + if source_name == nil or position == nil then return nil end diff --git a/lua/neo-tree/ui/renderer.lua b/lua/neo-tree/ui/renderer.lua index fec66afa..662c63bc 100644 --- a/lua/neo-tree/ui/renderer.lua +++ b/lua/neo-tree/ui/renderer.lua @@ -1154,16 +1154,17 @@ M.acquire_window = function(state) location.source = state.name end event_args.winid = state.winid - events.fire_event(events.NEO_TREE_WINDOW_AFTER_OPEN, event_args) if type(state.bufnr) == "number" then - vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_source", state.name) - vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_tabnr", tabid_to_tabnr(state.tabid)) - vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_tabid", state.tabid) - vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_position", state.current_position) - vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_winid", state.winid) + vim.b[state.bufnr].neo_tree_source = state.name + vim.b[state.bufnr].neo_tree_tabnr = tabid_to_tabnr(state.tabid) + vim.b[state.bufnr].neo_tree_tabid = state.tabid + vim.b[state.bufnr].neo_tree_position = state.current_position + vim.b[state.bufnr].neo_tree_winid = state.winid end + events.fire_event(events.NEO_TREE_WINDOW_AFTER_OPEN, event_args) + if win ~= nil then vim.api.nvim_buf_set_name(state.bufnr, bufname) vim.api.nvim_set_current_win(state.winid)