From 70e5451eb6b37efcd5d31a9d6879333e389ada88 Mon Sep 17 00:00:00 2001 From: linepi <2428513224@qq.com> Date: Sun, 28 Jul 2024 14:47:12 +0800 Subject: [PATCH 1/5] feat: support collapse a single folder under cursor with messy conflict resolution --- doc/nvim-tree-lua.txt | 17 ++++++++++++++-- .../actions/tree/modifiers/collapse-all.lua | 20 ++++++++++++++++--- lua/nvim-tree/api.lua | 5 +++++ lua/nvim-tree/commands.lua | 13 +++++++++++- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index b3aa35abb2b..b6e940d2e82 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -341,7 +341,15 @@ See |nvim-tree-highlight| for details. See |nvim-tree-api.tree.collapse_all()| - Calls: `api.tree.collapse_all(false)` + Calls: api.tree.collapse_all({ under_cursor = false, keep_buffers = false, }) + +*:NvimTreeCollapseFolder* + + Collapses the folder under cursor + + See |nvim-tree-api.tree.collapse_all()| + + Calls: api.tree.collapse_all({ under_cursor = true, keep_buffers = false, }) *:NvimTreeCollapseKeepBuffers* @@ -1829,10 +1837,14 @@ tree.find_file({opts}) *nvim-tree-api.tree.find_file()* tree.search_node() *nvim-tree-api.tree.search_node()* Open the search dialogue as per the search_node action. -tree.collapse_all({keep_buffers}) *nvim-tree-api.tree.collapse_all()* +tree.collapse_all({opts}) *nvim-tree-api.tree.collapse_all()* Collapse the tree. Parameters: ~ + • {opts} (table) optional parameters + + Parameters: ~ + • {under_cursor} (boolean) only collapse the node under cursor • {keep_buffers} (boolean) do not collapse nodes with open buffers. tree.expand_all({node}) *nvim-tree-api.tree.expand_all()* @@ -3340,6 +3352,7 @@ highlight group is not, hard linking as follows: > |nvim-tree-api.tree.close_in_all_tabs()| |nvim-tree-api.tree.close_in_this_tab()| |nvim-tree-api.tree.collapse_all()| +|nvim-tree-api.tree.collapse |nvim-tree-api.tree.expand_all()| |nvim-tree-api.tree.find_file()| |nvim-tree-api.tree.focus()| diff --git a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua b/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua index 049be2bbfa2..d5edc73bf96 100644 --- a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua +++ b/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua @@ -23,8 +23,12 @@ local function buf_match() end end ----@param keep_buffers boolean -function M.fn(keep_buffers) +---@param opts ApiTreeCollapseOpts|nil +function M.fn(opts) + opts = opts or {} + local keep_buffers = opts.keep_buffers or false + local under_cursor = opts.under_cursor or false + local explorer = core.get_explorer() if not explorer then return @@ -37,7 +41,17 @@ function M.fn(keep_buffers) local matches = buf_match() - Iterator.builder(explorer.nodes) + local selectedNodes + if under_cursor then + if not node or not node.nodes then + return + end + selectedNodes = node.nodes + else + selectedNodes = explorer.nodes + end + + Iterator.builder(selectedNodes) :hidden() :applier(function(n) local dir = n:as(DirectoryNode) diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 822dbf20c0e..159c61105b4 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -182,6 +182,11 @@ Api.tree.get_nodes = wrap_explorer("get_nodes") Api.tree.find_file = wrap(actions.tree.find_file.fn) Api.tree.search_node = wrap(actions.finders.search_node.fn) + +---@class ApiTreeCollapseOpts +---@field under_cursor boolean +---@field keep_buffers boolean + Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse_all.fn) Api.tree.expand_all = wrap_node(actions.tree.modifiers.expand_all.fn) Api.tree.toggle_enable_filters = wrap_explorer_member("filters", "toggle") diff --git a/lua/nvim-tree/commands.lua b/lua/nvim-tree/commands.lua index bff880c14fd..c872aee1c86 100644 --- a/lua/nvim-tree/commands.lua +++ b/lua/nvim-tree/commands.lua @@ -1,5 +1,6 @@ local api = require("nvim-tree.api") local view = require("nvim-tree.view") +local lib = require("nvim-tree.lib") local M = {} @@ -121,7 +122,17 @@ local CMDS = { bar = true, }, command = function() - api.tree.collapse_all(false) + api.tree.collapse_all({ under_cursor = false, keep_buffers = false }) + end, + }, + { + name = "NvimTreeCollapseFolder", + opts = { + desc = "nvim-tree: collapse the folder under cursor", + bar = true, + }, + command = function() + api.tree.collapse_all({ under_cursor = true, keep_buffers = false }) end, }, { From 2fc8d1fc9a46fd3106c89f9495d9d78dc25e847b Mon Sep 17 00:00:00 2001 From: Lorentz Lasson Date: Thu, 29 May 2025 17:45:08 +0200 Subject: [PATCH 2/5] align casing --- lua/nvim-tree/actions/tree/modifiers/collapse-all.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua b/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua index d5edc73bf96..5f917dc6657 100644 --- a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua +++ b/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua @@ -41,17 +41,17 @@ function M.fn(opts) local matches = buf_match() - local selectedNodes + local selected_nodes if under_cursor then if not node or not node.nodes then return end - selectedNodes = node.nodes + selected_nodes = node.nodes else - selectedNodes = explorer.nodes + selected_nodes = explorer.nodes end - Iterator.builder(selectedNodes) + Iterator.builder(selected_nodes) :hidden() :applier(function(n) local dir = n:as(DirectoryNode) From 679883d21795fcf9b811e755ddea2a5607561517 Mon Sep 17 00:00:00 2001 From: Lorentz Lasson Date: Thu, 29 May 2025 17:52:37 +0200 Subject: [PATCH 3/5] rm unused --- lua/nvim-tree/commands.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/nvim-tree/commands.lua b/lua/nvim-tree/commands.lua index c872aee1c86..98f629873cb 100644 --- a/lua/nvim-tree/commands.lua +++ b/lua/nvim-tree/commands.lua @@ -1,6 +1,5 @@ local api = require("nvim-tree.api") local view = require("nvim-tree.view") -local lib = require("nvim-tree.lib") local M = {} From 9e4ebe8dadba85a4313e196da06a9a251f88f67b Mon Sep 17 00:00:00 2001 From: Lorentz Lasson Date: Sat, 31 May 2025 15:59:01 +0200 Subject: [PATCH 4/5] use portable shebangs consistently --- .hooks/pre-commit.sh | 2 +- scripts/doc-comments.sh | 2 +- scripts/help-update.sh | 2 +- scripts/luals-check.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.hooks/pre-commit.sh b/.hooks/pre-commit.sh index 5b139ec3263..9e89e95700c 100755 --- a/.hooks/pre-commit.sh +++ b/.hooks/pre-commit.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/usr/bin/env sh make diff --git a/scripts/doc-comments.sh b/scripts/doc-comments.sh index c31bbeaef44..2b49e8099a0 100755 --- a/scripts/doc-comments.sh +++ b/scripts/doc-comments.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash out=$(grep -nr "^--- @" lua) diff --git a/scripts/help-update.sh b/scripts/help-update.sh index 474e259d700..b888e61cd33 100755 --- a/scripts/help-update.sh +++ b/scripts/help-update.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env sh # run after changing nvim-tree.lua DEFAULT_OPTS or keymap.lua M.default_on_attach # scrapes and updates nvim-tree-lua.txt diff --git a/scripts/luals-check.sh b/scripts/luals-check.sh index 0a6de31d2cd..9d1e31f395f 100755 --- a/scripts/luals-check.sh +++ b/scripts/luals-check.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env sh # Performs a lua-language-server check on all files. # luals-out/check.json will be produced on any issues, returning 1. From 78b05f2f149267667412343bd5dc62f14547f33f Mon Sep 17 00:00:00 2001 From: Lorentz Lasson Date: Sat, 31 May 2025 16:23:14 +0200 Subject: [PATCH 5/5] adapt to feedback --- doc/nvim-tree-lua.txt | 20 ++++++++++------ .../{collapse-all.lua => collapse.lua} | 24 ++++++++++++------- lua/nvim-tree/actions/tree/modifiers/init.lua | 2 +- lua/nvim-tree/api.lua | 3 ++- lua/nvim-tree/commands.lua | 6 ++--- 5 files changed, 35 insertions(+), 20 deletions(-) rename lua/nvim-tree/actions/tree/modifiers/{collapse-all.lua => collapse.lua} (73%) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index b6e940d2e82..150a62f1962 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -339,17 +339,17 @@ See |nvim-tree-highlight| for details. Collapses the nvim-tree recursively. - See |nvim-tree-api.tree.collapse_all()| + See |nvim-tree-api.tree.collapse()| - Calls: api.tree.collapse_all({ under_cursor = false, keep_buffers = false, }) + Calls: api.tree.collapse({ under_cursor = false, keep_buffers = false, }) *:NvimTreeCollapseFolder* Collapses the folder under cursor - See |nvim-tree-api.tree.collapse_all()| + See |nvim-tree-api.tree.collapse()| - Calls: api.tree.collapse_all({ under_cursor = true, keep_buffers = false, }) + Calls: api.tree.collapse({ under_cursor = true, keep_buffers = false, }) *:NvimTreeCollapseKeepBuffers* @@ -1837,16 +1837,22 @@ tree.find_file({opts}) *nvim-tree-api.tree.find_file()* tree.search_node() *nvim-tree-api.tree.search_node()* Open the search dialogue as per the search_node action. -tree.collapse_all({opts}) *nvim-tree-api.tree.collapse_all()* +tree.collapse({opts}) *nvim-tree-api.tree.collapse()* Collapse the tree. Parameters: ~ - • {opts} (table) optional parameters + • {opts} (table) parameters Parameters: ~ • {under_cursor} (boolean) only collapse the node under cursor • {keep_buffers} (boolean) do not collapse nodes with open buffers. +tree.collapse_all({keep_buffers}) *nvim-tree-api.tree.collapse_all()* + Collapse the tree. + + Parameters: ~ + • {keep_buffers} (boolean) do not collapse nodes with open buffers. + tree.expand_all({node}) *nvim-tree-api.tree.expand_all()* Recursively expand all nodes under the tree root or specified folder. @@ -3352,7 +3358,7 @@ highlight group is not, hard linking as follows: > |nvim-tree-api.tree.close_in_all_tabs()| |nvim-tree-api.tree.close_in_this_tab()| |nvim-tree-api.tree.collapse_all()| -|nvim-tree-api.tree.collapse +|nvim-tree-api.tree.collapse()| |nvim-tree-api.tree.expand_all()| |nvim-tree-api.tree.find_file()| |nvim-tree-api.tree.focus()| diff --git a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua b/lua/nvim-tree/actions/tree/modifiers/collapse.lua similarity index 73% rename from lua/nvim-tree/actions/tree/modifiers/collapse-all.lua rename to lua/nvim-tree/actions/tree/modifiers/collapse.lua index 5f917dc6657..0f1d923edd4 100644 --- a/lua/nvim-tree/actions/tree/modifiers/collapse-all.lua +++ b/lua/nvim-tree/actions/tree/modifiers/collapse.lua @@ -23,12 +23,12 @@ local function buf_match() end end ----@param opts ApiTreeCollapseOpts|nil -function M.fn(opts) - opts = opts or {} - local keep_buffers = opts.keep_buffers or false - local under_cursor = opts.under_cursor or false - +---@param opts ApiTreeCollapseOpts | nil +function M.collapse(opts) + opts = opts or { + keep_buffers = false, + under_cursor = true + } local explorer = core.get_explorer() if not explorer then return @@ -42,11 +42,13 @@ function M.fn(opts) local matches = buf_match() local selected_nodes - if under_cursor then + if opts.under_cursor then + local dir = node:as(DirectoryNode) if not node or not node.nodes then return end selected_nodes = node.nodes + dir.open = false else selected_nodes = explorer.nodes end @@ -56,7 +58,7 @@ function M.fn(opts) :applier(function(n) local dir = n:as(DirectoryNode) if dir then - dir.open = keep_buffers and matches(dir.absolute_path) + dir.open = opts.keep_buffers and matches(dir.absolute_path) end end) :recursor(function(n) @@ -68,4 +70,10 @@ function M.fn(opts) utils.focus_node_or_parent(node) end +---@param keep_buffers boolean | nil +function M.collapse_all(keep_buffers) + keep_buffers = keep_buffers or false + M.collapse({ keep_buffers = keep_buffers, under_cursor = false }) +end + return M diff --git a/lua/nvim-tree/actions/tree/modifiers/init.lua b/lua/nvim-tree/actions/tree/modifiers/init.lua index f3ce27fc616..8b66dd61301 100644 --- a/lua/nvim-tree/actions/tree/modifiers/init.lua +++ b/lua/nvim-tree/actions/tree/modifiers/init.lua @@ -1,6 +1,6 @@ local M = {} -M.collapse_all = require("nvim-tree.actions.tree.modifiers.collapse-all") +M.collapse = require("nvim-tree.actions.tree.modifiers.collapse") M.expand_all = require("nvim-tree.actions.tree.modifiers.expand-all") function M.setup(opts) diff --git a/lua/nvim-tree/api.lua b/lua/nvim-tree/api.lua index 159c61105b4..2fe2bf9ce1c 100644 --- a/lua/nvim-tree/api.lua +++ b/lua/nvim-tree/api.lua @@ -187,7 +187,8 @@ Api.tree.search_node = wrap(actions.finders.search_node.fn) ---@field under_cursor boolean ---@field keep_buffers boolean -Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse_all.fn) +Api.tree.collapse = wrap(actions.tree.modifiers.collapse.collapse) +Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse.collapse_all) Api.tree.expand_all = wrap_node(actions.tree.modifiers.expand_all.fn) Api.tree.toggle_enable_filters = wrap_explorer_member("filters", "toggle") Api.tree.toggle_gitignore_filter = wrap_explorer_member_args("filters", "toggle", "git_ignored") diff --git a/lua/nvim-tree/commands.lua b/lua/nvim-tree/commands.lua index 98f629873cb..ff08c041485 100644 --- a/lua/nvim-tree/commands.lua +++ b/lua/nvim-tree/commands.lua @@ -121,7 +121,7 @@ local CMDS = { bar = true, }, command = function() - api.tree.collapse_all({ under_cursor = false, keep_buffers = false }) + api.tree.collapse({ under_cursor = false, keep_buffers = false }) end, }, { @@ -131,7 +131,7 @@ local CMDS = { bar = true, }, command = function() - api.tree.collapse_all({ under_cursor = true, keep_buffers = false }) + api.tree.collapse({ under_cursor = true, keep_buffers = false }) end, }, { @@ -141,7 +141,7 @@ local CMDS = { bar = true, }, command = function() - api.tree.collapse_all(true) + api.tree.collapse({ under_cursor = false, keep_buffers = true }) end, }, {