[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-70617":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":14,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":16,"starSnapshotCount":16,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},70617,"neo-tree.nvim","nvim-neo-tree\u002Fneo-tree.nvim","nvim-neo-tree","Neovim plugin to manage the file system and other tree like structures.","",null,"Lua",5493,292,9,157,0,24,57,27,99.1,"MIT License",false,"main",true,[26,27,28,29],"file-explorer","lua","neovim","plugin","2026-06-12 04:00:56","# Neo-tree.nvim\n\nNeo-tree is a Neovim plugin to browse the file system and other tree like\nstructures in whatever style suits you, including sidebars, floating windows,\nnetrw split style, or all of them at once!\n\nThis screenshot shows Neo-tree opened in the traditional sidebar layout:\n\n![Neo-tree file system\nsidebar](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fblob\u002Fmain\u002Fimages\u002FNeo-tree-with-right-aligned-symbols.png)\n\n\u003Cdetails>\n  \u003Csummary>\n    Neo-tree filesystem screenshot, Netrw Style\n  \u003C\u002Fsummary>\n\nThe below screenshot shows Neo-tree opened \"netrw style\" (`:Neotree\nposition=current`). When opened in this way, there is more room so the extra\ndetail columns can be shown. This screenshot also shows how the contents can be\nsorted on any column. In this example, we are sorted on \"Size\" descending:\n\n![Neo-tree file system\ndetails](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fblob\u002Fmain\u002Fimages\u002FNeo-tree-with-file-details-and-sort.png)\n\n\u003C\u002Fdetails>\n\n### Breaking Changes BAD :bomb: :imp:\n\nThe biggest and most important feature of Neo-tree is that we will never\nknowingly push a breaking change and interrupt your day. Bugs happen, but\nbreaking changes can always be avoided. When breaking changes are needed, there\nwill be a new branch that you can opt into, when it is a good time for you.\n\nSee [What is a Breaking Change?](#what-is-a-breaking-change) for details.\n\nSee [Changelog 3.0](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fneo-tree.nvim\u002Fwiki\u002FChangelog#30)\nfor breaking changes and deprecations in 3.0.\n\n### User Experience GOOD :slightly_smiling_face: :thumbsup:\n\nAside from being polite about breaking changes, Neo-tree is also focused on the\nlittle details of user experience. Everything should work exactly as you would\nexpect a sidebar to work without all of the glitchy behavior that is normally\naccepted in (neo)vim sidebars. I can't stand glitchy behavior, and neither\nshould you!\n\n- Neo-tree won't let other buffers take over its window.\n- Neo-tree won't leave its window scrolled to the last line when there is plenty\n  of room to display the whole tree.\n- Neo-tree does not need to be manually refreshed\n  (set `use_libuv_file_watcher = true`)\n- Neo-tree can intelligently follow the current file\n  (set `follow_current_file.enabled = true`)\n- Neo-tree can sync its clipboard across multiple trees, either globally\n  (within the same Neovim instance) or universally (across all Neovim\n  instances). Try `clipboard.sync = \"global\" | \"universal\"`.\n- Neo-tree is thoughtful about maintaining or setting focus on the right node\n- Neo-tree windows in different tabs are completely separate\n- `respect_gitignore` actually works!\n\n> [!NOTE]\n> Neo-tree is meant to be smooth, efficient, stable, and intuitive. If you find\n> anything janky, slow, broken, or unintuitive, please open an issue so we can\n> fix it.\n\n## Installation\n\nThis plugin relies upon these two excellent library plugins:\n\n- [MunifTanjim\u002Fnui.nvim](https:\u002F\u002Fgithub.com\u002FMunifTanjim\u002Fnui.nvim) for all UI\ncomponents, including the tree!\n- [nvim-lua\u002Fplenary.nvim](https:\u002F\u002Fgithub.com\u002Fnvim-lua\u002Fplenary.nvim) for backend\nutilities, such as scanning the filesystem.\n\nThere are also some optional plugins that work with Neo-tree:\n\n- [nvim-tree\u002Fnvim-web-devicons](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons)\n  for file icons.\n- [antosha417\u002Fnvim-lsp-file-operations](https:\u002F\u002Fgithub.com\u002Fantosha417\u002Fnvim-lsp-file-operations)\n  for LSP-enhanced renames\u002Fetc.\n- [folke\u002Fsnacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim) for image previews,\n  see Preview Mode section.\n- [snacks.rename](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim\u002Fblob\u002Fmain\u002Fdocs\u002Frename.md#neo-treenvim)\n  can also work with Neo-tree\n- [3rd\u002Fimage.nvim](https:\u002F\u002Fgithub.com\u002F3rd\u002Fimage.nvim) for image previews.\n  - If both snacks.nvim and image.nvim are installed. Neo-tree currently will try\n    to preview with snacks.nvim first, then try image.nvim.\n- [s1n7ax\u002Fnvim-window-picker](https:\u002F\u002Fgithub.com\u002Fs1n7ax\u002Fnvim-window-picker) for\n  `_with_window_picker` keymaps.\n\n### vim.pack example (requires Neovim 0.12)\n\n```lua\nvim.pack.add({\n  {\n    src = 'https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fneo-tree.nvim',\n    version = vim.version.range('3')\n  },\n  -- dependencies\n  \"https:\u002F\u002Fgithub.com\u002Fnvim-lua\u002Fplenary.nvim\",\n  \"https:\u002F\u002Fgithub.com\u002FMunifTanjim\u002Fnui.nvim\",\n  -- optional, but recommended\n  \"https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons\",\n})\n```\n\n\n### lazy.nvim example:\n\n```lua\nreturn {\n  {\n    \"nvim-neo-tree\u002Fneo-tree.nvim\",\n    branch = \"v3.x\",\n    dependencies = {\n      \"nvim-lua\u002Fplenary.nvim\",\n      \"MunifTanjim\u002Fnui.nvim\",\n      \"nvim-tree\u002Fnvim-web-devicons\", -- optional, but recommended\n    },\n    lazy = false, -- neo-tree will lazily load itself\n  }\n}\n```\n\n\u003Cdetails>\n  \u003Csummary>\n    lazy.nvim example with all optional plugins:\n  \u003C\u002Fsummary>\n\n```lua\nreturn {\n  {\n    \"nvim-neo-tree\u002Fneo-tree.nvim\",\n    branch = \"v3.x\",\n    dependencies = {\n      \"nvim-lua\u002Fplenary.nvim\",\n      \"MunifTanjim\u002Fnui.nvim\",\n      \"nvim-tree\u002Fnvim-web-devicons\",\n    },\n  },\n  {\n    \"antosha417\u002Fnvim-lsp-file-operations\",\n    dependencies = {\n      \"nvim-lua\u002Fplenary.nvim\",\n      \"nvim-neo-tree\u002Fneo-tree.nvim\", -- makes sure that this loads after Neo-tree.\n    },\n    config = function()\n      require(\"lsp-file-operations\").setup()\n    end,\n  },\n  {\n    \"s1n7ax\u002Fnvim-window-picker\",\n    version = \"2.*\",\n    config = function()\n      require(\"window-picker\").setup({\n        filter_rules = {\n          include_current_win = false,\n          autoselect_one = true,\n          -- filter using buffer options\n          bo = {\n            -- if the file type is one of following, the window will be ignored\n            filetype = { \"neo-tree\", \"neo-tree-popup\", \"notify\" },\n            -- if the buffer type is one of following, the window will be ignored\n            buftype = { \"terminal\", \"quickfix\" },\n          },\n        },\n      })\n    end,\n  },\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n  \u003Csummary>\n    Packer.nvim example:\n  \u003C\u002Fsummary>\n\n```lua\nuse({\n  \"nvim-neo-tree\u002Fneo-tree.nvim\",\n  branch = \"v3.x\",\n  requires = {\n    \"nvim-lua\u002Fplenary.nvim\",\n    \"MunifTanjim\u002Fnui.nvim\",\n    \"nvim-tree\u002Fnvim-web-devicons\", -- optional, but recommended\n  }\n})\n```\n\n\u003C\u002Fdetails>\n\n\n\u003Cdetails>\n  \u003Csummary>\n    mini.deps example:\n  \u003C\u002Fsummary>\n\n```lua\nlocal add = MiniDeps.add\n\nadd({\n  source = 'nvim-neo-tree\u002Fneo-tree.nvim',\n  checkout = 'v3.x',\n  depends = {\n    \"nvim-lua\u002Fplenary.nvim\",\n    \"MunifTanjim\u002Fnui.nvim\",\n    \"nvim-tree\u002Fnvim-web-devicons\", -- optional, but recommended\n  }\n})\n```\n\n\u003C\u002Fdetails>\n\n### Manual installation via `:h packages`\n\nSee [doc\u002Finstall.sh](doc\u002Finstall.sh) and [doc\u002Finstall.ps1](doc\u002Finstall.ps1) for\nPOSIX\u002FWindows respectively.\n\n## Post-install: Try it out!\n\nTry `:Neotree` to open Neo-tree as a sidebar, and press `?` while in Neo-tree to\nopen the keyboard help.\n\n> [!TIP]\n> You can `:checkhealth neo-tree` to ensure you have all the required\n> dependencies. It can also check that your config table looks correct. This is\n> still in its early stages, so please file issues if you'd like to see more\n> checks added or a check isn't working properly.\n\n## Configuration\n\n```lua\nrequire('neo-tree').setup({\n  -- options go here\n})\n```\n\n\u003Cdetails>\n  \u003Csummary>\n    💤 lazy.nvim\u002FNeovim distro users:\n  \u003C\u002Fsummary>\n\nThe table passed into `setup()` has a type of `neotree.Config`. If you're on a\ndistro using lazy.nvim (e.g. LazyVim) or you just like the syntax, you might\nwant to consider using lazy.nvim's `opts` instead:\n\n```lua\nreturn {\n  \"nvim-neo-tree\u002Fneo-tree.nvim\",\n  branch = \"v3.x\",\n  dependencies = {\n    \"nvim-lua\u002Fplenary.nvim\",\n    \"MunifTanjim\u002Fnui.nvim\",\n    \"nvim-tree\u002Fnvim-web-devicons\", -- optional, but recommended\n  },\n  lazy = false, -- neo-tree will lazily load itself\n  ---@module 'neo-tree'\n  ---@type neotree.Config\n  opts = {\n    -- options go here\n  }\n}\n```\n\n\u003C\u002Fdetails>\n\n> [!NOTE]\n> You do not need to call `setup()` for Neo-tree and its commands to work. `setup()` is only for configuration.\n\n\u003Cdetails>\n  \u003Csummary>\n    Example configuration featuring many interesting settings:\n  \u003C\u002Fsummary>\n\n```lua\nvim.keymap.set(\"n\", \"\u003Cleader>e\", \"\u003CCmd>Neotree\u003CCR>\")\nrequire(\"neo-tree\").setup({\n  close_if_last_window = false, -- Close Neo-tree if it is the last window left in the tab\n  popup_border_style = \"NC\", -- or \"\" to use 'winborder' on Neovim v0.11+\n  clipboard = {\n    sync = \"none\", -- or \"global\"\u002F\"universal\" to share a clipboard for each\u002Fall Neovim instance(s), respectively\n  },\n  enable_git_status = true,\n  enable_diagnostics = true,\n  open_files_do_not_replace_types = { \"terminal\", \"trouble\", \"qf\" }, -- when opening files, do not use windows containing these filetypes or buftypes\n  open_files_using_relative_paths = false,\n  sort_case_insensitive = false, -- used when sorting files and directories in the tree\n  sort_function = nil, -- use a custom function for sorting files and directories in the tree\n  -- sort_function = function (a,b)\n  --       if a.type == b.type then\n  --           return a.path > b.path\n  --       else\n  --           return a.type > b.type\n  --       end\n  --   end , -- this sorts files and directories descendantly\n  default_component_configs = {\n    container = {\n      enable_character_fade = true,\n    },\n    indent = {\n      indent_size = 2,\n      padding = 1, -- extra padding on left hand side\n      -- indent guides\n      with_markers = true,\n      indent_marker = \"│\",\n      last_indent_marker = \"└\",\n      highlight = \"NeoTreeIndentMarker\",\n      -- expander config, needed for nesting files\n      with_expanders = nil, -- if nil and file nesting is enabled, will enable expanders\n      expander_collapsed = \"\",\n      expander_expanded = \"\",\n      expander_highlight = \"NeoTreeExpander\",\n    },\n    icon = {\n      folder_closed = \"\",\n      folder_open = \"\",\n      folder_empty = \"󰜌\",\n      provider = function(icon, node, state) -- default icon provider utilizes nvim-web-devicons if available\n        if node.type == \"file\" or node.type == \"terminal\" then\n          local success, web_devicons = pcall(require, \"nvim-web-devicons\")\n          local name = node.type == \"terminal\" and \"terminal\" or node.name\n          if success then\n            local devicon, hl = web_devicons.get_icon(name)\n            icon.text = devicon or icon.text\n            icon.highlight = hl or icon.highlight\n          end\n        end\n      end,\n      -- The next two settings are only a fallback, if you use nvim-web-devicons and configure default icons there\n      -- then these will never be used.\n      default = \"*\",\n      highlight = \"NeoTreeFileIcon\",\n      use_filtered_colors = true, -- Whether to use a different highlight when the file is filtered (hidden, dotfile, etc.).\n    },\n    modified = {\n      symbol = \"[+]\",\n      highlight = \"NeoTreeModified\",\n    },\n    name = {\n      trailing_slash = false,\n      use_filtered_colors = true, -- Whether to use a different highlight when the file is filtered (hidden, dotfile, etc.).\n      use_git_status_colors = true,\n      highlight = \"NeoTreeFileName\",\n    },\n    git_status = {\n      symbols = {\n        -- Change type\n        added = \"\", -- or \"✚\"\n        modified = \"\", -- or \"\"\n        deleted = \"✖\", -- this can only be used in the git_status source\n        renamed = \"󰁕\", -- this can only be used in the git_status source\n        -- Status type\n        untracked = \"\",\n        ignored = \"\",\n        unstaged = \"󰄱\",\n        staged = \"\",\n        conflict = \"\",\n      },\n    },\n    -- If you don't want to use these columns, you can set `enabled = false` for each of them individually\n    file_size = {\n      enabled = true,\n      width = 12, -- width of the column\n      required_width = 64, -- min width of window required to show this column\n    },\n    type = {\n      enabled = true,\n      width = 10, -- width of the column\n      required_width = 122, -- min width of window required to show this column\n    },\n    last_modified = {\n      enabled = true,\n      width = 20, -- width of the column\n      required_width = 88, -- min width of window required to show this column\n    },\n    created = {\n      enabled = true,\n      width = 20, -- width of the column\n      required_width = 110, -- min width of window required to show this column\n    },\n    symlink_target = {\n      enabled = false,\n    },\n  },\n  -- A list of functions, each representing a global custom command\n  -- that will be available in all sources (if not overridden in `opts[source_name].commands`)\n  -- see `:h neo-tree-custom-commands-global`\n  commands = {},\n  window = {\n    position = \"left\",\n    width = 40,\n    mapping_options = {\n      noremap = true,\n      nowait = true,\n    },\n    mappings = {\n      [\"\u003Cspace>\"] = {\n        \"toggle_node\",\n        nowait = false, -- disable `nowait` if you have existing combos starting with this char that you want to use\n      },\n      [\"\u003C2-LeftMouse>\"] = \"open\",\n      [\"\u003Ccr>\"] = \"open\",\n      [\"\u003Cesc>\"] = \"cancel\", -- close preview or floating neo-tree window\n      [\"P\"] = {\n        \"toggle_preview\",\n        config = {\n          use_float = true,\n          use_snacks_image = true,\n          use_image_nvim = true,\n        },\n      },\n      -- Read `# Preview Mode` for more information\n      [\"l\"] = \"focus_preview\",\n      [\"S\"] = \"open_split\",\n      [\"s\"] = \"open_vsplit\",\n      -- [\"S\"] = \"split_with_window_picker\",\n      -- [\"s\"] = \"vsplit_with_window_picker\",\n      [\"t\"] = \"open_tabnew\",\n      -- [\"\u003Ccr>\"] = \"open_drop\",\n      -- [\"t\"] = \"open_tab_drop\",\n      [\"w\"] = \"open_with_window_picker\",\n      --[\"P\"] = \"toggle_preview\", -- enter preview mode, which shows the current node without focusing\n      [\"C\"] = \"close_node\",\n      -- ['C'] = 'close_all_subnodes',\n      [\"z\"] = \"close_all_nodes\",\n      --[\"Z\"] = \"expand_all_nodes\",\n      --[\"Z\"] = \"expand_all_subnodes\",\n      [\"a\"] = {\n        \"add\",\n        -- this command supports BASH style brace expansion (\"x{a,b,c}\" -> xa,xb,xc). see `:h neo-tree-file-actions` for details\n        -- some commands may take optional config options, see `:h neo-tree-mappings` for details\n        config = {\n          show_path = \"none\", -- \"none\", \"relative\", \"absolute\"\n        },\n      },\n      [\"A\"] = \"add_directory\", -- also accepts the optional config.show_path option like \"add\". this also supports BASH style brace expansion.\n      [\"d\"] = \"delete\",\n      [\"r\"] = \"rename\",\n      [\"b\"] = \"rename_basename\",\n      [\"y\"] = \"copy_to_clipboard\",\n      [\"x\"] = \"cut_to_clipboard\",\n      [\"p\"] = \"paste_from_clipboard\",\n      [\"\u003CC-r>\"] = \"clear_clipboard\",\n      [\"c\"] = \"copy\", -- takes text input for destination, also accepts the optional config.show_path option like \"add\":\n      -- [\"c\"] = {\n      --  \"copy\",\n      --  config = {\n      --    show_path = \"none\" -- \"none\", \"relative\", \"absolute\"\n      --  }\n      --}\n      [\"m\"] = \"move\", -- takes text input for destination, also accepts the optional config.show_path option like \"add\".\n      [\"q\"] = \"close_window\",\n      [\"R\"] = \"refresh\",\n      [\"?\"] = \"show_help\",\n      [\"\u003C\"] = \"prev_source\",\n      [\">\"] = \"next_source\",\n      [\"i\"] = \"show_file_details\",\n      -- [\"i\"] = {\n      --   \"show_file_details\",\n      --   -- format strings of the timestamps shown for date created and last modified (see `:h os.date()`)\n      --   -- both options accept a string or a function that takes in the date in seconds and returns a string to display\n      --   -- config = {\n      --   --   created_format = \"%Y-%m-%d %I:%M %p\",\n      --   --   modified_format = \"relative\", -- equivalent to the line below\n      --   --   modified_format = function(seconds) return require('neo-tree.utils').relative_date(seconds) end\n      --   -- }\n      -- },\n    },\n  },\n  nesting_rules = {},\n  filesystem = {\n    filtered_items = {\n      visible = false, -- when true, they will just be displayed differently than normal items\n      hide_dotfiles = true,\n      hide_gitignored = true,\n      hide_ignored = true, -- hide files that are ignored by other gitignore-like files\n      -- other gitignore-like files, in descending order of precedence.\n      ignore_files = {\n        \".neotreeignore\",\n        \".ignore\",\n        -- \".rgignore\"\n      },\n      hide_hidden = true, -- only works on Windows for hidden files\u002Fdirectories\n      hide_by_name = {\n        --\"node_modules\"\n      },\n      hide_by_pattern = { -- uses glob style patterns\n        --\"*.meta\",\n        --\"*\u002Fsrc\u002F*\u002Ftsconfig.json\",\n      },\n      always_show = { -- remains visible even if other settings would normally hide it\n        --\".gitignored\",\n      },\n      always_show_by_pattern = { -- uses glob style patterns\n        --\".env*\",\n      },\n      never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show\n        --\".DS_Store\",\n        --\"thumbs.db\"\n      },\n      never_show_by_pattern = { -- uses glob style patterns\n        --\".null-ls_*\",\n      },\n    },\n    follow_current_file = {\n      enabled = false, -- This will find and focus the file in the active buffer every time\n      --               -- the current file is changed while the tree is open.\n      leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal`\n    },\n    group_empty_dirs = false, -- when true, empty folders will be grouped together\n    hijack_netrw_behavior = \"open_default\", -- netrw disabled, opening a directory opens neo-tree\n    -- in whatever position is specified in window.position\n    -- \"open_current\",  -- netrw disabled, opening a directory opens within the\n    -- window like netrw would, regardless of window.position\n    -- \"disabled\",    -- netrw left alone, neo-tree does not handle opening dirs\n    use_libuv_file_watcher = false, -- This will use the OS level file watchers to detect changes\n    -- instead of relying on nvim autocmd events.\n    window = {\n      mappings = {\n        [\"\u003Cbs>\"] = \"navigate_up\",\n        [\".\"] = \"set_root\",\n        [\"H\"] = \"toggle_hidden\",\n        [\"\u002F\"] = \"fuzzy_finder\",\n        [\"D\"] = \"fuzzy_finder_directory\",\n        [\"#\"] = \"fuzzy_sorter\", -- fuzzy sorting using the fzy algorithm\n        -- [\"D\"] = \"fuzzy_sorter_directory\",\n        [\"f\"] = \"filter_on_submit\",\n        [\"\u003Cc-x>\"] = \"clear_filter\",\n        [\"[g\"] = \"prev_git_modified\",\n        [\"]g\"] = \"next_git_modified\",\n        [\"o\"] = {\n          \"show_help\",\n          nowait = false,\n          config = { title = \"Order by\", prefix_key = \"o\" },\n        },\n        [\"oc\"] = { \"order_by_created\", nowait = false },\n        [\"od\"] = { \"order_by_diagnostics\", nowait = false },\n        [\"og\"] = { \"order_by_git_status\", nowait = false },\n        [\"om\"] = { \"order_by_modified\", nowait = false },\n        [\"on\"] = { \"order_by_name\", nowait = false },\n        [\"os\"] = { \"order_by_size\", nowait = false },\n        [\"ot\"] = { \"order_by_type\", nowait = false },\n        -- ['\u003Ckey>'] = function(state) ... end,\n      },\n      fuzzy_finder_mappings = { -- define keymaps for filter popup window in fuzzy_finder_mode\n        [\"\u003Cdown>\"] = \"move_cursor_down\",\n        [\"\u003CC-n>\"] = \"move_cursor_down\",\n        [\"\u003Cup>\"] = \"move_cursor_up\",\n        [\"\u003CC-p>\"] = \"move_cursor_up\",\n        [\"\u003Cesc>\"] = \"close\",\n        [\"\u003CS-CR>\"] = \"close_keep_filter\",\n        [\"\u003CC-CR>\"] = \"close_clear_filter\",\n        [\"\u003CC-w>\"] = { \"\u003CC-S-w>\", raw = true },\n        {\n          -- normal mode mappings\n          n = {\n            [\"j\"] = \"move_cursor_down\",\n            [\"k\"] = \"move_cursor_up\",\n            [\"\u003CS-CR>\"] = \"close_keep_filter\",\n            [\"\u003CC-CR>\"] = \"close_clear_filter\",\n            [\"\u003Cesc>\"] = \"close\",\n          }\n        }\n        -- [\"\u003Cesc>\"] = \"noop\", -- if you want to use normal mode\n        -- [\"key\"] = function(state, scroll_padding) ... end,\n      },\n    },\n\n    commands = {}, -- Add a custom command or override a global one using the same function name\n  },\n  buffers = {\n    follow_current_file = {\n      enabled = true, -- This will find and focus the file in the active buffer every time\n      --              -- the current file is changed while the tree is open.\n      leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal`\n    },\n    group_empty_dirs = true, -- when true, empty folders will be grouped together\n    show_unloaded = true,\n    window = {\n      mappings = {\n        [\"d\"] = \"buffer_delete\",\n        [\"bd\"] = \"buffer_delete\",\n        [\"\u003Cbs>\"] = \"navigate_up\",\n        [\".\"] = \"set_root\",\n        [\"o\"] = {\n          \"show_help\",\n          nowait = false,\n          config = { title = \"Order by\", prefix_key = \"o\" },\n        },\n        [\"oc\"] = { \"order_by_created\", nowait = false },\n        [\"od\"] = { \"order_by_diagnostics\", nowait = false },\n        [\"om\"] = { \"order_by_modified\", nowait = false },\n        [\"on\"] = { \"order_by_name\", nowait = false },\n        [\"os\"] = { \"order_by_size\", nowait = false },\n        [\"ot\"] = { \"order_by_type\", nowait = false },\n      },\n    },\n  },\n  git_status = {\n    window = {\n      position = \"float\",\n      mappings = {\n        [\"A\"] = \"git_add_all\",\n        [\"gu\"] = \"git_unstage_file\",\n        [\"gU\"] = \"git_undo_last_commit\",\n        [\"ga\"] = \"git_add_file\",\n        [\"gt\"] = \"git_toggle_file_stage\",\n        [\"gr\"] = \"git_revert_file\",\n        [\"gc\"] = \"git_commit\",\n        [\"gp\"] = \"git_push\",\n        [\"gg\"] = \"git_commit_and_push\",\n        [\"o\"] = {\n          \"show_help\",\n          nowait = false,\n          config = { title = \"Order by\", prefix_key = \"o\" },\n        },\n        [\"oc\"] = { \"order_by_created\", nowait = false },\n        [\"od\"] = { \"order_by_diagnostics\", nowait = false },\n        [\"om\"] = { \"order_by_modified\", nowait = false },\n        [\"on\"] = { \"order_by_name\", nowait = false },\n        [\"os\"] = { \"order_by_size\", nowait = false },\n        [\"ot\"] = { \"order_by_type\", nowait = false },\n      },\n    },\n  },\n})\n```\n\n\u003C\u002Fdetails>\n\nSee `:h neo-tree` for full documentation. You can also preview that online at\n[doc\u002Fneo-tree.txt](doc\u002Fneo-tree.txt), although it's best viewed within Neovim.\n\nTo see all of the default config options with commentary, you can view it online\nat [lua\u002Fneo-tree\u002Fdefaults.lua](lua\u002Fneo-tree\u002Fdefaults.lua). You can also paste it\ninto a buffer after installing Neo-tree by running:\n\n```\n:lua require(\"neo-tree\").paste_default_config()\n```\n\n\u003Cdetails>\n  \u003Csummary>Diagnostics icons:\u003C\u002Fsummary>\n\nIf you want icons for diagnostic errors, you'll need to define them somewhere.\nIn Neovim v0.10+, you can configure them in vim.diagnostic.config(), like:\n\n```lua\nvim.diagnostic.config({\n  signs = {\n    text = {\n      [vim.diagnostic.severity.ERROR] = '',\n      [vim.diagnostic.severity.WARN] = '',\n      [vim.diagnostic.severity.INFO] = '',\n      [vim.diagnostic.severity.HINT] = '󰌵',\n    },\n  }\n})\n```\n\nFor older versions of Neovim:\n\n```lua\nvim.fn.sign_define(\"DiagnosticSignError\", { text = \" \", texthl = \"DiagnosticSignError\" })\nvim.fn.sign_define(\"DiagnosticSignWarn\", { text = \" \", texthl = \"DiagnosticSignWarn\" })\nvim.fn.sign_define(\"DiagnosticSignInfo\", { text = \" \", texthl = \"DiagnosticSignInfo\" })\nvim.fn.sign_define(\"DiagnosticSignHint\", { text = \"󰌵\", texthl = \"DiagnosticSignHint\" })\n```\n\n\u003C\u002Fdetails>\n\n## The `:Neotree` Command\n\nThe single `:Neotree` command accepts a range of arguments that give you full\ncontrol over the details of what and where it will show. For example, the following\ncommand will open a file browser on the right hand side, \"revealing\" the currently\nactive file:\n\n```\n:Neotree filesystem reveal right\n```\n\nArguments can be specified as either a key=value pair or just as the value. The\nkey=value form is more verbose but may help with clarity. For example, the command\nabove can also be specified as:\n\n```\n:Neotree source=filesystem reveal=true position=right\n```\n\nAll arguments are optional and can be specified in any order. If you issue the command\nwithout any arguments, it will use default values for everything. For example:\n\n```\n:Neotree\n```\n\nwill open the filesystem source on the left hand side and focus it, if you are using\nthe default config.\n\n### Tab Completion\n\nNeotree supports tab completion for all arguments. Once a given argument has a value,\nit will stop suggesting those completions. It will also offer completions for paths.\nThe simplest way to disambiguate a path from another type of argument is to start\nthem with `\u002F` or `.\u002F`.\n\n### Arguments\n\nHere is the full list of arguments you can use:\n\n#### `action`\n\nWhat to do. Can be one of:\n\n| Option | Description |\n|--------|-------------|\n| focus | Show and\u002For switch focus to the specified Neotree window. DEFAULT |\n| show  | Show the window, but keep focus on your current window. |\n| close | Close the window(s) specified. Can be combined with \"position\" and\u002For \"source\" to specify which window(s) to close. |\n\n#### `source`\n\nWhat to show. Can be one of:\n\n| Option | Description |\n|--------|-------------|\n| filesystem | Show a file browser. DEFAULT |\n| buffers    | Show a list of currently open buffers. |\n| git_status | Show the output of `git status` in a tree layout. |\n| last       | Equivalent to the last source used |\n\n#### `position`\n\nWhere to show it, can be one of:\n\n| Option  | Description |\n|---------|-------------|\n| left     | Open as left hand sidebar. DEFAULT |\n| right    | Open as right hand sidebar. |\n| top      | Open as top window. |\n| bottom   | Open as bottom window. |\n| float    | Open as floating window. |\n| current  | Open within the current window, like netrw or vinegar would. |\n\n#### `toggle`\n\nThis is a boolean flag. Adding this means that the window will be closed if it\nis already open.\n\n#### `dir`\n\nThe directory to set as the root\u002Fcwd of the specified window. If you include a\ndirectory as one of the arguments, it will be assumed to be this option, you\ndon't need the full dir=\u002Fpath. You may use any value that can be passed to the\n'expand' function, such as `%:p:h:h` to specify two directories up from the\ncurrent file. For example:\n\n```\n:Neotree .\u002Frelative\u002Fpath\n:Neotree \u002Fhome\u002Fuser\u002Frelative\u002Fpath\n:Neotree dir=\u002Fhome\u002Fuser\u002Frelative\u002Fpath\n:Neotree position=current dir=relative\u002Fpath\n```\n\n#### `git_base`\n\nThe base that is used to calculate the git status for each dir\u002Ffile.\nBy default it uses `HEAD`, so it shows all changes that are not yet committed.\nYou can for example work on a feature branch, and set it to `main`. It will\nshow all changes that happened on the feature branch and main since you\nbranched off.\n\nAny git ref, commit, tag, or sha will work.\n\n```\n:Neotree main\n:Neotree v1.0\n:Neotree git_base=8fe34be\n:Neotree git_base=HEAD\n```\n\n#### `reveal`\n\nThis is a boolean flag. Adding this will make Neotree automatically find and\nfocus the current file when it opens.\n\n#### `reveal_file`\n\nA path to a file to reveal. This supersedes the \"reveal\" flag so there is no\nneed to specify both. Use this if you want to reveal something other than the\ncurrent file. If you include a path to a file as one of the arguments, it will\nbe assumed to be this option. Like \"dir\", you can pass any value that can be\npassed to the 'expand' function. For example:\n\n```\n:Neotree reveal_file=\u002Fhome\u002Fuser\u002Fmy\u002Ffile.text\n:Neotree position=current dir=%:p:h:h reveal_file=%:p\n:Neotree current %:p:h:h %:p\n```\n\nOne neat trick you can do with this is to open a Neotree window which is\nfocused on the file under the cursor using the `\u003Ccfile>` keyword:\n\n```\nnnoremap gd :Neotree float reveal_file=\u003Ccfile> reveal_force_cwd\u003Ccr>\n```\n\n#### `reveal_force_cwd`\n\nThis is a boolean flag. Normally, if you use one of the reveal options and the\ngiven file is not within the current working directory, you will be asked if you\nwant to change the current working directory. If you include this flag, it will\nautomatically change the directory without prompting. This option implies\n\"reveal\", so you do not need to specify both.\n\n#### `selector`\n\nThis is a boolean flag. When you specifically set this to false (`selector=false`)\nneo-tree will disable the [source selector](#source-selector) for that neo-tree\ninstance. Otherwise, the source selector will depend on what you specified in\nthe configuration (`config.source_selector.{winbar,statusline}`).\n\nSee `:h neo-tree-commands` for details and a full listing of available arguments.\n\n### File Nesting\n\nSee `:h neo-tree-file-nesting` for more details about file nesting.\n\n### Netrw Hijack\n\n```\n:edit .\n:[v]split .\n```\n\nIf `\"filesystem.window.position\"` is set to `\"current\"`, or if you have specified\n`filesystem.hijack_netrw_behavior = \"open_current\"`, then any command\nthat would open a directory will open neo-tree in the specified window.\n\n## Sources\n\nNeo-tree is built on the idea of supporting various sources. Sources are\nbasically interface implementations whose job it is to provide a list of\nhierarchical items to be rendered, along with commands that are appropriate to\nthose items.\n\n### filesystem\nThe default source is `filesystem`, which displays your files and folders. This\nis the default source in commands when none is specified.\n\nThis source can be used to:\n- Browse the filesystem\n- Control the current working directory of nvim\n- Add\u002FCopy\u002FDelete\u002FMove\u002FRename files and directories\n- Search the filesystem\n- Monitor git status and lsp diagnostics for the current working directory\n\n### buffers\n![Neo-tree buffers](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fraw\u002Fmain\u002Fimages\u002FNeo-tree-buffers.png)\n\nAnother available source is `buffers`, which displays your open buffers. This is\nthe same list you would see from `:ls`. To show with the `buffers` list, use:\n\n```\n:Neotree buffers\n```\n\n### git_status\nThis view take the results of the `git status` command and display them in a\ntree. It includes commands for adding, unstaging, reverting, and committing.\n\nThe screenshot below shows the result of `:Neotree float git_status` while the\nfilesystem is open in a sidebar:\n\n![Neo-tree git_status](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fraw\u002Fmain\u002Fimages\u002FNeo-tree-git_status.png)\n\nYou can specify a different git base here as well. But be aware that it is not\npossible to unstage \u002F revert a file that is already committed.\n\n```\n:Neotree float git_status git_base=main\n```\n\n### document_symbols\n\n![Neo-tree document_symbols](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fraw\u002Fmain\u002Fimages\u002Fneo-tree-document-symbols.png)\nThe document_symbols source lists the symbols in the current document obtained\nby the LSP request \"textDocument\u002FdocumentSymbols\". It currently supports the\nfollowing features:\n- [x] UI:\n\t- [x] Display all symbols in the current file with symbol kinds\n\t- [x] Symbols nesting\n\t- [x] Configurable kinds' name and icon\n\t- [x] Auto-refresh symbol list\n        - [x] Follow cursor\n- [ ] Commands\n\t- [x] Jump to symbols, open symbol in split,... (`open_split` and friends)\n\t- [x] Rename symbols (`rename`)\n\t- [x] Preview symbol (`preview` and friends)\n\t- [ ] Hover docs\n\t- [ ] Call hierarchy\n- [x] LSP\n   - [x] LSP Support\n   - [x] LSP server selection (ignore, allow_only, use first, use all, etc.)\n- [ ] CoC Support\n\nSee #879 for the tracking issue of these features.\n\nThis source is currently experimental, so in order to use it, you need to first\nadd `\"document_symbols\"` to `config.sources` and open it with the command\n```\n:Neotree document_symbols\n```\n\n### External Sources\n\nThere are more sources available as extensions that are managed outside of this\nrepository. See the\n[wiki](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fneo-tree.nvim\u002Fwiki\u002FExternal-Sources) for\nmore information.\n\n### Source Selector\n\n![Neo-tree source\nselector](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fresources\u002Fraw\u002Fmain\u002Fimages\u002FNeo-tree-source-selector.png)\n\nYou can enable a clickable source selector in either the winbar (requires neovim\n0.8+) or the statusline. To do so, set one of these options to `true`:\n\n```lua\n    require(\"neo-tree\").setup({\n        source_selector = {\n            winbar = false,\n            statusline = false\n        }\n    })\n```\n\nThere are many configuration options to change the style of these tabs.\nSee [lua\u002Fneo-tree\u002Fdefaults.lua](lua\u002Fneo-tree\u002Fdefaults.lua) for details.\n\n### Preview Mode\n\n`:h neo-tree-preview-mode`\n\nPreview mode will temporarily show whatever file the cursor is on without\nswitching focus from the Neo-tree window. By default, files will be previewed\nin a new floating window. This can also be configured to automatically choose\nan existing split by configuring the command like this:\n\n```lua\nrequire(\"neo-tree\").setup({\n  window = {\n    mappings = {\n      [\"P\"] = {\n        \"toggle_preview\",\n        config = {\n          use_float = false,\n          -- use_image_nvim = true,\n          -- use_snacks_image = true,\n          -- title = 'Neo-tree Preview',\n        },\n      },\n    }\n  }\n})\n```\n\nAnything that causes Neo-tree to lose focus will end preview mode. When\n`use_float = false`, the window that was taken over by preview mode will revert\nback to whatever was shown in that window before preview mode began.\n\nYou can choose a custom title for the floating window by setting the `title`\noption in its config.\n\nIf you want to work with the floating preview mode window in autocmds or other\ncustom code, the window will have the `neo-tree-preview` filetype.\n\nWhen preview mode is not using floats, the window will have the window local\nvariable `neo_tree_preview` set to `1` to indicate that it is being used as a\npreview window. You can refer to this in statusline and winbar configs to mark a\nwindow as being used as a preview.\n\n#### Image Support in Preview Mode\n\nIf you have\n[folke\u002Fsnacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim\u002Fblob\u002Fmain\u002Fdocs\u002Fimage.md)\nor [3rd\u002Fimage.nvim](https:\u002F\u002Fgithub.com\u002F3rd\u002Fimage.nvim) installed, preview mode\nsupports image rendering by default using kitty graphics protocol or ueberzug\n([Video](https:\u002F\u002Fuser-images.githubusercontent.com\u002F41065736\u002F277180763-b7152637-f310-43a5-b8c3-4bcba135629d.mp4)).\n\nHowever, if you do not want this feature, you can disable it by setting\n`use_snacks_image = false` or `use_image_nvim = false` in the mappings config\nmentioned above.\n\n## Configuration and Customization\n\nThis is designed to be flexible. The way that is achieved is by making\neverything a function, or a string that identifies a built-in function. All of\nthe built-in functions can be replaced with your own implementation, or you can\nadd new ones.\n\nEach node in the tree is created from the renderer specified for the given node\ntype, and each renderer is a list of component configs to be rendered in order.\nEach component is a function, either built-in or specified in your config. Those\nfunctions simply return the text and highlight group for the component.\n\nAdditionally, there is an events system that you can hook into. If you want to\nshow some new data point related to your files, gather it in the `before_render`\nevent, create a component to display it, and reference that component in the\nrenderer for the `file` and\u002For `directory` type.\n\nDetails on how to configure everything is in the help file at `:h\nneo-tree-configuration` or online at\n[neo-tree.txt](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fneo-tree.nvim\u002Fblob\u002Fmain\u002Fdoc\u002Fneo-tree.txt)\n\nRecipes for customizations can be found on the\n[wiki](https:\u002F\u002Fgithub.com\u002Fnvim-neo-tree\u002Fneo-tree.nvim\u002Fwiki\u002FRecipes). Recipes\ninclude things like adding a component to show the\n[Harpoon](https:\u002F\u002Fgithub.com\u002FThePrimeagen\u002Fharpoon) index for files, or\nresponding to the `\"file_opened\"` event to auto clear the search when you open a\nfile.\n\n## Why?\n\nThere are many tree plugins for (Neo)vim, so why make another one? Well, I\nwanted something that was:\n\n1. Easy to maintain and enhance.\n2. Stable.\n3. Easy to customize.\n\n### Easy to maintain and enhance\n\nThis plugin is designed to grow and be flexible. This is accomplished by making\nthe code as decoupled and functional as possible. Hopefully new contributors\nwill find it easy to work with.\n\nOne big difference between this plugin and the ones that came before it, which\nis also what finally pushed me over the edge into making a new plugin, is that\nwe now have libraries to build upon that did not exist when other tree plugins\nwere created. Most notably, [nui.nvim](https:\u002F\u002Fgithub.com\u002FMunifTanjim\u002Fnui.nvim)\nand [plenary.nvm](https:\u002F\u002Fgithub.com\u002Fnvim-lua\u002Fplenary.nvim). Building upon\nshared libraries will go a long way in making neo-tree easy to maintain.\n\n### Stable\n\nThis project will have releases and release tags that follow a simplified\nSemantic Versioning scheme. The quickstart instructions will always refer to the\nlatest stable major version. Following the **main** branch is for contributors\nand those that always want bleeding edge. There will be branches for **v1.x**,\n**v2.x**, etc which will receive updates after a short testing period in\n**main**. You should be safe to follow those branches and be sure your tree\nwon't break in an update. There will also be tags for each release pushed to\nthose branches named **v1.1**, **v1.2**, etc. If stability is critical to you,\nor a bug accidentally makes it into **v3.x**, you can use those tags instead.\nIt's possible we may backport bug fixes to those tags, but no guarantees on\nthat.\n\nThere will never be a breaking change within a major version (1.x, 2.x, etc.) If\na breaking change is needed, there will be depracation warnings in the prior\nmajor version, and the breaking change will happen in the next major version.\n\n### Easy to Customize\n\nNeo-tree follows in the spirit of plugins like\n[lualine.nvim](https:\u002F\u002Fgithub.com\u002Fnvim-lualine\u002Flualine.nvim) and\n[nvim-cokeline](https:\u002F\u002Fgithub.com\u002Fnoib3\u002Fnvim-cokeline). Everything will be\nconfigurable and take either strings, tables, or functions. You can take sane\ndefaults or build your tree items from scratch. There should be the ability to\nadd any features you can think of through existing hooks in the setup function.\n\n## What is a Breaking Change?\n\nAs of v1.30, a breaking change is defined as anything that _changes_ existing:\n\n- vim commands (`:Neotree`)\n- configuration options that are passed into the `setup()` function\n- `NeoTree*` highlight groups\n- lua functions exported in the following modules that are not prefixed with\n`_`:\n* `neo-tree`\n* `neo-tree.events`\n* `neo-tree.sources.manager`\n* `neo-tree.sources.*` (init.lua files)\n* `neo-tree.sources.*.commands`\n* `neo-tree.ui.renderer`\n* `neo-tree.utils`\n\nIf there are other functions you would like to use that are not yet considered\npart of the public API, please open an issue so we can discuss it.\n\n## Contributions\n\nContributions are encouraged. Please see [CONTRIBUTING](CONTRIBUTING.md) for\nmore details.\n\n## Acknowledgements\n\n### Maintainers\n\nFirst and foremost, this project is a community endeavor and would not survive\nwithout the constant stream of features and bug fixes that comes from that\ncommunity. There have been many valued contributors, but a few have stepped up\nto become maintainers that generously donate their time to guide the project,\nhelp out others, and manage the issues. The current list of maintainers are:\n\n- @pynappo\n\n### Past maintainers:\n\n(in alphabetical order)\n\n- @cseickel\n- @miversen33\n- @nhat-vo\n- @pysan3\n\n### Other Projects\n\nThe design is heavily inspired by these excellent plugins:\n- [lualine.nvim](https:\u002F\u002Fgithub.com\u002Fnvim-lualine\u002Flualine.nvim)\n- [nvim-cokeline](https:\u002F\u002Fgithub.com\u002Fnoib3\u002Fnvim-cokeline)\n\nEverything I know about writing a tree control in lua, I learned from:\n- [nvim-tree.lua](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-tree.lua)\n\n\u003C!-- vim: set textwidth=80 shiftwidth=2: -->\n\n","Neo-tree.nvim 是一个用于 Neovim 的插件，旨在帮助用户以多种风格浏览文件系统及其他树状结构。其核心功能包括支持侧边栏、浮动窗口及类似 netrw 的分割视图等多种展示方式，并且具备智能跟随当前文件、跨多个树同步剪贴板等特性。技术上，该插件使用 Lua 语言开发，依赖于 nui.nvim 库来构建用户界面。特别地，Neo-tree 注重用户体验的细节优化，如自动刷新、保持焦点在正确节点上等功能，确保了操作流畅与直观。适用于需要高效文件管理和导航的 Neovim 用户，尤其适合那些追求稳定性和易用性的开发者。",2,"2026-06-11 03:33:00","high_star"]