Full Code of nvim-tree/nvim-tree.lua for AI

master dfeeb12aaae3 cached
151 files
681.9 KB
183.5k tokens
1 requests
Download .txt
Showing preview only (724K chars total). Download the full file or copy to clipboard to get everything.
Repository: nvim-tree/nvim-tree.lua
Branch: master
Commit: dfeeb12aaae3
Files: 151
Total size: 681.9 KB

Directory structure:
gitextract_y381tt17/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── feature_request.md
│   │   └── nvt-min.lua
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── luarocks-release.yml
│       ├── release-please.yml
│       └── semantic-pr-subject.yml
├── .gitignore
├── .hooks/
│   └── pre-commit.sh
├── .luacheckrc
├── .luarc.json
├── .release-please-manifest.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── doc/
│   ├── .gitignore
│   └── nvim-tree-lua.txt
├── lua/
│   ├── nvim-tree/
│   │   ├── _meta/
│   │   │   ├── api/
│   │   │   │   ├── appearance.lua
│   │   │   │   ├── commands.lua
│   │   │   │   ├── config.lua
│   │   │   │   ├── decorator.lua
│   │   │   │   ├── decorator_example.lua
│   │   │   │   ├── deprecated.lua
│   │   │   │   ├── events.lua
│   │   │   │   ├── filter.lua
│   │   │   │   ├── fs.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── map.lua
│   │   │   │   ├── marks.lua
│   │   │   │   ├── node.lua
│   │   │   │   └── tree.lua
│   │   │   ├── classes.lua
│   │   │   ├── config/
│   │   │   │   ├── actions.lua
│   │   │   │   ├── bookmarks.lua
│   │   │   │   ├── default.lua
│   │   │   │   ├── diagnostics.lua
│   │   │   │   ├── experimental.lua
│   │   │   │   ├── filesystem_watchers.lua
│   │   │   │   ├── filters.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── help.lua
│   │   │   │   ├── hijack_directories.lua
│   │   │   │   ├── live_filter.lua
│   │   │   │   ├── log.lua
│   │   │   │   ├── modified.lua
│   │   │   │   ├── notify.lua
│   │   │   │   ├── renderer.lua
│   │   │   │   ├── sort.lua
│   │   │   │   ├── system_open.lua
│   │   │   │   ├── tab.lua
│   │   │   │   ├── trash.lua
│   │   │   │   ├── ui.lua
│   │   │   │   ├── update_focused_file.lua
│   │   │   │   └── view.lua
│   │   │   └── config.lua
│   │   ├── actions/
│   │   │   ├── finders/
│   │   │   │   ├── find-file.lua
│   │   │   │   ├── init.lua
│   │   │   │   └── search-node.lua
│   │   │   ├── fs/
│   │   │   │   ├── clipboard.lua
│   │   │   │   ├── create-file.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── remove-file.lua
│   │   │   │   ├── rename-file.lua
│   │   │   │   └── trash.lua
│   │   │   ├── init.lua
│   │   │   ├── moves/
│   │   │   │   ├── init.lua
│   │   │   │   ├── item.lua
│   │   │   │   ├── parent.lua
│   │   │   │   └── sibling.lua
│   │   │   ├── node/
│   │   │   │   ├── buffer.lua
│   │   │   │   ├── file-popup.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── open-file.lua
│   │   │   │   ├── run-command.lua
│   │   │   │   └── system-open.lua
│   │   │   └── tree/
│   │   │       ├── change-dir.lua
│   │   │       ├── collapse.lua
│   │   │       ├── find-file.lua
│   │   │       ├── init.lua
│   │   │       ├── open.lua
│   │   │       ├── resize.lua
│   │   │       └── toggle.lua
│   │   ├── api/
│   │   │   └── impl.lua
│   │   ├── api.lua
│   │   ├── appearance/
│   │   │   ├── hi-test.lua
│   │   │   └── init.lua
│   │   ├── buffers.lua
│   │   ├── classic.lua
│   │   ├── commands.lua
│   │   ├── config.lua
│   │   ├── core.lua
│   │   ├── diagnostics.lua
│   │   ├── enum.lua
│   │   ├── events.lua
│   │   ├── explorer/
│   │   │   ├── filters.lua
│   │   │   ├── init.lua
│   │   │   ├── live-filter.lua
│   │   │   ├── sorter.lua
│   │   │   └── watch.lua
│   │   ├── git/
│   │   │   ├── init.lua
│   │   │   ├── runner.lua
│   │   │   └── utils.lua
│   │   ├── help.lua
│   │   ├── iterators/
│   │   │   └── node-iterator.lua
│   │   ├── keymap.lua
│   │   ├── legacy.lua
│   │   ├── lib.lua
│   │   ├── log.lua
│   │   ├── marks/
│   │   │   └── init.lua
│   │   ├── node/
│   │   │   ├── directory-link.lua
│   │   │   ├── directory.lua
│   │   │   ├── factory.lua
│   │   │   ├── file-link.lua
│   │   │   ├── file.lua
│   │   │   ├── init.lua
│   │   │   ├── link.lua
│   │   │   └── root.lua
│   │   ├── notify.lua
│   │   ├── renderer/
│   │   │   ├── builder.lua
│   │   │   ├── components/
│   │   │   │   ├── devicons.lua
│   │   │   │   ├── full-name.lua
│   │   │   │   ├── init.lua
│   │   │   │   └── padding.lua
│   │   │   ├── decorator/
│   │   │   │   ├── bookmarks.lua
│   │   │   │   ├── builtin.lua
│   │   │   │   ├── copied.lua
│   │   │   │   ├── cut.lua
│   │   │   │   ├── diagnostics.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── hidden.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── modified.lua
│   │   │   │   └── opened.lua
│   │   │   └── init.lua
│   │   ├── utils.lua
│   │   ├── view.lua
│   │   └── watcher.lua
│   └── nvim-tree.lua
├── plugin/
│   └── nvim-tree.lua
├── release-please-config.json
└── scripts/
    ├── doc-comments.sh
    ├── help-defaults.sh
    ├── luals-check.sh
    ├── setup-hooks.sh
    ├── vimdoc.sh
    └── vimdoc_config.lua

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
insert_final_newline = true
end_of_line = lf

[nvim-tree-lua.txt]
max_line_length = 78

# keep these in sync with .luarc.json
#   .editorconfig is used within nvim, overriding .luarc.json
#   .luarc.json is used by style check
[*.lua]
indent_style = space
max_line_length = 140
indent_size = 2

# EmmyLuaCodeStyle specific, see
# https://github.com/CppCXY/EmmyLuaCodeStyle/blob/master/lua.template.editorconfig
continuation_indent = 2
quote_style = double
call_arg_parentheses = always
space_before_closure_open_parenthesis = false
align_continuous_similar_call_args = true


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: kyazdani42


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report
description: Report a problem with nvim-tree
labels: [bug]
body:
  - type: markdown
    attributes:
      value: |
        Is this a question?
        * Please start a new [Q&A discussion](https://github.com/nvim-tree/nvim-tree.lua/discussions/new) instead of raising a bug.

        Before reporting:
        * search [existing issues](https://github.com/nvim-tree/nvim-tree.lua/issues)
        * ensure that nvim-tree is updated to the latest version

        If you are experiencing performance issues, please [enable profiling](https://github.com/nvim-tree/nvim-tree.lua#performance-issues) and attach the logs.

        Please note that nvim-tree team members do not have access to nor expertise with Windows. You will need to be an active participant during resolution.
  - type: textarea
    attributes:
      label: "Description"
      description: "A short description of the problem you are reporting."
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Neovim version"
      description: "Output of `nvim --version`. Please see nvim-tree.lua [minimum required version](https://github.com/nvim-tree/nvim-tree.lua#notice)."
      placeholder: |
        NVIM v0.6.1
        Build type&#58 Release
        LuaJIT 2.1.0-beta3
      render: text
    validations:
      required: true
  - type: input
    attributes:
      label: "Operating system and version"
      placeholder: "Linux 5.16.11-arch1-1, macOS 11.5, Windows 10"
    validations:
      required: true
  - type: input
    attributes:
      label: "Windows variant"
      placeholder: "WSL, PowerShell, cygwin, msys"
    validations:
      required: false
  - type: input
    attributes:
      label: "nvim-tree version"
      description: "`cd <your-package-directory>/nvim-tree.lua ; git log --format='%h' -n 1`"
      placeholder: |
        nvim-tree branch, commit or tag number
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Clean room replication"
      description: "Minimal(!) configuration necessary to reproduce the issue.

        If not provided it is very unlikely that the nvim-tree team will be able to address your issue.

        See [wiki: Clean Room Replication](https://github.com/nvim-tree/nvim-tree.lua/wiki/Troubleshooting#clean-room-replication) for instructions and paste the contents of your `/tmp/nvt-min.lua` here.

        Please do NOT post a configuration that uses other plugin managers such as lazy, see [wiki: Lazy Loading](https://github.com/nvim-tree/nvim-tree.lua/wiki/Installation#lazy-loading)"
      render: lua
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Steps to reproduce"
      description: "Steps to reproduce using the minimal config provided below."
      placeholder: |
        1. nvim -nu /tmp/nvt-min.lua
        2. :NvimTreeOpen
        3. ...
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Expected behavior"
      description: "A description of the behavior you expected:"
  - type: textarea
    attributes:
      label: "Actual behavior"
      description: "Observed behavior (may optionally include images, videos or a screencast)."
 


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature request
assignees: ''

---
**Is this a question?**
Please start a new [Q&A discussion](https://github.com/nvim-tree/nvim-tree.lua/discussions/new) instead of raising a feature request.

**Can this functionality be implemented utilising API?**
nvim-tree exposes extensive API (see `:h nvim-tree-api`). Can it be used to achieve your goal? Is there a missing API that would make it possible?
Given stable status of nvim-tree it's preferred to add new API than new functionality.

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/nvt-min.lua
================================================
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

vim.cmd([[set runtimepath=$VIMRUNTIME]])
vim.cmd([[set packpath=/tmp/nvt-min/site]])
local package_root = "/tmp/nvt-min/site/pack"
local install_path = package_root .. "/packer/start/packer.nvim"
local function load_plugins()
  require("packer").startup({
    {
      "wbthomason/packer.nvim",
      "nvim-tree/nvim-tree.lua",
      "nvim-tree/nvim-web-devicons",
      -- ADD PLUGINS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
    },
    config = {
      package_root = package_root,
      compile_path = install_path .. "/plugin/packer_compiled.lua",
      display = { non_interactive = true },
    },
  })
end
if vim.fn.isdirectory(install_path) == 0 then
  print("Installing nvim-tree and dependencies.")
  vim.fn.system({ "git", "clone", "--depth=1", "https://github.com/wbthomason/packer.nvim", install_path })
end
load_plugins()
require("packer").sync()
vim.cmd([[autocmd User PackerComplete ++once echo "Ready!" | lua setup()]])
vim.opt.termguicolors = true
vim.opt.cursorline = true

-- MODIFY NVIM-TREE SETTINGS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
_G.setup = function()
  require("nvim-tree").setup({})
end

-- UNCOMMENT this block for diagnostics issues, substituting pattern and cmd as appropriate.
-- Requires diagnostics.enable = true in setup.
--[[
vim.api.nvim_create_autocmd("FileType", {
  pattern = "lua",
  callback = function()
    vim.lsp.start {
      name = "my-luals",
      cmd = { "lua-language-server" },
      root_dir = vim.loop.cwd(),
    }
  end,
})
]]


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"
    reviewers:
      - "gegoune"


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  pull_request:
  push:
    branches: [master]
  workflow_dispatch:

permissions:
  contents: read

jobs:
  lint:
    runs-on: ubuntu-latest

    concurrency:
      group: ${{ github.workflow }}-${{ matrix.lua_version }}-${{ github.head_ref || github.ref_name }}
      cancel-in-progress: true

    strategy:
      matrix:
        lua_version: [ 5.1 ]
        luacheck_version: [ 1.2.0 ]

    steps:
      - name: checkout
        uses: actions/checkout@v6

      - name: install lua ${{ matrix.lua_version }}
        uses: leafo/gh-actions-lua@v12
        with:
          luaVersion: ${{ matrix.lua_version }}

      - name: install luarocks
        uses: leafo/gh-actions-luarocks@v6

      - name: install luacheck ${{ matrix.luacheck_version }}
        run: luarocks install luacheck ${{ matrix.luacheck_version }}

      - run: make lint

  check:
    runs-on: ubuntu-latest

    concurrency:
      group: ${{ github.workflow }}-${{ matrix.nvim_version }}-${{ matrix.luals_version }}-${{ matrix.emmyluacodestyle_version }}-${{ github.head_ref || github.ref_name }}
      cancel-in-progress: true

    strategy:
      matrix:
        nvim_version: [ stable, nightly ]
        luals_version: [ 3.15.0 ]
        emmyluacodestyle_version: [ 1.6.0 ]

    env:
      VIMRUNTIME: /home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime
      DIR_NVIM_SRC: /home/runner/src/neovim-${{ matrix.nvim_version }}

    steps:
      - name: checkout
        uses: actions/checkout@v6

      - name: install nvim ${{ matrix.nvim_version }}
        uses: rhysd/action-setup-vim@v1
        with:
          neovim: true
          version: ${{ matrix.nvim_version }}

      - name: install lua-language-server ${{ matrix.luals_version }}
        run: |
          mkdir -p luals
          curl -L "https://github.com/LuaLS/lua-language-server/releases/download/${{ matrix.luals_version }}/lua-language-server-${{ matrix.luals_version }}-linux-x64.tar.gz" | tar zx --directory luals
          echo "luals/bin" >> "$GITHUB_PATH"

      - name: install EmmyLuaCodeStyle ${{ matrix.emmyluacodestyle_version }}
        run: |
          mkdir -p EmmyLuaCodeStyle
          curl -L "https://github.com/CppCXY/EmmyLuaCodeStyle/releases/download/${{ matrix.emmyluacodestyle_version }}/linux-x64.tar.gz" | tar zx --directory EmmyLuaCodeStyle
          echo "EmmyLuaCodeStyle/linux-x64/bin" >> "$GITHUB_PATH"

      - run: make check

      - run: make style

      - run: make style-doc

      - run: make format-check

      - name: build Nvim from source
        run: |
          mkdir -p "${DIR_NVIM_SRC}"
          curl -L "https://github.com/neovim/neovim/archive/refs/tags/${{ matrix.nvim_version }}.tar.gz" | tar zx --directory "${DIR_NVIM_SRC}/.."
          cd "${DIR_NVIM_SRC}"
          make doc
          make lintdoc

      - run: make help-check


================================================
FILE: .github/workflows/luarocks-release.yml
================================================
name: Luarocks Release

on:
  push:
    tags:
      - v*
  workflow_dispatch:

jobs:
  luarocks-upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: LuaRocks Upload
        uses: nvim-neorocks/luarocks-tag-release@v7
        env:
          LUAROCKS_API_KEY: ${{ secrets.LUAROCKS_API_KEY }}
        with:
          summary: A File Explorer For Neovim
          detailed_description: |
            Automatic updates

            File type icons

            Git integration

            Diagnostics integration - LSP and COC

            (Live) filtering

            Cut, copy, paste, rename, delete, create etc.

            Highly customisable

            Rich API
          license: "GPL-3.0"
          labels: neovim
          dependencies: |
            nvim-web-devicons


================================================
FILE: .github/workflows/release-please.yml
================================================
on:
  push:
    branches:
      - master
  workflow_dispatch:
concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true
name: release-please
permissions:
  contents: write
  pull-requests: write
jobs:
  release-please:
    runs-on: ubuntu-latest
    steps:
      - uses: googleapis/release-please-action@v4
        id: release
      - uses: actions/checkout@v6
      - name: tag major and minor versions
        if: ${{ steps.release.outputs.release_created }}
        run: |
          git config user.name github-actions[bot]
          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
          git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/googleapis/release-please-action.git"
          git tag -d       v${{ steps.release.outputs.major }}                                                                       || true
          git tag -d       v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}                                    || true
          git tag -d       v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }} || true
          git push origin :v${{ steps.release.outputs.major }}                                                                       || true
          git push origin :v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}                                    || true
          git push origin :v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }} || true
          git tag -a       v${{ steps.release.outputs.major }}                                                                       -m "Release v${{ steps.release.outputs.major }}"
          git tag -a       v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}                                    -m "Release v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}"
          git tag -a       v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }} -m "Release v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }}"
          git push origin  v${{ steps.release.outputs.major }}
          git push origin  v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}
          git push origin  v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }}


================================================
FILE: .github/workflows/semantic-pr-subject.yml
================================================
name: Semantic Pull Request Subject
on:
  pull_request:
    types:
      - opened
      - reopened
      - edited
      - synchronize
  workflow_dispatch:
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref }}
  cancel-in-progress: true
jobs:
  semantic-pr-subject:
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v6.1.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
/luals-out/
/luals/
# backup vim files
*~


================================================
FILE: .hooks/pre-commit.sh
================================================
#!/usr/bin/env sh

make


================================================
FILE: .luacheckrc
================================================
local M = {}

-- Don't report unused self arguments of methods.
M.self = false

M.ignore = {
  "631",  -- max_line_length
}

-- Global objects defined by the C code
M.globals = {
  "vim",
}

return M


================================================
FILE: .luarc.json
================================================
{
  "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json",
  "runtime.version": "Lua 5.1",
  "workspace": {
    "library": [
      "$VIMRUNTIME/lua/vim",
      "${3rd}/luv/library"
    ]
  },
  "format": {
    "defaultConfig": {
      "indent_style": "space",
      "max_line_length": "140",
      "indent_size": "2",
      "continuation_indent": "2",
      "quote_style": "double",
      "call_arg_parentheses": "always",
      "space_before_closure_open_parenthesis": "false",
      "align_continuous_similar_call_args": "true"
    }
  },
  "diagnostics": {
    "libraryFiles": "Disable",
    "globals": [],
    "neededFileStatus": {
      "ambiguity-1": "Any",
      "assign-type-mismatch": "Any",
      "await-in-sync": "Any",
      "cast-local-type": "Any",
      "cast-type-mismatch": "Any",
      "circle-doc-class": "Any",
      "close-non-object": "Any",
      "code-after-break": "Any",
      "codestyle-check": "None",
      "count-down-loop": "Any",
      "deprecated": "Any",
      "different-requires": "Any",
      "discard-returns": "Any",
      "doc-field-no-class": "Any",
      "duplicate-doc-alias": "Any",
      "duplicate-doc-field": "Any",
      "duplicate-doc-param": "Any",
      "duplicate-index": "Any",
      "duplicate-set-field": "Any",
      "empty-block": "Any",
      "global-element": "Any",
      "global-in-nil-env": "Any",
      "incomplete-signature-doc": "Any",
      "inject-field": "Any",
      "invisible": "Any",
      "lowercase-global": "Any",
      "missing-fields": "Any",
      "missing-global-doc": "Any",
      "missing-local-export-doc": "Any",
      "missing-parameter": "Any",
      "missing-return": "Any",
      "missing-return-value": "Any",
      "name-style-check": "None",
      "need-check-nil": "Any",
      "newfield-call": "Any",
      "newline-call": "Any",
      "no-unknown": "None",
      "not-yieldable": "Any",
      "param-type-mismatch": "Any",
      "redefined-local": "Any",
      "redundant-parameter": "Any",
      "redundant-return": "Any",
      "redundant-return-value": "Any",
      "redundant-value": "Any",
      "return-type-mismatch": "Any",
      "spell-check": "None",
      "trailing-space": "Any",
      "unbalanced-assignments": "Any",
      "undefined-doc-class": "Any",
      "undefined-doc-name": "Any",
      "undefined-doc-param": "Any",
      "undefined-env-child": "Any",
      "undefined-field": "None",
      "undefined-global": "Any",
      "unknown-cast-variable": "Any",
      "unknown-diag-code": "Any",
      "unknown-operator": "Any",
      "unreachable-code": "Any",
      "unused-function": "Any",
      "unused-label": "Any",
      "unused-local": "Any",
      "unused-vararg": "Any"
    }
  }
}


================================================
FILE: .release-please-manifest.json
================================================
{
  ".": "1.16.0"
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## [1.16.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.15.0...nvim-tree-v1.16.0) (2026-03-17)


### Features

* **#2994:** add visual mode operations: copy, cut, delete, trash, toggle bookmark ([#3268](https://github.com/nvim-tree/nvim-tree.lua/issues/3268)) ([9197f3e](https://github.com/nvim-tree/nvim-tree.lua/commit/9197f3ee3f0c9a754aab5b16500db6d7da5f68fd))
* add default &lt;Del&gt; mapping for api.fs.remove ([#3238](https://github.com/nvim-tree/nvim-tree.lua/issues/3238)) ([ca8d82f](https://github.com/nvim-tree/nvim-tree.lua/commit/ca8d82fff26cb12ced239713e3222f4a9dcd0da0))


### Bug Fixes

* **##3288:** restore single-item paste conflict prompts ([#3289](https://github.com/nvim-tree/nvim-tree.lua/issues/3289)) ([b3772ad](https://github.com/nvim-tree/nvim-tree.lua/commit/b3772adec8db61ba9098c5624a0823a77be3a23d))
* **#3178:** handle Windows paths in ignore_dirs and add .zig-cache to defaults ([#3261](https://github.com/nvim-tree/nvim-tree.lua/issues/3261)) ([5499299](https://github.com/nvim-tree/nvim-tree.lua/commit/5499299746b95c49ef4fc89b30c29a79b577881f))
* **#3187:** prevent closing the last non-floating window when deleting files ([#3282](https://github.com/nvim-tree/nvim-tree.lua/issues/3282)) ([018a078](https://github.com/nvim-tree/nvim-tree.lua/commit/018a078c1e149bcd0c4e65c92aabb8e12501d769))
* **#3198:** add filesystem_watchers.max_events to handle runaway filesystem events on PowerShell ([#3232](https://github.com/nvim-tree/nvim-tree.lua/issues/3232)) ([c07ce43](https://github.com/nvim-tree/nvim-tree.lua/commit/c07ce43527e5f0242121f4eb1feb7ac0ecea8275))
* **#3248:** bookmark filter shows contents of marked directories ([#3249](https://github.com/nvim-tree/nvim-tree.lua/issues/3249)) ([5757bcf](https://github.com/nvim-tree/nvim-tree.lua/commit/5757bcf0447d22d8f78826bc5c59b28da2824c3b))
* **#3251:** pass git.timeout to all vim.system git calls ([#3277](https://github.com/nvim-tree/nvim-tree.lua/issues/3277)) ([e49b0d9](https://github.com/nvim-tree/nvim-tree.lua/commit/e49b0d9bfa70989cf8b5abf5557f51e6e57f68d6))
* **#3265:** rename module api.health to api.appearance, to avoid :checkhealth detection ([#3266](https://github.com/nvim-tree/nvim-tree.lua/issues/3266)) ([1df1960](https://github.com/nvim-tree/nvim-tree.lua/commit/1df1960d0e3a26643a4100f64fa03b991b9f4b85))
* **#3267:** renderer.icons.*_placement 'right_align' at the right hand edge, not the right of the name ([#3270](https://github.com/nvim-tree/nvim-tree.lua/issues/3270)) ([fa3c458](https://github.com/nvim-tree/nvim-tree.lua/commit/fa3c45875f9b1f56ace57711c6f2ac22484ed956))
* **#3281:** fix a bug when a view width of -1 is returned from a function ([#3283](https://github.com/nvim-tree/nvim-tree.lua/issues/3283)) ([c988e28](https://github.com/nvim-tree/nvim-tree.lua/commit/c988e289428d9202b28ba27479647033c7dd2956))
* allow 0 (unlimited) filesystem_watchers.max_events which is the new default, except for windows at 1000 ([#3279](https://github.com/nvim-tree/nvim-tree.lua/issues/3279)) ([87594aa](https://github.com/nvim-tree/nvim-tree.lua/commit/87594aa7c8808701b418b285e9adf690acead201))
* increase filesystem_watchers.max_events from 100 to 1000 ([#3263](https://github.com/nvim-tree/nvim-tree.lua/issues/3263)) ([0f4d2d6](https://github.com/nvim-tree/nvim-tree.lua/commit/0f4d2d6998dc324d54d6adce94186bee43725afb))
* restore bookmark filter for marked directories ([5757bcf](https://github.com/nvim-tree/nvim-tree.lua/commit/5757bcf0447d22d8f78826bc5c59b28da2824c3b))


### Performance Improvements

* **#3284:** re-draw instead of refreshing the tree when a buffer is modified ([#3285](https://github.com/nvim-tree/nvim-tree.lua/issues/3285)) ([c8d8d51](https://github.com/nvim-tree/nvim-tree.lua/commit/c8d8d515c29f0f0b1a352e0d75616f74f42fc03b))

## [1.15.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.14.0...nvim-tree-v1.15.0) (2026-01-11)


### Features

* **#1826:** add diagnostics.diagnostic_opts: vim.diagnostic.Opts will override diagnostics.severity and diagnostics.icons ([#3190](https://github.com/nvim-tree/nvim-tree.lua/issues/3190)) ([fefa335](https://github.com/nvim-tree/nvim-tree.lua/commit/fefa335f1c8f690eb668a1efd18ee4fc6d64cd3e))
* **#1851:** add bookmarks.persist, default path: vim.fn.stdpath("data") .. "/nvim-tree-bookmarks.json", disabled by default ([#3033](https://github.com/nvim-tree/nvim-tree.lua/issues/3033)) ([c89215d](https://github.com/nvim-tree/nvim-tree.lua/commit/c89215d6a1107a3c0c134750be48657ba8e6a9aa))
* **#3213:** add `view.width.lines_excluded` option ([776a5cd](https://github.com/nvim-tree/nvim-tree.lua/commit/776a5cdfac948b490e06f1d1d22c4cb986e40699))
* **#3213:** add view.width.lines_excluded option ([#3214](https://github.com/nvim-tree/nvim-tree.lua/issues/3214)) ([776a5cd](https://github.com/nvim-tree/nvim-tree.lua/commit/776a5cdfac948b490e06f1d1d22c4cb986e40699))
* add NvimTreeFilter filetype ([64e2192](https://github.com/nvim-tree/nvim-tree.lua/commit/64e2192f5250796aa4a7f33c6ad888515af50640))
* load command definitions at nvim startup ([#3211](https://github.com/nvim-tree/nvim-tree.lua/issues/3211)) ([1eda256](https://github.com/nvim-tree/nvim-tree.lua/commit/1eda2569394f866360e61f590f1796877388cb8a))
* load command definitions in `plugin` directory ([1eda256](https://github.com/nvim-tree/nvim-tree.lua/commit/1eda2569394f866360e61f590f1796877388cb8a))
* set filter input filetype to NvimTreeFilter ([#3207](https://github.com/nvim-tree/nvim-tree.lua/issues/3207)) ([64e2192](https://github.com/nvim-tree/nvim-tree.lua/commit/64e2192f5250796aa4a7f33c6ad888515af50640))
* use `add_trailing` also for symlink destination ([81ede55](https://github.com/nvim-tree/nvim-tree.lua/commit/81ede55c47528ff7c81b2a498fbee61b298c4e2f))


### Bug Fixes

* **#3226:** set &swapfile=false before setting tree buffer name, avoiding any potential collisions with a swapfile ([#3227](https://github.com/nvim-tree/nvim-tree.lua/issues/3227)) ([8298117](https://github.com/nvim-tree/nvim-tree.lua/commit/8298117311a1f23f039c278e4e4977ab80a15e33))
* api.tree.change_root_to_node on a file now changes directory to parent as per documentation ([#3228](https://github.com/nvim-tree/nvim-tree.lua/issues/3228)) ([b8b44b6](https://github.com/nvim-tree/nvim-tree.lua/commit/b8b44b6a2494d086a9177251a119f9daec6cace8))
* correctly assign extmarks to lines when computing tree window width in `grow` when `nvim-tree.view.width.lines_excluded` contains "root" ([e66994d](https://github.com/nvim-tree/nvim-tree.lua/commit/e66994d40db2d57c91bf9aeaee8bf7ab8b1131f6))
* incorrect window width when right_align icons present ([#3239](https://github.com/nvim-tree/nvim-tree.lua/issues/3239)) ([e66994d](https://github.com/nvim-tree/nvim-tree.lua/commit/e66994d40db2d57c91bf9aeaee8bf7ab8b1131f6))
* prevent NvimTree to be alternate buffer when tab open ([#3205](https://github.com/nvim-tree/nvim-tree.lua/issues/3205)) ([e397756](https://github.com/nvim-tree/nvim-tree.lua/commit/e397756d2a79d74314ea4cd3efc41300e91c0ff0))
* renderer.add_trailing applies to symlink destination ([#3217](https://github.com/nvim-tree/nvim-tree.lua/issues/3217)) ([81ede55](https://github.com/nvim-tree/nvim-tree.lua/commit/81ede55c47528ff7c81b2a498fbee61b298c4e2f))


### Performance Improvements

* **commands:** defer module loading ([#3210](https://github.com/nvim-tree/nvim-tree.lua/issues/3210)) ([68c67ad](https://github.com/nvim-tree/nvim-tree.lua/commit/68c67adfabfd1ce923839570507ef2e81ab8a408))

## [1.14.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.13.0...nvim-tree-v1.14.0) (2025-08-12)


### Features

* **#2685:** highlight git new tracked with NvimTreeGitFileNewHL ([#3176](https://github.com/nvim-tree/nvim-tree.lua/issues/3176)) ([0a52012](https://github.com/nvim-tree/nvim-tree.lua/commit/0a52012d611f3c1492b8d2aba363fabf734de91d))
* **#2789:** add optional function expand_until to api.tree.expand_all and api.node.expand ([#3166](https://github.com/nvim-tree/nvim-tree.lua/issues/3166)) ([1b876db](https://github.com/nvim-tree/nvim-tree.lua/commit/1b876db04903b93c78c97fd3f3dd85d59eeef5ff))
* **#2826:** allow only one window with nvim-tree buffer per tab ([#3174](https://github.com/nvim-tree/nvim-tree.lua/issues/3174)) ([dd2364d](https://github.com/nvim-tree/nvim-tree.lua/commit/dd2364d6802f7f57a98acb8b545ed484c6697626))
* **#3157:** add view.cursorlineopt ([#3158](https://github.com/nvim-tree/nvim-tree.lua/issues/3158)) ([8eb5e0b](https://github.com/nvim-tree/nvim-tree.lua/commit/8eb5e0bfd1c4da6efc03ab0c1ccf463dbaae831e))


### Bug Fixes

* **#3077:** deleting a directory containing symlinked directory will delete the contents of the linked directory ([#3168](https://github.com/nvim-tree/nvim-tree.lua/issues/3168)) ([10db694](https://github.com/nvim-tree/nvim-tree.lua/commit/10db6943cb40625941a35235eeb385ffdfbf827a))
* **#3157:** add view.cursorlineopt ([8eb5e0b](https://github.com/nvim-tree/nvim-tree.lua/commit/8eb5e0bfd1c4da6efc03ab0c1ccf463dbaae831e))
* **#3172:** live filter exception ([#3173](https://github.com/nvim-tree/nvim-tree.lua/issues/3173)) ([0a7fcdf](https://github.com/nvim-tree/nvim-tree.lua/commit/0a7fcdf3f8ba208f4260988a198c77ec11748339))
* invalid window id for popup info window ([#3147](https://github.com/nvim-tree/nvim-tree.lua/issues/3147)) ([d54a187](https://github.com/nvim-tree/nvim-tree.lua/commit/d54a1875a91e1a705795ea26074795210b92ce7f))
* **picker:** exclude full_name window id from the choice ([#3165](https://github.com/nvim-tree/nvim-tree.lua/issues/3165)) ([543ed3c](https://github.com/nvim-tree/nvim-tree.lua/commit/543ed3cac212dc3993ef9f042f6c0812e34ddd43))
* window picker ignore hidden window ([#3145](https://github.com/nvim-tree/nvim-tree.lua/issues/3145)) ([d87b41c](https://github.com/nvim-tree/nvim-tree.lua/commit/d87b41ca537e2131622d48a6c25ccf2fbe0e5d62))


### Performance Improvements

* **#3171:** cache toplevel for untracked ([#3185](https://github.com/nvim-tree/nvim-tree.lua/issues/3185)) ([4425136](https://github.com/nvim-tree/nvim-tree.lua/commit/442513648c6936e754c3308a1c58591a399493e5))
* **#3171:** use vim.system() instead of vim.fn.system() to execute git toplevel ([#3175](https://github.com/nvim-tree/nvim-tree.lua/issues/3175)) ([9a05b9e](https://github.com/nvim-tree/nvim-tree.lua/commit/9a05b9e9f928856ca23dbf876fab372003180c3f))


### Reverts

* **#3180, #3177:** invalid group or tabpage ([#3181](https://github.com/nvim-tree/nvim-tree.lua/issues/3181)) ([9b289ab](https://github.com/nvim-tree/nvim-tree.lua/commit/9b289abd6998e30fd24cbc9919e0b0cbed6364ce))
* **#3180, #3177:** resolve live filter failures ([#3183](https://github.com/nvim-tree/nvim-tree.lua/issues/3183)) ([a4699c0](https://github.com/nvim-tree/nvim-tree.lua/commit/a4699c0904103e7767334f6da05f5c2ea5514845))

## [1.13.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.12.0...nvim-tree-v1.13.0) (2025-06-14)


### Features

* **#3113:** add renderer.icons.folder_arrow_padding ([#3114](https://github.com/nvim-tree/nvim-tree.lua/issues/3114)) ([ea5097a](https://github.com/nvim-tree/nvim-tree.lua/commit/ea5097a1e2702b4827cb7380e7fa0bd6da87699c))
* **#3132:** add api.node.expand and api.node.collapse ([#3133](https://github.com/nvim-tree/nvim-tree.lua/issues/3133)) ([ae59561](https://github.com/nvim-tree/nvim-tree.lua/commit/ae595611fb2225f2041996c042aa4e4b8663b41e))


### Bug Fixes

* "Invalid buffer id" on closing nvim-tree window ([#3129](https://github.com/nvim-tree/nvim-tree.lua/issues/3129)) ([25d16aa](https://github.com/nvim-tree/nvim-tree.lua/commit/25d16aab7d29ca940a9feb92e6bb734697417009))
* **#2746:** background and right aligned icons in floating windows ([#3128](https://github.com/nvim-tree/nvim-tree.lua/issues/3128)) ([cbc3165](https://github.com/nvim-tree/nvim-tree.lua/commit/cbc3165e08893bb499da035c6f6f9d1512b57664))
* **#3117:** allow changing filename's casing ([bd54d1d](https://github.com/nvim-tree/nvim-tree.lua/commit/bd54d1d33c20d8630703b9842480291588dbad07))
* **#3117:** windows: change file/dir case ([#3135](https://github.com/nvim-tree/nvim-tree.lua/issues/3135)) ([bd54d1d](https://github.com/nvim-tree/nvim-tree.lua/commit/bd54d1d33c20d8630703b9842480291588dbad07))
* **#3122:** remove redundant vim.validate ([#3123](https://github.com/nvim-tree/nvim-tree.lua/issues/3123)) ([e7d1b7d](https://github.com/nvim-tree/nvim-tree.lua/commit/e7d1b7dadc62fe2eccc17d814354b0a5688621ce))
* **#3124:** fix icon padding for "right_align" placements, notably for dotfiles ([#3125](https://github.com/nvim-tree/nvim-tree.lua/issues/3125)) ([e4cd856](https://github.com/nvim-tree/nvim-tree.lua/commit/e4cd856ebf4fec51db10c69d63e43224b701cbce))
* **#3124:** prevent empty icons_right_align response from breaking padding ([e4cd856](https://github.com/nvim-tree/nvim-tree.lua/commit/e4cd856ebf4fec51db10c69d63e43224b701cbce))
* **#3134:** setting one glyph to "" no longer disables others ([#3136](https://github.com/nvim-tree/nvim-tree.lua/issues/3136)) ([ebcaccd](https://github.com/nvim-tree/nvim-tree.lua/commit/ebcaccda1c575fa19a8087445276e6671e2b9b37))
* **#3143:** actions.open_file.window_picker.exclude applies when not using window picker ([#3144](https://github.com/nvim-tree/nvim-tree.lua/issues/3144)) ([05d8172](https://github.com/nvim-tree/nvim-tree.lua/commit/05d8172ebf9cdb2d140cf25b75625374fbc3df7f))
* fixes [#3134](https://github.com/nvim-tree/nvim-tree.lua/issues/3134) ([ebcaccd](https://github.com/nvim-tree/nvim-tree.lua/commit/ebcaccda1c575fa19a8087445276e6671e2b9b37))
* invalid buffer issue ([25d16aa](https://github.com/nvim-tree/nvim-tree.lua/commit/25d16aab7d29ca940a9feb92e6bb734697417009))

## [1.12.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.11.0...nvim-tree-v1.12.0) (2025-04-20)


### Features

* add TreePreOpen event ([#3105](https://github.com/nvim-tree/nvim-tree.lua/issues/3105)) ([c24c047](https://github.com/nvim-tree/nvim-tree.lua/commit/c24c0470d9de277fbebecd718f33561ed7c90298))


### Bug Fixes

* **#3101:** when renderer.highlight_opened_files = "none" do not reload on BufUnload and BufReadPost ([#3102](https://github.com/nvim-tree/nvim-tree.lua/issues/3102)) ([5bea2b3](https://github.com/nvim-tree/nvim-tree.lua/commit/5bea2b37523a31288e0fcab42f3be5c1bd4516bb))
* explicitly set `border` to `"none"` in full name float ([#3094](https://github.com/nvim-tree/nvim-tree.lua/issues/3094)) ([c3c1935](https://github.com/nvim-tree/nvim-tree.lua/commit/c3c193594213c5e2f89ec5d7729cad805f76b256))
* reliably dispatch exactly one TreeOpen and TreeClose events ([#3107](https://github.com/nvim-tree/nvim-tree.lua/issues/3107)) ([3a63717](https://github.com/nvim-tree/nvim-tree.lua/commit/3a63717d3d332d8f39aaf65be7a0e4c2265af021))

## [1.11.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.10.0...nvim-tree-v1.11.0) (2025-02-22)


### Features

* **#1984:** add quit_on_open and focus opts to various api.node.open functions ([#3054](https://github.com/nvim-tree/nvim-tree.lua/issues/3054)) ([3281f33](https://github.com/nvim-tree/nvim-tree.lua/commit/3281f331f7f0bef13eb00fb2d5a9d28b2f6155a2))
* **#3037:** add API node.buffer.delete, node.buffer.wipe ([#3040](https://github.com/nvim-tree/nvim-tree.lua/issues/3040)) ([fee1da8](https://github.com/nvim-tree/nvim-tree.lua/commit/fee1da88972f5972a8296813f6c00d7598325ebd))


### Bug Fixes

* **#3045:** wipe scratch buffers for full name and show info popups ([#3050](https://github.com/nvim-tree/nvim-tree.lua/issues/3050)) ([fca0b67](https://github.com/nvim-tree/nvim-tree.lua/commit/fca0b67c0b5a31727fb33addc4d9c100736a2894))
* **#3059:** test for presence of new 0.11 API vim.hl.range ([#3060](https://github.com/nvim-tree/nvim-tree.lua/issues/3060)) ([70825f2](https://github.com/nvim-tree/nvim-tree.lua/commit/70825f23db61ecd900c4cfea169bffe931926a9d))
* arithmetic on nil value error on first git project open ([#3064](https://github.com/nvim-tree/nvim-tree.lua/issues/3064)) ([8052310](https://github.com/nvim-tree/nvim-tree.lua/commit/80523101f0ae48b7f1990e907b685a3d79776c01))
* stl and stlnc fillchars are hidden in window picker ([b699143](https://github.com/nvim-tree/nvim-tree.lua/commit/b69914325a945ee5157f0d21047210b42af5776e))
* window picker: hide fillchars: stl and stlnc ([#3066](https://github.com/nvim-tree/nvim-tree.lua/issues/3066)) ([b699143](https://github.com/nvim-tree/nvim-tree.lua/commit/b69914325a945ee5157f0d21047210b42af5776e))

## [1.10.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.9.0...nvim-tree-v1.10.0) (2025-01-13)


### Features

* **api:** add node.open.vertical_no_picker, node.open.horizontal_no_picker ([#3031](https://github.com/nvim-tree/nvim-tree.lua/issues/3031)) ([68fc4c2](https://github.com/nvim-tree/nvim-tree.lua/commit/68fc4c20f5803444277022c681785c5edd11916d))


### Bug Fixes

* **#3015:** dynamic width no longer truncates on right_align icons ([#3022](https://github.com/nvim-tree/nvim-tree.lua/issues/3022)) ([f7b76cd](https://github.com/nvim-tree/nvim-tree.lua/commit/f7b76cd1a75615c8d6254fc58bedd2a7304eb7d8))
* **#3018:** error when focusing nvim-tree when in terminal mode ([#3019](https://github.com/nvim-tree/nvim-tree.lua/issues/3019)) ([db8d7ac](https://github.com/nvim-tree/nvim-tree.lua/commit/db8d7ac1f524fc6f808764b29fa695c51e014aa6))
* **#3041:** use vim.diagnostic.get for updating diagnostics ([#3042](https://github.com/nvim-tree/nvim-tree.lua/issues/3042)) ([aae0185](https://github.com/nvim-tree/nvim-tree.lua/commit/aae01853ddbd790d1efd6ff04ff96cf38c02c95f))
* Can't re-enter normal mode from terminal mode ([db8d7ac](https://github.com/nvim-tree/nvim-tree.lua/commit/db8d7ac1f524fc6f808764b29fa695c51e014aa6))
* hijack directory "BufEnter", "BufNewFile" events are nested ([#3044](https://github.com/nvim-tree/nvim-tree.lua/issues/3044)) ([39bc630](https://github.com/nvim-tree/nvim-tree.lua/commit/39bc63081605c1d4b974131ebecaea11e8a8595f))
* view.width functions may return strings ([#3020](https://github.com/nvim-tree/nvim-tree.lua/issues/3020)) ([6b4be1d](https://github.com/nvim-tree/nvim-tree.lua/commit/6b4be1dc0cd4d5d5b8e8b56b510a75016e99746f))

## [1.9.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.8.0...nvim-tree-v1.9.0) (2024-12-07)


### Features

* **#2948:** add custom decorators, :help nvim-tree-decorators ([#2996](https://github.com/nvim-tree/nvim-tree.lua/issues/2996)) ([7a4ff1a](https://github.com/nvim-tree/nvim-tree.lua/commit/7a4ff1a516fe92a5ed6b79d7ce31ea4d8f341a72))


### Bug Fixes

* **#2954:** more efficient LSP updates, increase diagnostics.debounce_delay from 50ms to 500ms ([#3007](https://github.com/nvim-tree/nvim-tree.lua/issues/3007)) ([1f3ffd6](https://github.com/nvim-tree/nvim-tree.lua/commit/1f3ffd6af145af2a4930a61c50f763264922c3fe))
* **#2990:** Do not check if buffer is buflisted in diagnostics.update() ([#2998](https://github.com/nvim-tree/nvim-tree.lua/issues/2998)) ([28eac28](https://github.com/nvim-tree/nvim-tree.lua/commit/28eac2801b201f301449e976d7a9e8cfde053ba3))
* **#3009:** nvim &lt; 0.10 apply view options locally ([#3010](https://github.com/nvim-tree/nvim-tree.lua/issues/3010)) ([ca7c4c3](https://github.com/nvim-tree/nvim-tree.lua/commit/ca7c4c33cac2ad66ec69d45e465379716ef0cc97))
* **api:** correct argument types in `wrap_node` and `wrap_node_or_nil` ([#3006](https://github.com/nvim-tree/nvim-tree.lua/issues/3006)) ([f7c65e1](https://github.com/nvim-tree/nvim-tree.lua/commit/f7c65e11d695a084ca10b93df659bb7e68b71f9f))

## [1.8.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.7.1...nvim-tree-v1.8.0) (2024-11-09)


### Features

* **#2819:** add actions.open_file.relative_path, default enabled, following successful experiment ([#2995](https://github.com/nvim-tree/nvim-tree.lua/issues/2995)) ([2ee1c5e](https://github.com/nvim-tree/nvim-tree.lua/commit/2ee1c5e17fdfbf5013af31b1410e4a5f28f4cadd))
* **#2938:** add default filesystem_watchers.ignore_dirs = { "/.ccls-cache", "/build", "/node_modules", "/target", } ([#2940](https://github.com/nvim-tree/nvim-tree.lua/issues/2940)) ([010ae03](https://github.com/nvim-tree/nvim-tree.lua/commit/010ae0365aafd6275c478d932515d2e8e897b7bb))


### Bug Fixes

* **#2945:** stack overflow on api.git.reload or fugitive event with watchers disabled ([#2949](https://github.com/nvim-tree/nvim-tree.lua/issues/2949)) ([5ad8762](https://github.com/nvim-tree/nvim-tree.lua/commit/5ad87620ec9d1190d15c88171a3f0122bc16b0fe))
* **#2947:** root is never a dotfile, so that it doesn't propagate to children ([#2958](https://github.com/nvim-tree/nvim-tree.lua/issues/2958)) ([f5f6789](https://github.com/nvim-tree/nvim-tree.lua/commit/f5f67892996b280ae78b1b0a2d07c4fa29ae0905))
* **#2951:** highlights incorrect following cancelled pick ([#2952](https://github.com/nvim-tree/nvim-tree.lua/issues/2952)) ([1c9553a](https://github.com/nvim-tree/nvim-tree.lua/commit/1c9553a19f70df3dcb171546a3d5e034531ef093))
* **#2954:** resolve occasional tree flashing on diagnostics, set tree buffer options in deterministic order ([#2980](https://github.com/nvim-tree/nvim-tree.lua/issues/2980)) ([82ab19e](https://github.com/nvim-tree/nvim-tree.lua/commit/82ab19ebf79c1839d7351f2fed213d1af13a598e))
* **#2961:** windows: escape brackets and parentheses when opening file ([#2962](https://github.com/nvim-tree/nvim-tree.lua/issues/2962)) ([63c7ad9](https://github.com/nvim-tree/nvim-tree.lua/commit/63c7ad9037fb7334682dd0b3a177cee25c5c8a0f))
* **#2969:** After a rename, the node loses selection ([#2974](https://github.com/nvim-tree/nvim-tree.lua/issues/2974)) ([1403933](https://github.com/nvim-tree/nvim-tree.lua/commit/14039337a563f4efd72831888f332a15585f0ea1))
* **#2972:** error on :colorscheme ([#2973](https://github.com/nvim-tree/nvim-tree.lua/issues/2973)) ([6e5a204](https://github.com/nvim-tree/nvim-tree.lua/commit/6e5a204ca659bb8f2a564df75df2739edec03cb0))
* **#2976:** use vim.loop to preserve neovim 0.9 compatibility ([#2977](https://github.com/nvim-tree/nvim-tree.lua/issues/2977)) ([00dff48](https://github.com/nvim-tree/nvim-tree.lua/commit/00dff482f9a8fb806a54fd980359adc6cd45d435))
* **#2978:** grouped folder not showing closed icon ([#2979](https://github.com/nvim-tree/nvim-tree.lua/issues/2979)) ([120ba58](https://github.com/nvim-tree/nvim-tree.lua/commit/120ba58254835d412bbc91cffe847e9be835fadd))
* **#2981:** windows: root changed when navigating with LSP ([#2982](https://github.com/nvim-tree/nvim-tree.lua/issues/2982)) ([c22124b](https://github.com/nvim-tree/nvim-tree.lua/commit/c22124b37409bee6d1a0da77f4f3a1526f7a204d))
* symlink file icons rendered when renderer.icons.show.file = false, folder.symlink* was incorrectly rendered as folder.default|open ([#2983](https://github.com/nvim-tree/nvim-tree.lua/issues/2983)) ([2156bc0](https://github.com/nvim-tree/nvim-tree.lua/commit/2156bc08c982d3c4b4cfc2b8fd7faeff58a88e10))

## [1.7.1](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.7.0...nvim-tree-v1.7.1) (2024-09-30)


### Bug Fixes

* **#2794:** sshfs compatibility ([#2922](https://github.com/nvim-tree/nvim-tree.lua/issues/2922)) ([9650e73](https://github.com/nvim-tree/nvim-tree.lua/commit/9650e735baad0d39505f4cb4867a60f02858536a))
* **#2928:** nil explorer in parent move action ([#2929](https://github.com/nvim-tree/nvim-tree.lua/issues/2929)) ([0429f28](https://github.com/nvim-tree/nvim-tree.lua/commit/0429f286b350c65118d66b646775bf187936fa47))
* **#2930:** empty groups expanded on reload ([#2935](https://github.com/nvim-tree/nvim-tree.lua/issues/2935)) ([4520c03](https://github.com/nvim-tree/nvim-tree.lua/commit/4520c0355cc561830ee2cf90dc37a2a75abf7995))
* invalid explorer on open ([#2927](https://github.com/nvim-tree/nvim-tree.lua/issues/2927)) ([59a8a6a](https://github.com/nvim-tree/nvim-tree.lua/commit/59a8a6ae5e9d3eae99d08ab655d12fd51d5d17f3))


### Reverts

* **#2794:** sshfs compatibility ([#2920](https://github.com/nvim-tree/nvim-tree.lua/issues/2920)) ([8405ecf](https://github.com/nvim-tree/nvim-tree.lua/commit/8405ecfbd6bb08a94ffc9c68fef211eea56e8a3b))

## [1.7.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.6.1...nvim-tree-v1.7.0) (2024-09-21)


### Features

* **#2430:** use vim.ui.open as default system_open, for neovim 0.10+ ([#2912](https://github.com/nvim-tree/nvim-tree.lua/issues/2912)) ([03f737e](https://github.com/nvim-tree/nvim-tree.lua/commit/03f737e5744a2b3ebb4b086f7636a3399224ec0c))
* help closes on &lt;Esc&gt; and api.tree.toggle_help mappings ([#2909](https://github.com/nvim-tree/nvim-tree.lua/issues/2909)) ([b652dbd](https://github.com/nvim-tree/nvim-tree.lua/commit/b652dbd0e0489c5fbb81fbededf0d99029cd2f38))


### Bug Fixes

* **#2862:** windows path replaces backslashes with forward slashes ([#2903](https://github.com/nvim-tree/nvim-tree.lua/issues/2903)) ([45a93d9](https://github.com/nvim-tree/nvim-tree.lua/commit/45a93d99794fff3064141d5b3a50db98ce352697))
* **#2906:** resource leak on populate children ([#2907](https://github.com/nvim-tree/nvim-tree.lua/issues/2907)) ([a4dd5ad](https://github.com/nvim-tree/nvim-tree.lua/commit/a4dd5ad5c8f9349142291d24e0e6466995594b9a))
* **#2917:** fix root copy paths: Y, ge, gy, y ([#2918](https://github.com/nvim-tree/nvim-tree.lua/issues/2918)) ([b18ce8b](https://github.com/nvim-tree/nvim-tree.lua/commit/b18ce8be8f162eee0bc37addcfe17d7d019fcec7))
* safely close last tree window ([#2913](https://github.com/nvim-tree/nvim-tree.lua/issues/2913)) ([bd48816](https://github.com/nvim-tree/nvim-tree.lua/commit/bd4881660bf0ddfa6acb21259f856ba3dcb26a93))
* safely close tree window with pcall and debug logging ([bd48816](https://github.com/nvim-tree/nvim-tree.lua/commit/bd4881660bf0ddfa6acb21259f856ba3dcb26a93))

## [1.6.1](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.6.0...nvim-tree-v1.6.1) (2024-09-09)


### Bug Fixes

* **#2794:** sshfs compatibility ([#2893](https://github.com/nvim-tree/nvim-tree.lua/issues/2893)) ([2d6e64d](https://github.com/nvim-tree/nvim-tree.lua/commit/2d6e64dd8c45a86f312552b7a47eef2c8623a25c))
* **#2868:** windows: do not visit unenumerable directories such as Application Data ([#2874](https://github.com/nvim-tree/nvim-tree.lua/issues/2874)) ([2104786](https://github.com/nvim-tree/nvim-tree.lua/commit/210478677cb9d672c4265deb0e9b59d58b675bd4))
* **#2878:** nowrapscan prevents move from root ([#2880](https://github.com/nvim-tree/nvim-tree.lua/issues/2880)) ([4234095](https://github.com/nvim-tree/nvim-tree.lua/commit/42340952af598a08ab80579d067b6da72a9e6d29))
* **#2879:** remove unnecessary tree window width setting to prevent unnecessary :wincmd = ([#2881](https://github.com/nvim-tree/nvim-tree.lua/issues/2881)) ([d43ab67](https://github.com/nvim-tree/nvim-tree.lua/commit/d43ab67d0eb4317961c5e9d15fffe908519debe0))

## [1.6.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.5.0...nvim-tree-v1.6.0) (2024-08-10)


### Features

* **#2225:** add renderer.hidden_display to show a summary of hidden files below the tree ([#2856](https://github.com/nvim-tree/nvim-tree.lua/issues/2856)) ([e25eb7f](https://github.com/nvim-tree/nvim-tree.lua/commit/e25eb7fa83f7614bb23d762e91d2de44fcd7103b))
* **#2349:** add "right_align" option for renderer.icons.*_placement ([#2839](https://github.com/nvim-tree/nvim-tree.lua/issues/2839)) ([1d629a5](https://github.com/nvim-tree/nvim-tree.lua/commit/1d629a5d3f7d83d516494c221a2cfc079f43bc47))
* **#2349:** add "right_align" option for renderer.icons.*_placement ([#2846](https://github.com/nvim-tree/nvim-tree.lua/issues/2846)) ([48d0e82](https://github.com/nvim-tree/nvim-tree.lua/commit/48d0e82f9434691cc50d970898142a8c084a49d6))
* add renderer.highlight_hidden, renderer.icons.show.hidden and renderer.icons.hidden_placement for dotfile icons/highlights ([#2840](https://github.com/nvim-tree/nvim-tree.lua/issues/2840)) ([48a9290](https://github.com/nvim-tree/nvim-tree.lua/commit/48a92907575df1dbd7242975a04e98169cb3a115))


### Bug Fixes

* **#2859:** make sure window still exists when restoring options ([#2863](https://github.com/nvim-tree/nvim-tree.lua/issues/2863)) ([466fbed](https://github.com/nvim-tree/nvim-tree.lua/commit/466fbed3e4b61fcc23a48fe99de7bfa264a9fee8))

## [1.5.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.4.0...nvim-tree-v1.5.0) (2024-07-11)


### Features

* **#2127:** add experimental.actions.open_file.relative_path to open files with a relative path rather than absolute ([#2805](https://github.com/nvim-tree/nvim-tree.lua/issues/2805)) ([869c064](https://github.com/nvim-tree/nvim-tree.lua/commit/869c064721a6c2091f22c3541e8f0ff958361771))
* **#2598:** add api.tree.resize ([#2811](https://github.com/nvim-tree/nvim-tree.lua/issues/2811)) ([2ede0de](https://github.com/nvim-tree/nvim-tree.lua/commit/2ede0de67b47e89e2b4cb488ea3f58b8f5a8c90a))
* **#2799:** `filesystem_watchers.ignore_dirs` and `git.disable_for_dirs` may be functions ([#2800](https://github.com/nvim-tree/nvim-tree.lua/issues/2800)) ([8b2c5c6](https://github.com/nvim-tree/nvim-tree.lua/commit/8b2c5c678be4b49dff6a2df794877000113fd77b))
* **#2799:** filesystem_watchers.ignore_dirs and git.disable_for_dirs may be functions ([8b2c5c6](https://github.com/nvim-tree/nvim-tree.lua/commit/8b2c5c678be4b49dff6a2df794877000113fd77b))


### Bug Fixes

* **#2813:** macos: enable file renaming with changed capitalization ([#2814](https://github.com/nvim-tree/nvim-tree.lua/issues/2814)) ([abfd1d1](https://github.com/nvim-tree/nvim-tree.lua/commit/abfd1d1b6772540364743531cc0331e08a0027a9))
* **#2819:** experimental.actions.open_file.relative_path issue following change directory ([#2820](https://github.com/nvim-tree/nvim-tree.lua/issues/2820)) ([12a9a99](https://github.com/nvim-tree/nvim-tree.lua/commit/12a9a995a455d2c2466e47140663275365a5d2fc))

## [1.4.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.3.3...nvim-tree-v1.4.0) (2024-06-09)

### Notice

* Neovim 0.9 is now the minimum supported version; please upgrade to neovim release version 0.9 or 0.10.

### Reverts

* **#2781:** "refactor: replace deprecated use of vim.diagnostic.is_disabled()" ([#2784](https://github.com/nvim-tree/nvim-tree.lua/issues/2784)) ([517e4fb](https://github.com/nvim-tree/nvim-tree.lua/commit/517e4fbb9ef3c0986da7047f44b4b91a2400f93c))


### Miscellaneous Chores

* release 1.4.0 ([1cac800](https://github.com/nvim-tree/nvim-tree.lua/commit/1cac8005df6da484c97499247754afa59fef92db))

## [1.3.3](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.3.2...nvim-tree-v1.3.3) (2024-05-14)


### Bug Fixes

* nil access exception with git integration when changing branches ([#2774](https://github.com/nvim-tree/nvim-tree.lua/issues/2774)) ([340d3a9](https://github.com/nvim-tree/nvim-tree.lua/commit/340d3a9795e06bdd1814228de398cd510f9bfbb0))

## [1.3.2](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.3.1...nvim-tree-v1.3.2) (2024-05-12)


### Bug Fixes

* **#2758:** use nvim-webdevicons default file icon, not renderer.icons.glyphs.default, as per :help ([#2759](https://github.com/nvim-tree/nvim-tree.lua/issues/2759)) ([347e1eb](https://github.com/nvim-tree/nvim-tree.lua/commit/347e1eb35264677f66a79466bb5e3d111968e12c))
* **#2758:** use nvim-webdevicons default for default files ([347e1eb](https://github.com/nvim-tree/nvim-tree.lua/commit/347e1eb35264677f66a79466bb5e3d111968e12c))
* **#925:** handle newlines in file names ([#2754](https://github.com/nvim-tree/nvim-tree.lua/issues/2754)) ([64f61e4](https://github.com/nvim-tree/nvim-tree.lua/commit/64f61e4c913047a045ff90bd188dd3b54ee443cf))

## [1.3.1](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.3.0...nvim-tree-v1.3.1) (2024-04-25)


### Bug Fixes

* **#2535:** TextYankPost event sends vim.v.event ([#2734](https://github.com/nvim-tree/nvim-tree.lua/issues/2734)) ([d8d3a15](https://github.com/nvim-tree/nvim-tree.lua/commit/d8d3a1590a05b2d8b5eb26e2ed1c6052b1b47a77))
* **#2733:** escape trash path ([#2735](https://github.com/nvim-tree/nvim-tree.lua/issues/2735)) ([81eb8d5](https://github.com/nvim-tree/nvim-tree.lua/commit/81eb8d519233c105f30dc0a278607e62b20502fd))

## [1.3.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.2.0...nvim-tree-v1.3.0) (2024-03-30)


### Features

* add update_focused_file.exclude  ([#2673](https://github.com/nvim-tree/nvim-tree.lua/issues/2673)) ([e20966a](https://github.com/nvim-tree/nvim-tree.lua/commit/e20966ae558524f8d6f93dc37f5d2a8605f893e2))


### Bug Fixes

* **#2658:** change SpellCap groups to reduce confusion: ExecFile-&gt;Question, ImageFile->Question, SpecialFile->Title, Symlink->Underlined; add all other highlight groups to :NvimTreeHiTest ([#2732](https://github.com/nvim-tree/nvim-tree.lua/issues/2732)) ([0aca092](https://github.com/nvim-tree/nvim-tree.lua/commit/0aca0920f44b12a8383134bcb52da9faec123608))
* bookmark filter shows marked directory children ([#2719](https://github.com/nvim-tree/nvim-tree.lua/issues/2719)) ([2d97059](https://github.com/nvim-tree/nvim-tree.lua/commit/2d97059661c83787372c8c003e743c984ba3ac50))

## [1.2.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.1.1...nvim-tree-v1.2.0) (2024-03-24)


### Features

* add api.tree.toggle_enable_filters ([#2706](https://github.com/nvim-tree/nvim-tree.lua/issues/2706)) ([f7c09bd](https://github.com/nvim-tree/nvim-tree.lua/commit/f7c09bd72e50e1795bd3afb9e2a2b157b4bfb3c3))

## [1.1.1](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.1.0...nvim-tree-v1.1.1) (2024-03-15)


### Bug Fixes

* **#2395:** marks.bulk.move defaults to directory at cursor ([#2688](https://github.com/nvim-tree/nvim-tree.lua/issues/2688)) ([cfea5bd](https://github.com/nvim-tree/nvim-tree.lua/commit/cfea5bd0806aab41bef6014c6cf5a510910ddbdb))
* **#2705:** change NvimTreeWindowPicker cterm background from Cyan to more visible DarkBlue ([#2708](https://github.com/nvim-tree/nvim-tree.lua/issues/2708)) ([1fd9c98](https://github.com/nvim-tree/nvim-tree.lua/commit/1fd9c98960463d2d5d400916c0633b2df016941d))
* bookmark filter should include parent directory ([#2704](https://github.com/nvim-tree/nvim-tree.lua/issues/2704)) ([76b9810](https://github.com/nvim-tree/nvim-tree.lua/commit/76b98109f62caa12b2f1dff472060b2233ea2e90))

## [1.1.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.0.0...nvim-tree-v1.1.0) (2024-03-14)


### Features

* **#2630:** file renames can now create directories ([#2657](https://github.com/nvim-tree/nvim-tree.lua/issues/2657)) ([efafd73](https://github.com/nvim-tree/nvim-tree.lua/commit/efafd73efa9bc8c26282aed563ba0f01c7465b06))
* add api.fs.copy.basename, default mapping ge ([#2698](https://github.com/nvim-tree/nvim-tree.lua/issues/2698)) ([8f2a50f](https://github.com/nvim-tree/nvim-tree.lua/commit/8f2a50f1cd0c64003042364cf317c8788eaa6c8c))


### Bug Fixes

* **#2695:** git toplevel guard against missing paths ([#2696](https://github.com/nvim-tree/nvim-tree.lua/issues/2696)) ([3c4267e](https://github.com/nvim-tree/nvim-tree.lua/commit/3c4267eb5045fa86b67fe40c0c63d31efc801e77))
* searchcount exception on invalid search regex ([#2693](https://github.com/nvim-tree/nvim-tree.lua/issues/2693)) ([041dbd1](https://github.com/nvim-tree/nvim-tree.lua/commit/041dbd18f440207ad161503a384e7c82d575db66))

## [1.0.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v0.100.0...nvim-tree-v1.0.0) (2024-02-18)


### Features

* **#2654:** filters.custom may be a function ([#2655](https://github.com/nvim-tree/nvim-tree.lua/issues/2655)) ([4a87b8b](https://github.com/nvim-tree/nvim-tree.lua/commit/4a87b8b46b4a30107971871df3cb7f4c30fdd5d0))


### Miscellaneous Chores

* release 1.0.0 ([#2678](https://github.com/nvim-tree/nvim-tree.lua/issues/2678)) ([d16246a](https://github.com/nvim-tree/nvim-tree.lua/commit/d16246a7575538f77e9246520449b99333c469f7))

## [0.100.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v0.99.0...nvim-tree-v0.100.0) (2024-02-11)


### Features

* **#1389:** api: recursive node navigation for git and diagnostics ([#2525](https://github.com/nvim-tree/nvim-tree.lua/issues/2525)) ([5d13cc8](https://github.com/nvim-tree/nvim-tree.lua/commit/5d13cc8205bce4963866f73c50f6fdc18a515ffe))
* **#2415:** add :NvimTreeHiTest ([#2664](https://github.com/nvim-tree/nvim-tree.lua/issues/2664)) ([b278fc2](https://github.com/nvim-tree/nvim-tree.lua/commit/b278fc25ae0fc95e4808eb5618f07fc2522fd2b3))
* **#2415:** colour and highlight overhaul, see :help nvim-tree-highlight-overhaul ([#2455](https://github.com/nvim-tree/nvim-tree.lua/issues/2455)) ([e9c5abe](https://github.com/nvim-tree/nvim-tree.lua/commit/e9c5abe073a973f54d3ca10bfe30f253569f4405))
* add node.open.toggle_group_empty, default mapping L ([#2647](https://github.com/nvim-tree/nvim-tree.lua/issues/2647)) ([8cbb1db](https://github.com/nvim-tree/nvim-tree.lua/commit/8cbb1db8e90b62fc56f379992e622e9f919792ce))


### Bug Fixes

* **#2415:** disambiguate highlight groups, see :help nvim-tree-highlight-overhaul ([#2639](https://github.com/nvim-tree/nvim-tree.lua/issues/2639)) ([d9cb432](https://github.com/nvim-tree/nvim-tree.lua/commit/d9cb432d2c8d8fa9267ddbd7535d76fe4df89360))
* **#2415:** fix NvimTreeIndentMarker highlight group: FileIcon-&gt;FolderIcon ([e9ac136](https://github.com/nvim-tree/nvim-tree.lua/commit/e9ac136a3ab996aa8e4253253521dcf2cb66b81b))
* **#2415:** highlight help header and mappings ([#2669](https://github.com/nvim-tree/nvim-tree.lua/issues/2669)) ([39e6fef](https://github.com/nvim-tree/nvim-tree.lua/commit/39e6fef85ac3bb29532b877aa7c9c34911c661af))
* **#2415:** nvim 0.8 highlight overhaul support, limited to only show highest highlight precedence ([#2642](https://github.com/nvim-tree/nvim-tree.lua/issues/2642)) ([f39f7b6](https://github.com/nvim-tree/nvim-tree.lua/commit/f39f7b6fcd3865ac2146de4cb4045286308f2935))
* **#2415:** NvimTreeIndentMarker highlight group: FileIcon-&gt;FolderIcon ([#2656](https://github.com/nvim-tree/nvim-tree.lua/issues/2656)) ([e9ac136](https://github.com/nvim-tree/nvim-tree.lua/commit/e9ac136a3ab996aa8e4253253521dcf2cb66b81b))
* **#2624:** open file from docked floating window ([#2627](https://github.com/nvim-tree/nvim-tree.lua/issues/2627)) ([f24afa2](https://github.com/nvim-tree/nvim-tree.lua/commit/f24afa2cef551122b8bd53bb2e4a7df42343ce2e))
* **#2632:** occasional error stack when locating nvim-tree window ([#2633](https://github.com/nvim-tree/nvim-tree.lua/issues/2633)) ([48b1d86](https://github.com/nvim-tree/nvim-tree.lua/commit/48b1d8638fa3726236ae22e0e48a74ac8ea6592a))
* **#2637:** show buffer modified icons and highlights ([#2638](https://github.com/nvim-tree/nvim-tree.lua/issues/2638)) ([7bdb220](https://github.com/nvim-tree/nvim-tree.lua/commit/7bdb220d0fe604a77361e92cdbc7af1b8a412126))
* **#2643:** correctly apply linked highlight groups in tree window ([#2653](https://github.com/nvim-tree/nvim-tree.lua/issues/2653)) ([fbee8a6](https://github.com/nvim-tree/nvim-tree.lua/commit/fbee8a69a46f558d29ab84e96301425b0501c668))
* allow highlight overrides for DEFAULT_DEFS: NvimTreeFolderIcon, NvimTreeWindowPicker ([#2636](https://github.com/nvim-tree/nvim-tree.lua/issues/2636)) ([74525ac](https://github.com/nvim-tree/nvim-tree.lua/commit/74525ac04760bf0d9fec2bf51474d2b05f36048e))
* bad column offset when using full_name ([#2629](https://github.com/nvim-tree/nvim-tree.lua/issues/2629)) ([75ff64e](https://github.com/nvim-tree/nvim-tree.lua/commit/75ff64e6663fc3b23c72dca32b2f838acefe7c8a))
* passing nil as window handle in view.get_winnr ([48b1d86](https://github.com/nvim-tree/nvim-tree.lua/commit/48b1d8638fa3726236ae22e0e48a74ac8ea6592a))

## 0.99.0 (2024-01-01)


### Features

* **#1850:** add "no bookmark" filter ([#2571](https://github.com/nvim-tree/nvim-tree.lua/issues/2571)) ([8f92e1e](https://github.com/nvim-tree/nvim-tree.lua/commit/8f92e1edd399f839a23776dcc6eee4ba18030370))
* add kind param to vim.ui.select function calls ([#2602](https://github.com/nvim-tree/nvim-tree.lua/issues/2602)) ([dc839a7](https://github.com/nvim-tree/nvim-tree.lua/commit/dc839a72a6496ce22ebd3dd959115cf97c1b20a0))
* add option to skip gitignored files on git navigation ([#2583](https://github.com/nvim-tree/nvim-tree.lua/issues/2583)) ([50f30bc](https://github.com/nvim-tree/nvim-tree.lua/commit/50f30bcd8c62ac4a83d133d738f268279f2c2ce2))


### Bug Fixes

* **#2519:** Diagnostics Not Updated When Tree Not Visible ([#2597](https://github.com/nvim-tree/nvim-tree.lua/issues/2597)) ([96a783f](https://github.com/nvim-tree/nvim-tree.lua/commit/96a783fbd606a458bcce2ef8041240a8b94510ce))
* **#2609:** help toggle ([#2611](https://github.com/nvim-tree/nvim-tree.lua/issues/2611)) ([fac4900](https://github.com/nvim-tree/nvim-tree.lua/commit/fac4900bd18a9fa15be3d104645d9bdef7b3dcec))
* hijack_cursor on update focused file and vim search ([#2600](https://github.com/nvim-tree/nvim-tree.lua/issues/2600)) ([02ae523](https://github.com/nvim-tree/nvim-tree.lua/commit/02ae52357ba4da77a4c120390791584a81d15340))


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to `nvim-tree.lua`

Thank you for contributing.

See [wiki: Development](https://github.com/nvim-tree/nvim-tree.lua/wiki/Development) for environment setup, tips and tools.

<!-- 
https://github.com/jonschlinkert/markdown-toc
markdown-toc --maxdepth=2 -i CONTRIBUTING.md
-->

<!-- toc -->

- [Tools](#tools)
- [Quality](#quality)
  * [lint](#lint)
  * [style](#style)
  * [format-fix](#format-fix)
  * [check](#check)
  * [format-check](#format-check)
- [Diagnostics](#diagnostics)
- [Backwards Compatibility](#backwards-compatibility)
- [:help Documentation](#help-documentation)
  * [Generated Content](#generated-content)
  * [Updating And Generating](#updating-and-generating)
  * [Checking And Linting](#checking-and-linting)
- [Windows](#windows)
- [Pull Request](#pull-request)
  * [Subject](#subject)
- [AI Usage Policy: Highly Discouraged](#ai-usage-policy-highly-discouraged)
  * [nvim-tree Is A Community Project](#nvim-tree-is-a-community-project)
  * [The Burden Of Review Must Not Increase](#the-burden-of-review-must-not-increase)
  * [AI Generated PR Rules](#ai-generated-pr-rules)

<!-- tocstop -->

# Tools

Following are used during CI and strongly recommended during local development.

Language server: [luals](https://luals.github.io)

Lint: [luacheck](https://github.com/lunarmodules/luacheck/)

nvim-tree migrated from stylua to EmmyLuaCodeStyle ~2024/10. `vim.lsp.buf.format()` may be used as it is the default formatter for luals, using an embedded [EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle)

Formatting: [EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle): `CodeFormat` executable

You can install them via you OS package manager e.g. `pacman`, `brew` or other via other package managers such as `cargo` or `luarocks`

# Quality

The following quality checks are mandatory and are performed during CI. They run on the entire `lua` directory and return 1 on any failure.

You can run them all via `make` or `make all`

You can setup git hooks to run all checks by running `scripts/setup-hooks.sh`

## lint

1. Runs luacheck quietly using `.luacheck` settings

```sh
make lint
```

## style

1. Runs lua language server `codestyle-check` only, using `.luarc.json` settings
1. Runs `scripts/doc-comments.sh` to normalise annotated documentation

```sh
make style
```

## format-fix

You can automatically fix most style issues using `CodeFormat`:

```sh
make format-fix
```

## check

1. Runs the checks that the LSP lua language server runs inside nvim using `.luarc.json` via `scripts/luals-check.sh`

```sh
make check
```

Assumes `$VIMRUNTIME` is `/usr/share/nvim/runtime`. Adjust as necessary e.g.

```sh
VIMRUNTIME="/my/path/to/runtime" make check
```

If `lua-language-server` is not available or `--check` doesn't function (e.g. Arch Linux 3.9.1-1) you can manually install it as per `ci.yml` using its current `luals_version` e.g.

```sh
mkdir luals
curl -L "https://github.com/LuaLS/lua-language-server/releases/download/3.15.0/lua-language-server-3.15.0-linux-x64.tar.gz" | tar zx --directory luals

PATH="luals/bin:${PATH}" make check
```

## format-check

This is run in CI. Commit or stage your changes and run:

```sh
make format-check
```

- Re-runs `make format-fix`
- Checks that `git diff` is empty, to ensure that all content has been generated. This is why a stage or commit is necessary.

# Diagnostics

Diagnostics issues may not be suppressed. See [luals](https://luals.github.io) documentation for details on how to structure the code and comments.

Suppressions are permitted only in the following cases:

- Backwards compatibility shims
- neovim API metadata incorrect, awaiting upstream fix
- classic class framework

# Backwards Compatibility

Whenever new neovim API is introduced, please ensure that it is available in older versions. See `:help deprecated.txt` and `$VIMRUNTIME/lua/vim/_meta/api.lua`

See `nvim-tree.setup` for the oldest supported version of neovim. If the API is not availble in that version, a backwards compatibility shim must be used e.g.

```lua
if vim.fn.has("nvim-0.10") == 1 then
  modified = vim.api.nvim_get_option_value("modified", { buf = target_bufid })
else
  modified = vim.api.nvim_buf_get_option(target_bufid, "modified") ---@diagnostic disable-line: deprecated
end
```

# :help Documentation

Please update or add to `doc/nvim-tree-lua.txt` as needed.

## Generated Content

`doc/nvim-tree-lua.txt` content starting at `*nvim-tree-config*` will be replaced with generated content. Do not manually edit that content.

### API and Config

Help is generated for:
- `nvim_tree.config` classes from `lua/nvim-tree/_meta/config/`
- `nvim_tree.api` functions from `lua/nvim-tree/_meta/api/`

Please add or update documentation when you make changes, see `:help dev-lua-doc` for docstring format.

`scripts/vimdoc_config.lua` contains the manifest of help sources.

### Config And Mappings

Help is updated for:
- Default keymap at `keymap.on_attach_default`
- Default config at `--- config-default-start`

## Updating And Generating

Nvim sources are required. You will be prompted with instructions on fetching and using the sources.

See comments at the start of each script for complete details.

```sh
make help-update
```

- `scripts/help-defaults.sh`
  - Update config defaults `*nvim-tree-config-default*`
  - Update default mappings:
    - `*nvim-tree-mappings-default*`
    - `*nvim-tree-quickstart-help*`

- `scripts/vimdoc.sh doc`
  - Remove content starting at `*nvim-tree-config*`
  - Generate config classes `*nvim-tree-config*`
  - Generate API `*nvim-tree-api*`

## Checking And Linting

This is run in CI. Commit or stage your changes and run:

```sh
make help-check
```

- Re-runs `make help-update`
- Checks that `git diff` is empty, to ensure that all content has been generated. This is why a stage or commit is necessary.
- Lints `doc/nvim-tree-lua.txt` using `scripts/vimdoc.sh lintdoc` to check for no broken links etc.

# Windows

Please note that nvim-tree team members do not have access to nor expertise with Windows.

You will need to be an active participant during development and raise a PR to resolve any issues that may arise.

Please ensure that windows specific features and fixes are behind the appropriate feature flag, see [wiki: OS Feature Flags](https://github.com/nvim-tree/nvim-tree.lua/wiki/Development#os-feature-flags)

# Pull Request

Please reference any issues in the description e.g. "resolves #1234", which will be closed upon merge.

Please check "allow edits by maintainers" to allow nvim-tree developers to make small changes such as documentation tweaks.

Do not enable or use any AI review tools (e.g. Copilot) on the Pull Request.

## Subject

The merge commit message will be the subject of the PR.

A [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0) subject will be validated by the Semantic Pull Request Subject CI job. Reference the issue to be used in the release notes e.g.

`fix(#2395): marks.bulk.move defaults to directory at cursor`

Available types:
* feat: A new feature
* fix: A bug fix
* docs: Documentation only changes
* style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
* refactor: A code change that neither fixes a bug nor adds a feature
* perf: A code change that improves performance
* test: Adding missing tests or correcting existing tests
* build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
* ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
* chore: Other changes that don't modify src or test files
* revert: Reverts a previous commit

If in doubt, look at previous commits.

See also [The Conventional Commits ultimate cheatsheet](https://gist.github.com/gabrielecanepa/fa6cca1a8ae96f77896fe70ddee65527)

# AI Usage Policy: Highly Discouraged

## nvim-tree Is A Community Project

nvim-tree is a work of passion, building a community of free thinking individuals who contribute highly polished, elegant and maintainable code. Community members range from novices to professionals and all are welcome. Teaching, encouraging and celebrating the growth of less experienced developers is of great importance.

AI generated code is discouraged as this doesn't match these nvim-tree values.

Human PR reviews will always be prioritised over AI generated PRs.

## The Burden Of Review Must Not Increase

There must be a human in the loop at all times. The contributor is the author of and is fully accountable for AI generated contributions.

AI generated PRs have low, or even non-existent entry level. Human generated PRs require you to be motivated, do research, familiarise yourself with code, make effort to write the code and test it.

Low effort or unqualified code increases the burden of review and testing on maintainers, who are limited in time.

Contributors must:

- Read and review all generated code and documentation before raising a PR
- Fully understand all code and documentation
- Be able to answer any questions during review

## AI Generated PR Rules

The PR description and comments must be written by the contributor, with no AI assistance beyond grammar or English translations.

The description must:

- Describe the solution design, justifying all decisions
- Clearly state which AI was used
- List which code and documentation was written by a human and which was written by AI
- Detail all testing performed

There must be far greater than usual number of detailed, explicit comments:

- File level: overview of the changes made
- Line level: 1-2 comments per function/method

Do not enable or use any AI review tools (e.g. Copilot) on the Pull Request.


================================================
FILE: LICENSE
================================================
nvim-tree.lua is a file explorer / filesystem tree view plugin for neovim
Copyright © 2019 Yazdani Kiyan

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.


================================================
FILE: Makefile
================================================
all: lint style check

#
# mandatory checks
#
lint: luacheck

style: style-check style-doc

check: luals

#
# subtasks
#
luacheck:
	luacheck --codes --quiet lua --exclude-files "**/_meta/**"

style-check:
	scripts/luals-check.sh codestyle-check

style-doc:
	scripts/doc-comments.sh

luals:
	scripts/luals-check.sh

#
# format
#
format-fix:
	CodeFormat format --config .editorconfig --workspace lua

format-check:
	CodeFormat format --config .editorconfig --workspace lua
	git diff --exit-code lua

#
# utility
#
help-update:
	scripts/vimdoc.sh doc
	scripts/help-defaults.sh

#
# CI
# --ignore-blank-lines is used as nightly has removed unnecessary blank lines that stable (0.11.5) currently inserts
#
help-check: help-update
	scripts/vimdoc.sh lintdoc
	git diff --ignore-blank-lines --exit-code doc/nvim-tree-lua.txt


.PHONY: all lint style check luacheck style-check style-doc luals format-fix format-check help-update help-check



================================================
FILE: README.md
================================================
# A File Explorer For Neovim Written In Lua

[![CI](https://github.com/nvim-tree/nvim-tree.lua/actions/workflows/ci.yml/badge.svg)](https://github.com/nvim-tree/nvim-tree.lua/actions/workflows/ci.yml)

<img align="left" width="199" height="598" src="https://user-images.githubusercontent.com/1505378/232662694-8dc494e0-24da-497a-8541-29344293378c.png">
<img align="left" width="199" height="598" src="https://user-images.githubusercontent.com/1505378/232662698-2f321315-c67a-486b-85d8-8c391de52392.png">

   Automatic updates

   File type icons

   Git integration

   Diagnostics integration: LSP and COC

   (Live) filtering

   Cut, copy, paste, rename, delete, create

   Highly customisable

<br clear="left"/>
<br />

Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for Showcases, Tips, Recipes and more.

Questions and general support: [Discussions](https://github.com/nvim-tree/nvim-tree.lua/discussions)

<!-- 
https://github.com/jonschlinkert/markdown-toc
markdown-toc --maxdepth=2 -i README.md
-->

<!-- toc -->

- [Requirements](#requirements)
- [Installing](#installing)
- [Quick Start](#quick-start)
  * [Setup](#setup)
  * [Help](#help)
  * [Custom Mappings](#custom-mappings)
  * [Highlight Groups](#highlight-groups)
- [Commands](#commands)
- [Roadmap](#roadmap)
- [API](#api)
- [Contributing](#contributing)
- [Screenshots](#screenshots)
- [Team](#team)

<!-- tocstop -->

# Requirements

[neovim >=0.9.0](https://github.com/neovim/neovim/wiki/Installing-Neovim)

[nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons) is optional and used to display file icons. It requires a [patched font](https://www.nerdfonts.com/). Your terminal emulator must be configured to use that font, usually "Hack Nerd Font"

# Installing

Please install via your preferred package manager. See [Installation](https://github.com/nvim-tree/nvim-tree.lua/wiki/Installation) for some specific package manager instructions.

Major or minor versions may be specified via tags: `v<MAJOR>` e.g. `v1` or `v<MAJOR>.<MINOR>` e.g. `v1.23`

# Quick Start

Install the plugins via your package manager:
  `"nvim-tree/nvim-tree.lua"`
  `"nvim-tree/nvim-web-devicons"`

Disabling [netrw](https://neovim.io/doc/user/pi_netrw.html) is strongly advised, see [:help nvim-tree-netrw](doc/nvim-tree-lua.txt)

## Setup

Setup the plugin in your `init.lua`.

See [:help nvim-tree-setup](doc/nvim-tree-lua.txt) and [:help nvim-tree-config-default](doc/nvim-tree-lua.txt)

```lua
  -- disable netrw at the very start of your init.lua
  vim.g.loaded_netrw = 1
  vim.g.loaded_netrwPlugin = 1

  -- optionally enable 24-bit colour
  vim.opt.termguicolors = true

  -- empty setup using defaults
  require("nvim-tree").setup()

  -- OR setup with a config

  ---@type nvim_tree.config
  local config = {
    sort = {
      sorter = "case_sensitive",
    },
    view = {
      width = 30,
    },
    renderer = {
      group_empty = true,
    },
    filters = {
      dotfiles = true,
    },
  }
  require("nvim-tree").setup(config)
```

## Help

Open the tree:  `:NvimTreeOpen`

Show the mappings:  `g?`

## Custom Mappings

[:help nvim-tree-mappings-default](doc/nvim-tree-lua.txt) are applied by default however you may customise via [:help nvim_tree.config](doc/nvim-tree-lua.txt) `{on_attach}` e.g.

```lua
  local function my_on_attach(bufnr)
    local api = require "nvim-tree.api"

    local function opts(desc)
      return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
    end

    -- default mappings
    api.map.on_attach.default(bufnr)

    -- custom mappings
    vim.keymap.set("n", "<C-t>", api.tree.change_root_to_parent,        opts("Up"))
    vim.keymap.set("n", "?",     api.tree.toggle_help,                  opts("Help"))
  end

  -- pass to setup along with your other config
  require("nvim-tree").setup({
    ---
    on_attach = my_on_attach,
    ---
  })
```

## Highlight Groups

See [:help nvim-tree-highlight-groups](doc/nvim-tree-lua.txt)

Run `:NvimTreeHiTest` to show all the highlights that nvim-tree uses.

They can be customised before or after setup is called and will be immediately
applied at runtime. e.g.

```lua
  vim.cmd([[
      :hi      NvimTreeExecFile    guifg=#ffa0a0
      :hi      NvimTreeSpecialFile guifg=#ff80ff gui=underline
      :hi      NvimTreeSymlink     guifg=Yellow  gui=italic
      :hi link NvimTreeImageFile   Title
  ]])
```

# Commands

See [:help nvim-tree-commands](doc/nvim-tree-lua.txt)

Some commands may be executed with a bang `!` or take a `path` string argument.

All commands execute public API.

Some basic commands:

`:NvimTreeFocus`                           [:help nvim_tree.api.tree.open()](doc/nvim-tree-lua.txt)
```lua
  require("nvim-tree.api").tree.open()
```

`:NvimTreeToggle`                          [:help nvim_tree.api.tree.toggle()](doc/nvim-tree-lua.txt)
```lua
  require("nvim-tree.api").tree.toggle({
    path = "<args>",
    find_file = false,
    update_root = false,
    focus = true,
  })
```

`:NvimTreeFindFile`                        [:help nvim_tree.api.tree.find_file()](doc/nvim-tree-lua.txt)
```lua
  require("nvim-tree.api").tree.find_file({
    open = true,
    update_root = "<bang>",
    focus = true,
  })
```

`:NvimTreeCollapse`                        [:help nvim_tree.api.tree.collapse_all()](doc/nvim-tree-lua.txt)

```lua
  require("nvim-tree.api").tree.collapse_all({
    keep_buffers = false
  })
```

# Roadmap

nvim-tree is stable and new major features will not be added. The focus is on existing user experience.

Users are encouraged to add their own custom features via the public [API](#api).

Development is focused on:
- Bug fixes
- Performance
- Quality of Life improvements
- API / Events
- Enhancements to existing features
- Multi-instance capabilities

# API

nvim-tree exposes a public API. This is non breaking, with additions made as necessary. See [:help nvim-tree-api](doc/nvim-tree-lua.txt)

See wiki [Recipes](https://github.com/nvim-tree/nvim-tree.lua/wiki/Recipes) and [Tips](https://github.com/nvim-tree/nvim-tree.lua/wiki/Tips) for ideas and inspiration.

Please raise a [feature request](https://github.com/nvim-tree/nvim-tree.lua/issues/new?assignees=&labels=feature+request&template=feature_request.md&title=) if the API is insufficient for your needs. Contributions are always welcome, see below.

You may also subscribe to events that nvim-tree will dispatch in a variety of situations, see [:help nvim-tree-events](doc/nvim-tree-lua.txt)

# Contributing

PRs are always welcome. See [CONTRIBUTING](CONTRIBUTING.md) and [wiki: Development](https://github.com/nvim-tree/nvim-tree.lua/wiki/Development) to get started.

See [bug](https://github.com/nvim-tree/nvim-tree.lua/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and [PR Please](https://github.com/nvim-tree/nvim-tree.lua/issues?q=is%3Aopen+is%3Aissue+label%3A%22PR+please%22) issues if you are looking for some work to get you started.

# Screenshots

See [Showcases](https://github.com/nvim-tree/nvim-tree.lua/wiki/Showcases) wiki page for examples of user's configurations with sources.

Please add your own!

# Team

* [@alex-courtis](https://github.com/alex-courtis) Arch Linux
* [@gegoune](https://github.com/gegoune) macOS
* [@Akmadan23](https://github.com/Akmadan23) Linux
* [@dependabot[bot]](https://github.com/apps/dependabot) Ubuntu Linux


================================================
FILE: doc/.gitignore
================================================
tags


================================================
FILE: doc/nvim-tree-lua.txt
================================================
*nvim-tree-lua.txt*       A File Explorer For Nvim        *nvim_tree*  *nvim-tree*

Author: Yazdani Kiyan
                                       Type |gO| to see the table of contents.
Help tag prefixes:
• `nvim-tree-`  Help Sections e.g.
  • |nvim-tree-mappings|
  • |nvim-tree-config|
• `nvim_tree.`  API and classes e.g.
  • |nvim_tree.api.node.navigate.parent()|
  • |nvim_tree.config.filesystem_watchers|

==============================================================================
Introduction                                          *nvim-tree-introduction*

Features

    - Automatic updates
    - File type icons
    - Git integration
    - Diagnostics integration: LSP and COC
    - (Live) filtering
    - Cut, copy, paste, rename, delete, create
    - Highly customisable

File Icons

    https://github.com/nvim-tree/nvim-web-devicons is optional and used to display file icons.
    It requires a patched font: https://www.nerdfonts.com
    Your terminal emulator must be configured to use that font, usually "Hack Nerd Font"

     should look like an open folder.

    Disable the display of icons with |nvim_tree.config.renderer.icons.show|

Colours

    Syntax highlighting uses g:terminal_color_ from colorschemes, falls back to
    ugly colors otherwise.

Git Integration

    One or two icons for git status. When two are shown, the left is staged.

      ✗  unstaged
      ✓  staged
        unmerged
      ➜  renamed
      ★  untracked
        deleted
      ◌  ignored

Requirements

    Nvim >= 0.9

==============================================================================
Quickstart                                              *nvim-tree-quickstart*

Install the plugins via your package manager:
  `"nvim-tree/nvim-tree.lua"`
  `"nvim-tree/nvim-web-devicons"`

Disabling |netrw| is strongly advised, see |nvim-tree-netrw|

==============================================================================
Quickstart: Setup                                 *nvim-tree-quickstart-setup*

Setup the plugin in your `init.lua`.

See |nvim-tree-setup| and |nvim-tree-config-default| >lua

  -- disable netrw at the very start of your init.lua
  vim.g.loaded_netrw = 1
  vim.g.loaded_netrwPlugin = 1

  -- optionally enable 24-bit colour
  vim.opt.termguicolors = true

  -- empty setup using defaults
  require("nvim-tree").setup()

  -- OR setup with a config

  ---@type nvim_tree.config
  local config = {
    sort = {
      sorter = "case_sensitive",
    },
    view = {
      width = 30,
    },
    renderer = {
      group_empty = true,
    },
    filters = {
      dotfiles = true,
    },
  }
  require("nvim-tree").setup(config)
<
==============================================================================
Quickstart: Help                                   *nvim-tree-quickstart-help*

Open the tree:  `:NvimTreeOpen`

Show the mappings:  `g?`

 `<C-]>`           n    CD                         |nvim_tree.api.tree.change_root_to_node()|
 `<C-e>`           n    Open: In Place             |nvim_tree.api.node.open.replace_tree_buffer()|
 `<C-k>`           n    Info                       |nvim_tree.api.node.show_info_popup()|
 `<C-r>`           n    Rename: Omit Filename      |nvim_tree.api.fs.rename_sub()|
 `<C-t>`           n    Open: New Tab              |nvim_tree.api.node.open.tab()|
 `<C-v>`           n    Open: Vertical Split       |nvim_tree.api.node.open.vertical()|
 `<C-x>`           n    Open: Horizontal Split     |nvim_tree.api.node.open.horizontal()|
 `<BS>`            n    Close Directory            |nvim_tree.api.node.navigate.parent_close()|
 `<CR>`            n    Open                       |nvim_tree.api.node.open.edit()|
 `<Del>`           nx   Delete                     |nvim_tree.api.fs.remove()|
 `<Tab>`           n    Open Preview               |nvim_tree.api.node.open.preview()|
 `>`               n    Next Sibling               |nvim_tree.api.node.navigate.sibling.next()|
 `<`               n    Previous Sibling           |nvim_tree.api.node.navigate.sibling.prev()|
 `.`               n    Run Command                |nvim_tree.api.node.run.cmd()|
 `-`               n    Up                         |nvim_tree.api.tree.change_root_to_parent()|
 `a`               n    Create File Or Directory   |nvim_tree.api.fs.create()|
 `bd`              n    Delete Bookmarked          |nvim_tree.api.marks.bulk.delete()|
 `bt`              n    Trash Bookmarked           |nvim_tree.api.marks.bulk.trash()|
 `bmv`             n    Move Bookmarked            |nvim_tree.api.marks.bulk.move()|
 `B`               n    Toggle Filter: No Buffer   |nvim_tree.api.filter.no_buffer.toggle()|
 `c`               nx   Copy                       |nvim_tree.api.fs.copy.node()|
 `C`               n    Toggle Filter: Git Clean   |nvim_tree.api.filter.git.clean.toggle()|
 `[c`              n    Prev Git                   |nvim_tree.api.node.navigate.git.prev()|
 `]c`              n    Next Git                   |nvim_tree.api.node.navigate.git.next()|
 `d`               nx   Delete                     |nvim_tree.api.fs.remove()|
 `D`               nx   Trash                      |nvim_tree.api.fs.trash()|
 `E`               n    Expand All                 |nvim_tree.api.tree.expand_all()|
 `e`               n    Rename: Basename           |nvim_tree.api.fs.rename_basename()|
 `]e`              n    Next Diagnostic            |nvim_tree.api.node.navigate.diagnostics.next()|
 `[e`              n    Prev Diagnostic            |nvim_tree.api.node.navigate.diagnostics.prev()|
 `F`               n    Live Filter: Clear         |nvim_tree.api.filter.live.clear()|
 `f`               n    Live Filter: Start         |nvim_tree.api.filter.live.start()|
 `g?`              n    Help                       |nvim_tree.api.tree.toggle_help()|
 `gy`              n    Copy Absolute Path         |nvim_tree.api.fs.copy.absolute_path()|
 `ge`              n    Copy Basename              |nvim_tree.api.fs.copy.basename()|
 `H`               n    Toggle Filter: Dotfiles    |nvim_tree.api.filter.dotfiles.toggle()|
 `I`               n    Toggle Filter: Git Ignored |nvim_tree.api.filter.git.ignored.toggle()|
 `J`               n    Last Sibling               |nvim_tree.api.node.navigate.sibling.last()|
 `K`               n    First Sibling              |nvim_tree.api.node.navigate.sibling.first()|
 `L`               n    Toggle Group Empty         |nvim_tree.api.node.open.toggle_group_empty()|
 `M`               n    Toggle Filter: No Bookmark |nvim_tree.api.filter.no_bookmark.toggle()|
 `m`               nx   Toggle Bookmark            |nvim_tree.api.marks.toggle()|
 `o`               n    Open                       |nvim_tree.api.node.open.edit()|
 `O`               n    Open: No Window Picker     |nvim_tree.api.node.open.no_window_picker()|
 `p`               n    Paste                      |nvim_tree.api.fs.paste()|
 `P`               n    Parent Directory           |nvim_tree.api.node.navigate.parent()|
 `q`               n    Close                      |nvim_tree.api.tree.close()|
 `r`               n    Rename                     |nvim_tree.api.fs.rename()|
 `R`               n    Refresh                    |nvim_tree.api.tree.reload()|
 `s`               n    Run System                 |nvim_tree.api.node.run.system()|
 `S`               n    Search                     |nvim_tree.api.tree.search_node()|
 `u`               n    Rename: Full Path          |nvim_tree.api.fs.rename_full()|
 `U`               n    Toggle Filter: Custom      |nvim_tree.api.filter.custom.toggle()|
 `W`               n    Collapse All               |nvim_tree.api.tree.collapse_all()|
 `x`               nx   Cut                        |nvim_tree.api.fs.cut()|
 `y`               n    Copy Name                  |nvim_tree.api.fs.copy.filename()|
 `Y`               n    Copy Relative Path         |nvim_tree.api.fs.copy.relative_path()|
 `<2-LeftMouse>`   n    Open                       |nvim_tree.api.node.open.edit()|
 `<2-RightMouse>`  n    CD                         |nvim_tree.api.tree.change_root_to_node()|

==============================================================================
Quickstart: Custom Mappings             *nvim-tree-quickstart-custom-mappings*

|nvim-tree-mappings-default| are applied by default however you may customise
via |nvim_tree.config| {on_attach} e.g. >lua

  local function my_on_attach(bufnr)
    local api = require "nvim-tree.api"

    local function opts(desc)
      return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
    end

    -- default mappings
    api.map.on_attach.default(bufnr)

    -- custom mappings
    vim.keymap.set("n", "<C-t>", api.tree.change_root_to_parent,        opts("Up"))
    vim.keymap.set("n", "?",     api.tree.toggle_help,                  opts("Help"))
  end

  -- pass to setup along with your other config
  require("nvim-tree").setup({
    ---
    on_attach = my_on_attach,
    ---
  })
<
==============================================================================
Quickstart: Highlight Groups                  *nvim-tree-quickstart-highlight*

Run |:NvimTreeHiTest| to show all the highlights that nvim-tree uses.

They can be customised before or after setup is called and will be immediately
applied at runtime. e.g. >lua

  vim.cmd([[
      :hi      NvimTreeExecFile    guifg=#ffa0a0
      :hi      NvimTreeSpecialFile guifg=#ff80ff gui=underline
      :hi      NvimTreeSymlink     guifg=Yellow  gui=italic
      :hi link NvimTreeImageFile   Title
  ]])
<
See |nvim-tree-highlight-groups| for details.

==============================================================================
Commands                                                  *nvim-tree-commands*

Some commands may be executed with a |<bang>| `!` or take a `path` string argument.

All commands execute public API.

*:NvimTreeOpen*                            |nvim_tree.api.tree.open()| >lua

  require("nvim-tree.api").tree.open({
    path = "<args>"
  })
<
*:NvimTreeClose*                           |nvim_tree.api.tree.close()| >lua

  require("nvim-tree.api").tree.close()
<
*:NvimTreeToggle*                          |nvim_tree.api.tree.toggle()| >lua

  require("nvim-tree.api").tree.toggle({
    path = "<args>",
    find_file = false,
    update_root = false,
    focus = true,
  })
<
*:NvimTreeFocus*                           |nvim_tree.api.tree.open()| >lua

  require("nvim-tree.api").tree.open()
<
*:NvimTreeRefresh*                         |nvim_tree.api.tree.reload()| >lua

  require("nvim-tree.api").tree.reload()
<
*:NvimTreeFindFile*                        |nvim_tree.api.tree.find_file()| >lua

  require("nvim-tree.api").tree.find_file({
    open = true,
    update_root = "<bang>",
    focus = true,
  })
<
*:NvimTreeFindFileToggle*                  |nvim_tree.api.tree.toggle()| >lua

  require("nvim-tree.api").tree.toggle({
    path = "<args>",
    find_file = true,
    update_root = "<bang>",
    focus = true,
  })
<
*:NvimTreeClipboard*                       |nvim_tree.api.fs.print_clipboard()| >lua

  require("nvim-tree.api").fs.print_clipboard()
<
*:NvimTreeCollapse*                        |nvim_tree.api.tree.collapse_all()| >lua

  require("nvim-tree.api").tree.collapse_all({
    keep_buffers = false
  })
<
*:NvimTreeCollapseKeepBuffers*             |nvim_tree.api.tree.collapse_all()| >lua

  require("nvim-tree.api").tree.collapse_all({
    keep_buffers = true
  })
<
*:NvimTreeHiTest*                         |nvim_tree.api.appearance.hi_test()| >lua

  require("nvim-tree.api").appearance.hi_test()
<
*:NvimTreeResize*                          |nvim_tree.api.tree.resize()| >lua

  local sign = c.args:sub(1, 1)
  if sign == "+" or sign == "-" then
    require("nvim-tree.api").tree.resize({ relative = tonumber(c.args) })
  else
    require("nvim-tree.api").tree.resize({ absolute = tonumber(c.args) })
  end
<

==============================================================================
Setup                                                        *nvim-tree-setup*

You must run the `setup()` function once to initialise nvim-tree. It may be
called again to apply a change in configuration without restarting Nvim.

The `setup()` function takes one optional argument: |nvim_tree.config|. If
omitted nvim-tree will be initialised with default configuration:
|nvim-tree-config-default|.

Config can be validated with |lsp| when passed directly e.g. >lua

  require("nvim-tree").setup({
    hijack_cursor = true,
  })
<
or as a typed variable e.g. >lua

  ---@type nvim_tree.config
  local config = {
    hijack_cursor = true,
  }
  require("nvim-tree").setup(config)
<
The first `setup()` call is cheap: it does nothing more than validate / apply
the configuration. Nothing happens until the tree is first opened.

Subsequent `setup()` calls are expensive as they tear down the world before
applying configuration.

==============================================================================
Mappings                                                  *nvim-tree-mappings*

Mappings are set via the |nvim_tree.config| {on_attach} function, which is run upon
creating the nvim-tree buffer. Mappings are usually |nvim-tree-api| functions
however may be your own.

When {on_attach} is not a function, |nvim-tree-mappings-default| will be used.

Active mappings may be viewed via HELP, default `g?`. The mapping's description
is used when displaying HELP.

The `on_attach` function is passed the `bufnr` of nvim-tree. Use
|vim.keymap.set()| or |nvim_set_keymap()| to define mappings as usual. e.g. >lua

  local function my_on_attach(bufnr)
    local api = require("nvim-tree.api")

    local function opts(desc)
      return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
    end

    -- copy default mappings here from defaults in next section
    vim.keymap.set("n", "<C-]>", api.tree.change_root_to_node,          opts("CD"))
    vim.keymap.set("n", "<C-e>", api.node.open.replace_tree_buffer,     opts("Open: In Place"))
    ---
    -- OR use all default mappings
    api.map.on_attach.default(bufnr)

    -- remove a default
    vim.keymap.del("n", "<C-]>", { buffer = bufnr })

    -- override a default
    vim.keymap.set("n", "<C-e>", api.tree.reload,                       opts("Refresh"))

    -- add your mappings
    vim.keymap.set("n", "?",     api.tree.toggle_help,                  opts("Help"))
    ---
  end

  require("nvim-tree").setup({
    ---
    on_attach = my_on_attach,
    ---
  })
<
Single left mouse mappings can be achieved via `<LeftRelease>`.

Single right / middle mouse mappings will require changes to |'mousemodel'| or |'mouse'|.

|vim.keymap.set()| {rhs} is a `(function|string)` thus it may be necessary to
define your own function to map complex functionality e.g. >lua

  local function print_node_path()
    local api = require("nvim-tree.api")
    local node = api.tree.get_node_under_cursor()
    print(node.absolute_path)
  end

  -- on_attach
  vim.keymap.set("n", "<C-P>", print_node_path, opts("Print Path"))
<
==============================================================================
Mappings: Default                                 *nvim-tree-mappings-default*

In the absence of an |nvim_tree.config| {on_attach} function, the following
defaults will be applied.

You are encouraged to copy these to your {on_attach} function. >lua

  local api = require("nvim-tree.api")

  local function opts(desc)
    return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
  end

  -- BEGIN_ON_ATTACH_DEFAULT
  vim.keymap.set("n",          "<C-]>",          api.tree.change_root_to_node,       opts("CD"))
  vim.keymap.set("n",          "<C-e>",          api.node.open.replace_tree_buffer,  opts("Open: In Place"))
  vim.keymap.set("n",          "<C-k>",          api.node.show_info_popup,           opts("Info"))
  vim.keymap.set("n",          "<C-r>",          api.fs.rename_sub,                  opts("Rename: Omit Filename"))
  vim.keymap.set("n",          "<C-t>",          api.node.open.tab,                  opts("Open: New Tab"))
  vim.keymap.set("n",          "<C-v>",          api.node.open.vertical,             opts("Open: Vertical Split"))
  vim.keymap.set("n",          "<C-x>",          api.node.open.horizontal,           opts("Open: Horizontal Split"))
  vim.keymap.set("n",          "<BS>",           api.node.navigate.parent_close,     opts("Close Directory"))
  vim.keymap.set("n",          "<CR>",           api.node.open.edit,                 opts("Open"))
  vim.keymap.set({ "n", "x" }, "<Del>",          api.fs.remove,                      opts("Delete"))
  vim.keymap.set("n",          "<Tab>",          api.node.open.preview,              opts("Open Preview"))
  vim.keymap.set("n",          ">",              api.node.navigate.sibling.next,     opts("Next Sibling"))
  vim.keymap.set("n",          "<",              api.node.navigate.sibling.prev,     opts("Previous Sibling"))
  vim.keymap.set("n",          ".",              api.node.run.cmd,                   opts("Run Command"))
  vim.keymap.set("n",          "-",              api.tree.change_root_to_parent,     opts("Up"))
  vim.keymap.set("n",          "a",              api.fs.create,                      opts("Create File Or Directory"))
  vim.keymap.set("n",          "bd",             api.marks.bulk.delete,              opts("Delete Bookmarked"))
  vim.keymap.set("n",          "bt",             api.marks.bulk.trash,               opts("Trash Bookmarked"))
  vim.keymap.set("n",          "bmv",            api.marks.bulk.move,                opts("Move Bookmarked"))
  vim.keymap.set("n",          "B",              api.filter.no_buffer.toggle,        opts("Toggle Filter: No Buffer"))
  vim.keymap.set({ "n", "x" }, "c",              api.fs.copy.node,                   opts("Copy"))
  vim.keymap.set("n",          "C",              api.filter.git.clean.toggle,        opts("Toggle Filter: Git Clean"))
  vim.keymap.set("n",          "[c",             api.node.navigate.git.prev,         opts("Prev Git"))
  vim.keymap.set("n",          "]c",             api.node.navigate.git.next,         opts("Next Git"))
  vim.keymap.set({ "n", "x" }, "d",              api.fs.remove,                      opts("Delete"))
  vim.keymap.set({ "n", "x" }, "D",              api.fs.trash,                       opts("Trash"))
  vim.keymap.set("n",          "E",              api.tree.expand_all,                opts("Expand All"))
  vim.keymap.set("n",          "e",              api.fs.rename_basename,             opts("Rename: Basename"))
  vim.keymap.set("n",          "]e",             api.node.navigate.diagnostics.next, opts("Next Diagnostic"))
  vim.keymap.set("n",          "[e",             api.node.navigate.diagnostics.prev, opts("Prev Diagnostic"))
  vim.keymap.set("n",          "F",              api.filter.live.clear,              opts("Live Filter: Clear"))
  vim.keymap.set("n",          "f",              api.filter.live.start,              opts("Live Filter: Start"))
  vim.keymap.set("n",          "g?",             api.tree.toggle_help,               opts("Help"))
  vim.keymap.set("n",          "gy",             api.fs.copy.absolute_path,          opts("Copy Absolute Path"))
  vim.keymap.set("n",          "ge",             api.fs.copy.basename,               opts("Copy Basename"))
  vim.keymap.set("n",          "H",              api.filter.dotfiles.toggle,         opts("Toggle Filter: Dotfiles"))
  vim.keymap.set("n",          "I",              api.filter.git.ignored.toggle,      opts("Toggle Filter: Git Ignored"))
  vim.keymap.set("n",          "J",              api.node.navigate.sibling.last,     opts("Last Sibling"))
  vim.keymap.set("n",          "K",              api.node.navigate.sibling.first,    opts("First Sibling"))
  vim.keymap.set("n",          "L",              api.node.open.toggle_group_empty,   opts("Toggle Group Empty"))
  vim.keymap.set("n",          "M",              api.filter.no_bookmark.toggle,      opts("Toggle Filter: No Bookmark"))
  vim.keymap.set({ "n", "x" }, "m",              api.marks.toggle,                   opts("Toggle Bookmark"))
  vim.keymap.set("n",          "o",              api.node.open.edit,                 opts("Open"))
  vim.keymap.set("n",          "O",              api.node.open.no_window_picker,     opts("Open: No Window Picker"))
  vim.keymap.set("n",          "p",              api.fs.paste,                       opts("Paste"))
  vim.keymap.set("n",          "P",              api.node.navigate.parent,           opts("Parent Directory"))
  vim.keymap.set("n",          "q",              api.tree.close,                     opts("Close"))
  vim.keymap.set("n",          "r",              api.fs.rename,                      opts("Rename"))
  vim.keymap.set("n",          "R",              api.tree.reload,                    opts("Refresh"))
  vim.keymap.set("n",          "s",              api.node.run.system,                opts("Run System"))
  vim.keymap.set("n",          "S",              api.tree.search_node,               opts("Search"))
  vim.keymap.set("n",          "u",              api.fs.rename_full,                 opts("Rename: Full Path"))
  vim.keymap.set("n",          "U",              api.filter.custom.toggle,           opts("Toggle Filter: Custom"))
  vim.keymap.set("n",          "W",              api.tree.collapse_all,              opts("Collapse All"))
  vim.keymap.set({ "n", "x" }, "x",              api.fs.cut,                         opts("Cut"))
  vim.keymap.set("n",          "y",              api.fs.copy.filename,               opts("Copy Name"))
  vim.keymap.set("n",          "Y",              api.fs.copy.relative_path,          opts("Copy Relative Path"))
  vim.keymap.set("n",          "<2-LeftMouse>",  api.node.open.edit,                 opts("Open"))
  vim.keymap.set("n",          "<2-RightMouse>", api.tree.change_root_to_node,       opts("CD"))
  -- END_ON_ATTACH_DEFAULT
<
Alternatively, you may apply these default mappings from your
|nvim_tree.config| {on_attach} via |nvim_tree.api.map.on_attach.default()| e.g. >lua

  local function my_on_attach(bufnr)
    local api = require("nvim-tree.api")

    local function opts(desc)
      return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
    end

    api.map.on_attach.default(bufnr)

    -- your removals and mappings go here
  end
<

==============================================================================
Icons And Highlighting                          *nvim-tree-icons-highlighting*

Icons may be displayed before files and directories.

Additional icons and highlighting may be displayed to indicate various states
for files and and directories. Highlighting is additive.

Decorators are responsible for providing the icons and highlighting. They
apply additively in order of precedence.

`DECORATOR`
  See |nvim_tree.config.renderer.decorator| for available decorators and their
  default precedence.

`ICON?`
  Enable via |nvim_tree.config.renderer.icons.show

`REQUIRES`
  Features that must be enabled to show icons and highlighting.

`PLACEMENT`
  Where to place icons: |nvim_tree.config.renderer.icons.placement|

`HIGHLIGHT`
  What should be highlighted: |nvim_tree.config.renderer.highlight|

`DEVICONS?`
  Glyphs and their colors will be overridden by optional plugin:
  `nvim-tree/nvim-web-devicons`
  See |nvim_tree.config.renderer.icons.web_devicons|

`GLYPHS`
  Icon glyphs definitions.

`GROUPS`
  Applicable highlight groups: |nvim-tree-highlight-groups|

Some defaults noted. In ascending order of default decorator additive
precedence:

`WHAT          DECORATOR     ICON?            REQUIRES                      PLACEMENT                             HIGHLIGHT                        GLYPHS                                              DEVICONS?  GROUPS`
File Icon      -            {file}       Y    -                             -                                     -                               |nvim_tree.config.renderer.icons.glyphs| {default}    Y          `NvimTreeNormal`, `NvimTreeFileIcon`
Folder Icon    -            {folder}     Y    -                             -                                     -                               |nvim_tree.config.renderer.icons.glyphs.folder|       Y          `NvimTree*FolderName`, `NvimTree*FolderIcon`
Git Status    `"Git"`         {git}        Y   |nvim_tree.config.git|          {git_placement}        `"before"`       {highlight_git}         `"none"`   |nvim_tree.config.renderer.icons.glyphs.git|          N          `NvimTreeGit*`
|bufloaded()|   `"Open"`         -                -                             -                                    {highlight_opened_files}`"none"`    -                                                  N         ` NvimTreeOpened*`
Dotfiles      `"Hidden"`      {hidden}     N    -                            {hidden_placement}     `"after"`        {highlight_hidden}      `"none"`   |nvim_tree.config.renderer.icons.glyphs| {hidden}     N          `NvimTreeHidden*`
|'modified'|    `"Modified"`    {modified}   Y   |nvim_tree.config.modified|     {modified_placement}   `"after"`        {highlight_modified}    `"none"`   |nvim_tree.config.renderer.icons.glyphs| {modified}   N          `NvimTreeModified*`
Bookmarked    `"Bookmark"`    {bookmarks}  Y    -                            {bookmarks_placement}  `"signcolumn"`   {highlight_bookmarks}   `"none"`   |nvim_tree.config.renderer.icons.glyphs| {bookmark}   N          `NvimTreeBookmark*`
Diag Status  ` "Diagnostics"` {diagnostics}Y   |nvim_tree.config.diagnostics|  {diagnostics_placement}`"signcolumn"`   {highlight_diagnostics} `"none" `  |nvim_tree.config.diagnostics.icons|                  N          `NvimTreeDiagnostic*`
Copied        `"Copied"`       -                -                             -                                    {highlight_clipboard}   `"name"`    -                                                  N          `NvimTreeCopiedHL`
Cut           `"Cut"`          -                -                             -                                    {highlight_clipboard}   `"name"`    -                                                  N          `NvimTreeCutHL`


==============================================================================
Highlight Groups                                  *nvim-tree-highlight-groups*

All the following highlight groups can be configured by hand. Aside from
`NvimTreeWindowPicker`, it is not advised to colorize the background of these
groups.

Example |:highlight| >vim
    :hi NvimTreeSymlink guifg=blue gui=bold,underline
<
It is recommended to enable |'termguicolors'| for the more pleasant 24-bit
colours.

To view the nvim-tree highlight groups run |:NvimTreeHiTest|

To view all active highlight groups run `:so $VIMRUNTIME/syntax/hitest.vim`
as per |:highlight|

The `*HL` groups are additive, following |nvim_tree.config.renderer.decorator|
precedence.
Only present attributes will clobber each other.
In this example a modified, opened file will have magenta text, with cyan
undercurl: >vim
    :hi NvimTreeOpenedHL       guifg=magenta guisp=red  gui=underline
    :hi NvimTreeModifiedFileHL               guisp=cyan gui=undercurl
<
To prevent usage of a highlight:

- Before setup: link the group to `Normal` e.g. >vim
    :hi NvimTreeExecFile Normal
<
- After setup: link it to `NONE`, to override the default link e.g. >lua
    :hi! link NvimTreeExecFile NONE
<
==============================================================================
Highlight Groups: Default                 *nvim-tree-highlight-groups-default*

|:highlight-link| `default` or |:highlight-default| define the groups on setup:

Standard: >
    NvimTreeNormal              Normal
    NvimTreeNormalFloat         NormalFloat
    NvimTreeNormalNC            NormalFloat

    NvimTreeLineNr              LineNr
    NvimTreeWinSeparator        WinSeparator
    NvimTreeEndOfBuffer         EndOfBuffer
    NvimTreePopup               Normal
    NvimTreeSignColumn          NvimTreeNormal

    NvimTreeCursorColumn        CursorColumn
    NvimTreeCursorLine          CursorLine
    NvimTreeCursorLineNr        CursorLineNr

    NvimTreeStatusLine          StatusLine
    NvimTreeStatusLineNC        StatusLineNC
<
File Text: >
    NvimTreeExecFile            SpellCap
    NvimTreeImageFile           SpellCap
    NvimTreeSpecialFile         SpellCap
    NvimTreeSymlink             SpellCap
<
Folder Text: >
    NvimTreeRootFolder          Title
    NvimTreeFolderName          Directory
    NvimTreeEmptyFolderName     Directory
    NvimTreeOpenedFolderName    Directory
    NvimTreeSymlinkFolderName   Directory
<
File Icons: >
    NvimTreeFileIcon            NvimTreeNormal
    NvimTreeSymlinkIcon         NvimTreeNormal
<
Folder Icons: >
    NvimTreeFolderIcon          guifg=#8094b4 ctermfg=Blue
    NvimTreeOpenedFolderIcon    NvimTreeFolderIcon
    NvimTreeClosedFolderIcon    NvimTreeFolderIcon
    NvimTreeFolderArrowClosed   NvimTreeIndentMarker
    NvimTreeFolderArrowOpen     NvimTreeIndentMarker
<
Indent: >
    NvimTreeIndentMarker        NvimTreeFileIcon
<
Picker: >
    NvimTreeWindowPicker        guifg=#ededed guibg=#4493c8 gui=bold ctermfg=White ctermbg=Cyan
<
Live Filter: >
    NvimTreeLiveFilterPrefix    PreProc
    NvimTreeLiveFilterValue     ModeMsg
<
Clipboard: >
    NvimTreeCopiedHL            SpellRare
    NvimTreeCutHL               SpellBad
<
Bookmarks: >
    NvimTreeBookmarkIcon        NvimTreeFolderIcon
    NvimTreeBookmarkHL          SpellLocal
<
Modified: >
    NvimTreeModifiedIcon        Type
    NvimTreeModifiedFileHL      NvimTreeModifiedIcon
    NvimTreeModifiedFolderHL    NvimTreeModifiedIcon

Hidden: >
    NvimTreeModifiedIcon        Conceal
    NvimTreeModifiedFileHL      NvimTreeHiddenIcon
    NvimTreeModifiedFolderHL    NvimTreeHiddenFileHL
<
Hidden Display: >
    NvimTreeHiddenDisplay       Conceal
<
Opened: >
    NvimTreeOpenedHL            Special
<
Git Icon: >
    NvimTreeGitDeletedIcon      Statement
    NvimTreeGitDirtyIcon        Statement
    NvimTreeGitIgnoredIcon      Comment
    NvimTreeGitMergeIcon        Constant
    NvimTreeGitNewIcon          PreProc
    NvimTreeGitRenamedIcon      PreProc
    NvimTreeGitStagedIcon       Constant
<
Git File File Highlight: >
    NvimTreeGitFileDeletedHL    NvimTreeGitDeletedIcon
    NvimTreeGitFileDirtyHL      NvimTreeGitDirtyIcon
    NvimTreeGitFileIgnoredHL    NvimTreeGitIgnoredIcon
    NvimTreeGitFileMergeHL      NvimTreeGitMergeIcon
    NvimTreeGitFileNewHL        NvimTreeGitNewIcon
    NvimTreeGitFileRenamedHL    NvimTreeGitRenamedIcon
    NvimTreeGitFileStagedHL     NvimTreeGitStagedIcon
<
Git Folder Folder Highlight: >
    NvimTreeGitFolderDeletedHL  NvimTreeGitFileDeletedHL
    NvimTreeGitFolderDirtyHL    NvimTreeGitFileDirtyHL
    NvimTreeGitFolderIgnoredHL  NvimTreeGitFileIgnoredHL
    NvimTreeGitFolderMergeHL    NvimTreeGitFileMergeHL
    NvimTreeGitFolderNewHL      NvimTreeGitFileNewHL
    NvimTreeGitFolderRenamedHL  NvimTreeGitFileRenamedHL
    NvimTreeGitFolderStagedHL   NvimTreeGitFileStagedHL
<
Diagnostics Icon: >
    NvimTreeDiagnosticErrorIcon         DiagnosticError
    NvimTreeDiagnosticWarnIcon          DiagnosticWarn
    NvimTreeDiagnosticInfoIcon          DiagnosticInfo
    NvimTreeDiagnosticHintIcon          DiagnosticHint
<
Diagnostics File Highlight: >
    NvimTreeDiagnosticErrorFileHL       DiagnosticUnderlineError
    NvimTreeDiagnosticWarnFileHL        DiagnosticUnderlineWarn
    NvimTreeDiagnosticInfoFileHL        DiagnosticUnderlineInfo
    NvimTreeDiagnosticHintFileHL        DiagnosticUnderlineHint
<
Diagnostics Folder Highlight: >
    NvimTreeDiagnosticErrorFolderHL     NvimTreeDiagnosticErrorFileHL
    NvimTreeDiagnosticWarnFolderHL      NvimTreeDiagnosticWarnFileHL
    NvimTreeDiagnosticInfoFolderHL      NvimTreeDiagnosticInfoFileHL
    NvimTreeDiagnosticHintFolderHL      NvimTreeDiagnosticHintFileHL
<
==============================================================================
Events                                                      *nvim-tree-events*

nvim-tree will dispatch events whenever an action is made. These events can be
subscribed to through handler functions. This allows for even further
customization of nvim-tree.

A handler for an event is just a function which receives one argument, the
payload of the event. The payload is different for each event type. Refer
to |nvim_tree_registering_handlers| for more information.

*nvim_tree_registering_handlers*

Handlers are registered by calling |nvim_tree.api.events.subscribe()| function
with an |nvim_tree_events_kind|.

e.g. handler for node renamed: >lua

    local api = require("nvim-tree.api")
    local Event = api.events.Event

    api.events.subscribe(Event.NodeRenamed, function(data)
      print("Node renamed from " .. data.old_name .. " to " ..  data.new_name)
    end)
<
*nvim_tree_events_kind*

- Event.Ready
                When NvimTree has been initialized.
                • Note: Handler takes no parameter.

- Event.TreePreOpen
                Invoked before the window and buffer for NvimTree are created
                or opened. Before `Event.TreeOpen`
                • Note: Handler takes no parameter.

- Event.TreeOpen
                Invoked after the NvimTree is opened.
                • Note: Handler takes no parameter.

- Event.TreeClose
                Invoked after the NvimTree is closed, but before the window is
                closed. Dispatched on |WinClosed| event for NvimTree window.
                • Note: Handler takes no parameter.

- Event.Resize - When NvimTree is resized.
                handler parameters: ~
                    size:        `number` size of the view in columns.

- Event.WillRenameNode
                • Note: A node can either be a file or a directory.
                handler parameters: ~
                  {old_name}     `{string}` Absolute path to the old node location.
                  {new_name}     `{string}` Absolute path to the new node location.

- Event.NodeRenamed
                • Note: A node can either be a file or a directory.
                handler parameters: ~
                  {old_name}     `{string}` Absolute path to the old node location.
                  {new_name}     `{string}` Absolute path to the new node location.

- Event.FileCreated
                handler parameters: ~
                  {fname}        `{string}` Absolute path to the created file

- Event.WillCreateFile
                handler parameters: ~
                  {fname}        `{string}` Absolute path to the file to be
                  created

- Event.FileRemoved
                handler parameters: ~
                  {fname}        `{string}` Absolute path to the removed file.

- Event.WillRemoveFile
                handler parameters: ~
                  {fname}        `{string}` Absolute path to the file to be
                  removed

- Event.FolderCreated
                handler parameters: ~
                  {folder_name}  `{string}` Absolute path to the created folder.

- Event.FolderRemoved
                handler parameters: ~
                  {folder_name}  `{string}` Absolute path to the removed folder.

- Event.TreeAttachedPost
                Invoked after the tree's buffer has been created and mappings
                have been applied: |nvim-tree-mappings| or |nvim_tree.config| {on_attach}
                handler parameters: ~
                  {buf}          `{number} `API buffer handle (buffer number)

- Event.TreeRendered
                Invoked every time the tree is redrawn. Normally this event
                happens after `Event.TreeOpen` except that handlers of this
                one will have access to the tree buffer populated with the
                final content.
                handler parameters: ~
                  {bufnr}          `{number} `API buffer handle (buffer number)
                  {winnr}          `{number} `API window handle (window number)

*nvim_tree_events_startup*

There are two special startup events in the form of User autocommands:

`NvimTreeRequired`      first `require("nvim-tree")`
`NvimTreeSetup`         `setup({})` completed

Immediately before firing: a global variable of the same name will be set to a
value of 1.

Example subscription: >lua

  vim.api.nvim_create_autocmd("User", {
    pattern = "NvimTreeRequired",
    callback = function(data)
      ---
    end,
  })
<
==============================================================================
Prompts                                                    *nvim-tree-prompts*

Some NvimTree actions use the builtin |vim.ui.select()| prompt API for
confirmations when the |nvim_tree.config| {select_prompts} option is set.

The API accepts the optional `kind` key as part of the {opts} parameter, which
can can be used to identify the type of prompt, to allow user side
configurations for different types of prompts.

- `nvimtree_overwrite_rename`
    overwrite or rename during |nvim_tree.api.fs.paste()|

- `nvimtree_remove`
    delete during |nvim_tree.api.fs.remove()|

- `nvimtree_trash`
    send to trash during |nvim_tree.api.fs.trash()|

- `nvimtree_bulk_delete`
    delete all bookmarked during |nvim_tree.api.marks.bulk.delete()|

- `nvimtree_bulk_trash`
    send all bookmarked to trash during |nvim_tree.api.marks.bulk.trash()|

==============================================================================
OS Specific Restrictions                               *nvim-tree-os-specific*

Windows WSL and PowerShell
- Trash is synchronized
- Executable file detection is disabled as this is non-performant and can
  freeze Nvim
- Some filesystem watcher error related to permissions will not be reported

Powershell
- Observed Nvim hanging after a runaway (infinite) number of events on a
  single directory. See |nvim_tree.config.filesystem_watchers| {max_events}

==============================================================================
netrw                                                        *nvim-tree-netrw*

|netrw| is a standard Nvim plugin that is enabled by default. It provides,
amongst other functionality, a file/directory browser.

It interferes with nvim-tree and the intended user experience is nvim-tree
replacing the |netrw| browser.

It is strongly recommended to disable |netrw|. As it is a bundled plugin it
must be disabled manually at the start of your `init.lua` as per |netrw-noload|: >lua

  vim.g.loaded_netrw       = 1
  vim.g.loaded_netrwPlugin = 1
<
There are many |netrw| features beyond the file browser. If you want to
keep using |netrw| without its browser features please ensure:

|nvim_tree.config| {disable_netrw}` = false`
|nvim_tree.config| {hijack_netrw}`  = true`

==============================================================================
Legacy                                                      *nvim-tree-legacy*

Backwards compatible, silent refactors have been done.

==============================================================================
Legacy: Config                                       *nvim-tree-legacy-config*

Legacy config is translated to the current, making type and value changes as
needed.

`update_cwd`                         |nvim_tree.config| {sync_root_with_cwd}
`update_focused_file.update_cwd`     |nvim_tree.config.update_focused_file| {update_root}
`open_on_tab`                        |nvim_tree.config.tab.sync| {open}
`ignore_buf_on_tab_change`           |nvim_tree.config.tab.sync| {ignore}
`renderer.root_folder_modifier`      |nvim_tree.config.renderer| {root_folder_label}
`update_focused_file.debounce_delay` |nvim_tree.config.view| {debounce_delay}
`trash.require_confirm`              |nvim_tree.config.ui.confirm| {trash}
`view.adaptive_size`                 |nvim_tree.config.view| {width}
`sort_by`                            |nvim_tree.config.sort| {sorter}
`git.ignore`                         |nvim_tree.config.filters| {git_ignored}
`renderer.icons.webdev_colors`       |nvim_tree.config.renderer.icons.web_devicons.file| {color}
`renderer.icons.padding`             |nvim_tree.config.renderer.icons.padding| {icon}

==============================================================================
Legacy: API                                             *nvim-tree-legacy-api*

Deprecated API with unchanged function signature:

`api.config.mappings.get_keymap`         |nvim_tree.api.map.keymap.current()|
`api.config.mappings.get_keymap_default` |nvim_tree.api.map.keymap.default()|
`api.config.mappings.default_on_attach`  |nvim_tree.api.map.on_attach.default()|

`api.diagnostics.hi_test`                |nvim_tree.api.appearance.hi_test()|

`api.live_filter.start`                  |nvim_tree.api.filter.live.start()|
`api.live_filter.clear`                  |nvim_tree.api.filter.live.clear()|

`api.tree.toggle_enable_filters`         |nvim_tree.api.filter.toggle()|
`api.tree.toggle_gitignore_filter`       |nvim_tree.api.filter.git.ignored.toggle()|
`api.tree.toggle_git_clean_filter`       |nvim_tree.api.filter.git.clean.toggle()|
`api.tree.toggle_no_buffer_filter`       |nvim_tree.api.filter.no_buffer.toggle()|
`api.tree.toggle_custom_filter`          |nvim_tree.api.filter.custom.toggle()|
`api.tree.toggle_hidden_filter`          |nvim_tree.api.filter.dotfiles.toggle()|
`api.tree.toggle_no_bookmark_filter`     |nvim_tree.api.filter.no_bookmark.toggle()|

==============================================================================
Legacy: Highlight                                 *nvim-tree-legacy-highlight*

Legacy highlight group are still obeyed when they are defined and the current
highlight group is not, hard linking as follows: >

    NvimTreeModifiedIcon        NvimTreeModifiedFile
    NvimTreeOpenedHL            NvimTreeOpenedFile
    NvimTreeBookmarkIcon        NvimTreeBookmark

    NvimTreeGitDeletedIcon      NvimTreeGitDeleted
    NvimTreeGitDirtyIcon        NvimTreeGitDirty
    NvimTreeGitIgnoredIcon      NvimTreeGitIgnored
    NvimTreeGitMergeIcon        NvimTreeGitMerge
    NvimTreeGitNewIcon          NvimTreeGitNew
    NvimTreeGitRenamedIcon      NvimTreeGitRenamed
    NvimTreeGitStagedIcon       NvimTreeGitStaged

    NvimTreeGitFileDeletedHL    NvimTreeFileDeleted
    NvimTreeGitFileDirtyHL      NvimTreeFileDirty
    NvimTreeGitFileIgnoredHL    NvimTreeFileIgnored
    NvimTreeGitFileMergeHL      NvimTreeFileMerge
    NvimTreeGitFileNewHL        NvimTreeFileNew
    NvimTreeGitFileRenamedHL    NvimTreeFileRenamed
    NvimTreeGitFileStagedHL     NvimTreeFileStaged

    NvimTreeGitFolderDeletedHL  NvimTreeFolderDeleted
    NvimTreeGitFolderDirtyHL    NvimTreeFolderDirty
    NvimTreeGitFolderIgnoredHL  NvimTreeFolderIgnored
    NvimTreeGitFolderMergeHL    NvimTreeFolderMerge
    NvimTreeGitFolderNewHL      NvimTreeFolderNew
    NvimTreeGitFolderRenamedHL  NvimTreeFolderRenamed
    NvimTreeGitFolderStagedHL   NvimTreeFolderStaged

    NvimTreeLspDiagnosticsError                 NvimTreeDiagnosticErrorIcon
    NvimTreeLspDiagnosticsWarning               NvimTreeDiagnosticWarnIcon
    NvimTreeLspDiagnosticsInformation           NvimTreeDiagnosticInfoIcon
    NvimTreeLspDiagnosticsHint                  NvimTreeDiagnosticHintIcon

    NvimTreeLspDiagnosticsErrorText             NvimTreeDiagnosticErrorFileHL
    NvimTreeLspDiagnosticsWarningText           NvimTreeDiagnosticWarnFileHL
    NvimTreeLspDiagnosticsInformationText       NvimTreeDiagnosticInfoFileHL
    NvimTreeLspDiagnosticsHintText              NvimTreeDiagnosticHintFileHL

    NvimTreeLspDiagnosticsErrorFolderText       NvimTreeDiagnosticErrorFolderHL
    NvimTreeLspDiagnosticsWarningFolderText     NvimTreeDiagnosticWarnFolderHL
    NvimTreeLspDiagnosticsInformationFolderText NvimTreeDiagnosticInfoFolderHL
    NvimTreeLspDiagnosticsHintFolderText        NvimTreeDiagnosticHintFolderHL
<


==============================================================================
Config                                                      *nvim-tree-config*

*nvim_tree.config*
    Arguments to pass to |nvim-tree-setup|.

    When a value is not present/nil, the default will be used.

    {on_attach} Runs when creating the nvim-tree buffer. Use this to set your
    |nvim-tree-mappings|. When not a function, |nvim-tree-mappings-default|
    will be used.

    {hijack_cursor} keep the cursor on the first letter of the filename when
    moving in the tree.

    {auto_reload_on_write} reload the explorer every time a buffer is written
    to.

    {disable_netrw} completely disables |netrw|, see |nvim-tree-netrw| for
    details. It is strongly advised to eagerly disable netrw, due to race
    conditions at vim startup.

    {hijack_netrw} hijacks netrw windows, ignored when {disable_netrw}.

    {hijack_unnamed_buffer_when_opening} opens in place of the unnamed buffer
    if it's empty.

    {root_dirs} preferred root directories, requires
    |nvim_tree.config.update_focused_file.update_root|.

    {prefer_startup_root} prefer startup root directory when updating root
    directory of the tree. Requires
    |nvim_tree.config.update_focused_file.update_root|.

    {sync_root_with_cwd} changes the tree root directory on |DirChanged| and
    refreshes the tree.

    {reload_on_bufenter} automatically reloads the tree on |BufEnter|
    nvim-tree.

    {respect_buf_cwd} changes the |current-directory| of nvim-tree to that of
    new buffer's when opening nvim-tree.

    {select_prompts} uses |vim.ui.select()| style prompts. Necessary when
    using a UI prompt decorator such as dressing.nvim or
    telescope-ui-select.nvim

    Fields: ~
      • {on_attach}?                           (`"default"|(fun(bufnr: integer))`)
                                               (default: `default`)
      • {hijack_cursor}?                       (`boolean`) (default: `false`)
      • {auto_reload_on_write}?                (`boolean`) (default: `true`)
      • {disable_netrw}?                       (`boolean`) (default: `false`)
      • {hijack_netrw}?                        (`boolean`) (default: `true`)
      • {hijack_unnamed_buffer_when_opening}?  (`boolean`) (default: `false`)
      • {root_dirs}?                           (`string[]`) (default: `{}`)
      • {prefer_startup_root}?                 (`boolean`) (default: `false`)
      • {sync_root_with_cwd}?                  (`boolean`) (default: `false`)
      • {reload_on_bufenter}?                  (`boolean`) (default: `false`)
      • {respect_buf_cwd}?                     (`boolean`) (default: `false`)
      • {select_prompts}?                      (`boolean`) (default: `false`)
      • {sort}?                                (`nvim_tree.config.sort`)
                                               |nvim_tree.config.sort|
      • {view}?                                (`nvim_tree.config.view`)
                                               |nvim_tree.config.view|
      • {renderer}?                            (`nvim_tree.config.renderer`)
                                               |nvim_tree.config.renderer|
      • {hijack_directories}?                  (`nvim_tree.config.hijack_directories`)
                                               |nvim_tree.config.hijack_directories|
      • {update_focused_file}?                 (`nvim_tree.config.update_focused_file`)
                                               |nvim_tree.config.update_focused_file|
      • {system_open}?                         (`nvim_tree.config.system_open`)
                                               |nvim_tree.config.system_open|
      • {git}?                                 (`nvim_tree.config.git`)
                                               |nvim_tree.config.git|
      • {diagnostics}?                         (`nvim_tree.config.diagnostics`)
                                               |nvim_tree.config.diagnostics|
      • {modified}?                            (`nvim_tree.config.modified`)
                                               |nvim_tree.config.modified|
      • {filters}?                             (`nvim_tree.config.filters`)
                                               |nvim_tree.config.filters|
      • {live_filter}?                         (`nvim_tree.config.live_filter`)
                                               |nvim_tree.config.live_filter|
      • {filesystem_watchers}?                 (`nvim_tree.config.filesystem_watchers`)
                                               |nvim_tree.config.filesystem_watchers|
      • {actions}?                             (`nvim_tree.config.actions`)
                                               |nvim_tree.config.actions|
      • {trash}?                               (`nvim_tree.config.trash`)
                                               |nvim_tree.config.trash|
      • {tab}?                                 (`nvim_tree.config.tab`)
                                               |nvim_tree.config.tab|
      • {bookmarks}?                           (`nvim_tree.config.bookmarks`)
                                               |nvim_tree.config.bookmarks|
      • {notify}?                              (`nvim_tree.config.notify`)
                                               |nvim_tree.config.notify|
      • {help}?                                (`nvim_tree.config.help`)
                                               |nvim_tree.config.help|
      • {ui}?                                  (`nvim_tree.config.ui`)
                                               |nvim_tree.config.ui|
      • {experimental}?                        (`nvim_tree.config.experimental`)
                                               |nvim_tree.config.experimental|
      • {log}?                                 (`nvim_tree.config.log`)
                                               |nvim_tree.config.log|



==============================================================================
Config: sort                                           *nvim-tree-config-sort*

*nvim_tree.config.sort*
    Sort files within a directory.

    {sorter} presets                            *nvim_tree.config.sort.Sorter*
    • `"name"`
    • `"case_sensitive"` name
    • `"modification_time"`
    • `"extension"` uses all suffixes e.g. `foo.tar.gz` -> `.tar.gz`
    • `"suffix"` uses the last e.g. `foo.tar.gz` -> `.gz`
    • `"filetype"` |filetype|

    {sorter} may be a function that is passed a list of `nvim_tree.api.Node`
    to be sorted in place e.g. >lua

        ---Sort by name length
        ---@param nodes nvim_tree.api.Node[]
        ---@return nvim_tree.config.sort.Sorter?
        local sorter = function(nodes)
          table.sort(nodes, function(a, b)
            return #a.name < #b.name
          end)
        end
<

    {sorter} may be a function that returns a |nvim_tree.config.sort.Sorter|

    Fields: ~
      • {sorter}?         (`nvim_tree.config.sort.Sorter|(fun(nodes: nvim_tree.api.Node[]): nvim_tree.config.sort.Sorter?)`)
                          (default: `"name"`)
      • {folders_first}?  (`boolean`, default: `true`) Sort folders before
                          files. Has no effect when {sorter} is a function.
      • {files_first}?    (`boolean`, default: `false`) Sort files before
                          folders. Has no effect when {sorter} is a function.
                          Overrides {folders_first}.



==============================================================================
Config: view                                           *nvim-tree-config-view*

*nvim_tree.config.view*
    Configures the dimensions and appearance of the nvim-tree window.

    The window is "docked" at the left by default, however may be configured
    to float: |nvim_tree.config.view.float|

    {width} can be a |nvim_tree.config.view.width.spec| for static control or
    a |nvim_tree.config.view.width| for fully dynamic control based on longest
    line.

                                            *nvim_tree.config.view.width.spec*
    • `string`: `x%` string e.g. `30%`
    • `integer`: number of columns
    • `function`: returns one of the above

    Fields: ~
      • {centralize_selection}?         (`boolean`, default: `false`) When
                                        entering nvim-tree, reposition the
                                        view so that the current node is
                                        initially centralized, see |zz|.
      • {cursorline}?                   (`boolean`, default: `true`)
                                        |'cursorline'|
      • {cursorlineopt}?                (`string`, default: `both`)
                                        |'cursorlineopt'|
      • {debounce_delay}?               (`integer`, default: `15`) Idle
                                        milliseconds before some reload /
                                        refresh operations. Increase if you
                                        experience performance issues around
                                        screen refresh.
      • {side}?                         (`"left"|"right"`) (default: `"left"`)
      • {preserve_window_proportions}?  (`boolean`, default: `false`)
                                        Preserves window proportions when
                                        opening a file. If `false`, the height
                                        and width of windows other than
                                        nvim-tree will be equalized.
      • {number}?                       (`boolean`, default: `false`)
                                        |'number'|
      • {relativenumber}?               (`boolean`, default: `false`)
                                        |'relativenumber'|
      • {signcolumn}?                   (`"yes"|"auto"|"no"`, default:
                                        `"yes"`) |'signcolumn'|
      • {width}?                        (`nvim_tree.config.view.width.spec|nvim_tree.config.view.width`)
                                        (default: `30`)
      • {float}?                        (`nvim_tree.config.view.float`)
                                        |nvim_tree.config.view.float|

*nvim_tree.config.view.float*
    Configure floating window behaviour

    {open_win_config} is passed to |nvim_open_win()|, default: >lua
        {
          relative = "editor",
          border = "rounded",
          width = 30,
          height = 30,
          row = 1,
          col = 1,
        }
<

    Fields: ~
      • {enable}?              (`boolean`) (default: `false`)
      • {quit_on_focus_loss}?  (`boolean`, default: `true`) Close the floating
                               window when it loses focus.
      • {open_win_config}?     (`vim.api.keyset.win_config|(fun(): vim.api.keyset.win_config)`)
                               (default:
                               `{ relative = "editor", border = "rounded", width = 30, height = 30, row = 1, col = 1, }`)

*nvim_tree.config.view.width*
    Configure dynamic width based on longest line.

    Fields: ~
      • {min}?             (`nvim_tree.config.view.width.spec`) (default:
                           `30`)
      • {max}?             (`nvim_tree.config.view.width.spec`, default: `-1`)
                           -1 for unbounded.
      • {lines_excluded}?  (`("root")[]`, default: `{ "root" }`) Exclude these
                           lines when computing width.
      • {padding}?         (`nvim_tree.config.view.width.spec`, default: `1`)
                           Extra padding to the right.



==============================================================================
Config: renderer                                   *nvim-tree-config-renderer*

*nvim_tree.config.renderer*
    Controls the appearance of the tree.

    {highlight_}                         *nvim_tree.config.renderer.highlight*

    See |nvim-tree-icons-highlighting|
    • `"none"`: no highlighting
    • `"icon"`: icon only
    • `"name"`: name only
    • `"all"`: icon and name

    {decorators}                         *nvim_tree.config.renderer.decorator*

    See |nvim-tree-icons-highlighting|

    A builtin decorator name `string` or |nvim_tree.api.Decorator| class.

    Builtin decorators in their default order:
    • `"Git"`
    • `"Open"`
    • `"Hidden"`
    • `"Modified"`
    • `"Bookmark"`
    • `"Diagnostics"`
    • `"Copied"`
    • `"Cut"`

    Specify {decorators} is a list e.g. `{ "Git", MyDecorator, "Cut" }`

    {root_folder_label}          *nvim_tree.config.renderer.root_folder_label*

    Controls the root folder name and visibility:
    • `string`: |filename-modifiers| format string, default `":~:s?$?/..?"`
    • `false`: to disable
    • `fun(root_cwd: string): string`: return a literal string from root's
      absolute path e.g. >lua
        my_root_folder_label = function(path)
          return ".../" .. vim.fn.fnamemodify(path, ":t")
        end
<

    {hidden_display}                *nvim_tree.config.renderer.hidden_display*

    Summary of hidden nodes, below the last node in the directory, highlighted
    with `NvimTreeHiddenDisplay`.
    • `"none"`: disabled, default
    • `"simple"`: total number of hidden files e.g.
      • (3 hidden)
    • `"all"`: total and by reason: the filter that hid the node e.g.
      • (14 total git: 5, dotfile: 9)
    • `(fun(hidden_stats: nvim_tree.config.renderer.hidden_stats): string)`

    See |nvim_tree.config.renderer.hidden_stats| for details and example.

    Fields: ~
      • {add_trailing}?            (`boolean`, default: `false`) Appends a
                                   trailing slash to folder and symlink folder
                                   target names.
      • {group_empty}?             (`boolean|(fun(relative_path: string): string)`, default: `false`)
                                   Compact folders that only contain a single
                                   folder into one node. Function variant
                                   takes the relative path of grouped folders
                                   and returns a string to be displayed.
      • {full_name}?               (`boolean`, default: `false`) Display nodes
                                   whose name length is wider than the width
                                   of nvim-tree window in floating window.
      • {root_folder_label}?       (`nvim_tree.config.renderer.root_folder_label`, default: `":~:s?$?/..?"`)
                                   |nvim_tree.config.renderer.root_folder_label|
      • {indent_width}?            (`integer`, default: `2`) Number of spaces
                                   for each tree nesting level. Minimum 1.
      • {hidden_display}?          (`nvim_tree.config.renderer.hidden_display`, default: `none`)
                                   |nvim_tree.config.renderer.hidden_display|
      • {symlink_destination}?     (`boolean`, default: `true`) Appends an
                                   arrow followed by the target of the
                                   symlink.
      • {decorators}?              (`nvim_tree.config.renderer.decorator[]`, default: `{ "Git", "Open", "Hidden", "Modified", "Bookmark", "Diagnostics", "Copied", "Cut", }`)
                                   List in order of additive precedence.
      • {highlight_git}?           (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_opened_files}?  (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_hidden}?        (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_modified}?      (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_bookmarks}?     (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_diagnostics}?   (`nvim_tree.config.renderer.highlight`)
                                   (default: `"none"`)
      • {highlight_clipboard}?     (`nvim_tree.config.renderer.highlight`)
                                   (default: `"name"`)
      • {special_files}?           (`string[]`, default: `{ "Cargo.toml", "Makefile", "README.md", "readme.md", }`)
                                   Highlight special files and directories
                                   with `NvimTreeSpecial*`.
      • {indent_markers}?          (`nvim_tree.config.renderer.indent_markers`)
                                   |nvim_tree.config.renderer.indent_markers|
      • {icons}?                   (`nvim_tree.config.renderer.icons`)
                                   |nvim_tree.config.renderer.icons|

*nvim_tree.config.renderer.hidden_stats*
    Number of hidden nodes in a directory by reason: the filter that hid the
    node.

    Passed to your |nvim_tree.config.renderer.hidden_display| function e.g. >lua

        ---@param hidden_stats nvim_tree.config.renderer.hidden_stats
        ---@return string? summary
        local my_hidden_display = function(hidden_stats)
          local total_count = 0
          for reason, count in pairs(hidden_stats) do
            total_count = total_count + count
          end

          if total_count > 0 then
            return "(" .. tostring(total_count) .. " hidden)"
          end
          return nil
        end
<

    Fields: ~
      • {bookmark}     (`integer`)
      • {buf}          (`integer`)
      • {custom}       (`integer`)
      • {dotfile}      (`integer`)
      • {git}          (`integer`)
      • {live_filter}  (`integer`)

*nvim_tree.config.renderer.icons*
    Icons and separators

    {_placement}                   *nvim_tree.config.renderer.icons.placement*
    • `"before"`: before file/folder, after the file/folders icons
    • `"after"`: after file/folder
    • `"signcolumn"`: far left, requires |nvim_tree.config.view| {signcolumn}.
    • `"right_align"`: far right

    Fields: ~
      • {git_placement}?          (`nvim_tree.config.renderer.icons.placement`)
                                  (default: `before`)
      • {hidden_placement}?       (`nvim_tree.config.renderer.icons.placement`)
                                  (default: `after`)
      • {modified_placement}?     (`nvim_tree.config.renderer.icons.placement`)
                                  (default: `after`)
      • {bookmarks_placement}?    (`nvim_tree.config.renderer.icons.placement`)
                                  (default: `signcolumn`)
      • {diagnostics_placement}?  (`nvim_tree.config.renderer.icons.placement`)
                                  (default: `signcolumn`)
      • {padding}?                (`table`)
                                     *nvim_tree.config.renderer.icons.padding*
                                  • {icon}? (`string`, default: `" "`) Between
                                    icon and filename.
                                  • {folder_arrow}? (`string`, default: `" "`)
                                    Between folder arrow icon and file/folder
                                    icon.
      • {symlink_arrow}?          (`string`, default: `" ➛ "`) Separator
                                  between symlink source and target.
      • {show}?                   (`nvim_tree.config.renderer.icons.show`)
                                  |nvim_tree.config.renderer.icons.show|
      • {glyphs}?                 (`nvim_tree.config.renderer.icons.glyphs`)
                                  |nvim_tree.config.renderer.icons.glyphs|
      • {web_devicons}?           (`nvim_tree.config.renderer.icons.web_devicons`)
                                  |nvim_tree.config.renderer.icons.web_devicons|

*nvim_tree.config.renderer.icons.glyphs*
    See |nvim-tree-icons-highlighting|.

    Glyphs that appear in the sign column must have length <= 2

    Fields: ~
      • {default}?   (`string`, default: `""`) Files
      • {symlink}?   (`string`) (default: `""`)
      • {bookmark}?  (`string`) (default: `"󰆤"`)
      • {modified}?  (`string`) (default: `"●"`)
      • {hidden}?    (`string`) (default: `"󰜌"`)
      • {folder}?    (`table`)                     *nvim_tree.config.renderer.icons.glyphs.folder*
                     • {arrow_closed}? (`string`) (default: left arrow)
                     • {arrow_open}? (`string`) (default: down arrow)
                     • {default}? (`string`) (default: `""`)
                     • {open}? (`string`) (default: `""`)
                     • {empty}? (`string`) (default: `""`)
                     • {empty_open}? (`string`) (default: `""`)
                     • {symlink}? (`string`) (default: `""`)
                     • {symlink_open}? (`string`) (default: `""`)
      • {git}?       (`table`)                        *nvim_tree.config.renderer.icons.glyphs.git*
                     • {unstaged}? (`string`) (default: `"✗"`)
                     • {staged}? (`string`) (default: `"✓"`)
                     • {unmerged}? (`string`) (default: `""`)
                     • {renamed}? (`string`) (default: `"➜"`)
                     • {untracked}? (`string`) (default: `"★"`)
                     • {deleted}? (`string`) (default: `""`)
                     • {ignored}? (`string`) (default: `"◌"`)

*nvim_tree.config.renderer.icons.show*
    See |nvim-tree-icons-highlighting|.

    Fields: ~
      • {file}?          (`boolean`) (default: `true`)
      • {folder}?        (`boolean`) (default: `true`)
      • {git}?           (`boolean`) (default: `true`)
      • {modified}?      (`boolean`) (default: `true`)
      • {hidden}?        (`boolean`) (default: `false`)
      • {diagnostics}?   (`boolean`) (default: `true`)
      • {bookmarks}?     (`boolean`) (default: `true`)
      • {folder_arrow}?  (`boolean`, default: `true`) Show a small arrow
                         before the folder node. Arrow will be a part of the
                         node when using
                         |nvim_tree.config.renderer.indent_markers|.

*nvim_tree.config.renderer.icons.web_devicons*
    Configure optional plugin `nvim-tree/nvim-web-devicons`, see
    |nvim-tree-icons-highlighting|.

    Fields: ~
      • {file}?    (`table`)
                           *nvim_tree.config.renderer.icons.web_devicons.file*
                   • {enable}? (`boolean`) (default: `true`)
                   • {color}? (`boolean`) (default: `true`)
      • {folder}?  (`table`)
                         *nvim_tree.config.renderer.icons.web_devicons.folder*
                   • {enable}? (`boolean`) (default: `false`)
                   • {color}? (`boolean`) (default: `true`)

*nvim_tree.config.renderer.indent_markers*

    Fields: ~
      • {enable}?         (`boolean`, default: `false`) Display indent markers
                          when folders are open.
      • {inline_arrows}?  (`boolean`, default: `true`) Display folder arrows
                          in the same column as indent marker when using
                          |nvim_tree.config.renderer.icons.padding|
                          {folder_arrow}
      • {icons}?          (`table`)
                              *nvim_tree.config.renderer.indent_markers.icons*
                          Before the file/directory, length 1.
                          • {corner}? (`string`) (default: `"└"`)
                          • {edge}? (`string`) (default: `"│"`)
                          • {item}? (`string`) (default: `"│"`)
                          • {bottom}? (`string`) (default: `"─"`)
                          • {none}? (`string`) (default: `" "`)



==============================================================================
Config: hijack_directories               *nvim-tree-config-hijack-directories*

*nvim_tree.config.hijack_directories*
    Hijack directory buffers by replacing the directory buffer with the tree.

    Disable this option if you use vim-dirvish or dirbuf.nvim.

    If |nvim_tree.config| {hijack_netrw} and {disable_netrw} are `false` this
    feature will be disabled.

    Fields: ~
      • {enable}?     (`boolean`) (default: `true`)
      • {auto_open}?  (`boolean`, default: `true`) Open if the tree was
                      previously closed.



==============================================================================
Config: update_focused_file             *nvim-tree-config-update-focused-file*

*nvim_tree.config.update_focused_file*
    Update the focused file on |BufEnter|, uncollapsing folders recursively.

    Fields: ~
      • {enable}?       (`boolean`) (default: `false`)
      • {update_root}?  (`nvim_tree.config.update_focused_file.update_root`)
                        |nvim_tree.config.update_focused_file.update_root|
      • {exclude}?      (`boolean|(fun(args: vim.api.keyset.create_autocmd.callback_args): boolean)`, default: `false`)
                        A function called on |BufEnter| that returns true if
                        the file should not be focused when opening.

*nvim_tree.config.update_focused_file.update_root*
    Update the root directory of the tree if the file is not under the current
    root directory.

    Prefers vim's cwd and |nvim_tree.config| {root_dirs}, falling back to the
    directory containing the file.

    Requires |nvim_tree.config.update_focused_file|

    Fields: ~
      • {enable}?       (`boolean`) (default: `false`)
      • {ignore_list}?  (`string[]`, default: `{}`) List of buffer names and
                        filetypes that will not update the root dir of the
                        tree if the file isn't found under the current root
                        directory.



==============================================================================
Config: system_open                             *nvim-tree-config-system-open*

*nvim_tree.config.system_open*
    Open files or directories via the OS.

    Nvim:
    • `>=` 0.10 uses |vim.ui.open()| unless {cmd} is specified
    • `<` 0.10 calls external {cmd}:
      • UNIX: `xdg-open`
      • macOS: `open`
      • Windows: `cmd`

    Once nvim-tree minimum Nvim version is updated to 0.10, this configuration
    will no longer be necessary and will be removed.

    Fields: ~
      • {cmd}?   (`string`) The open command itself
      • {args}?  (`string[]`, default: `{}` or `{ "/c", "start", '""' }` on
                 windows) Optional argument list. Leave empty for OS specific
                 default.



==============================================================================
Config: git                                             *nvim-tree-config-git*

*nvim_tree.config.git*
    Git operations are run in the background thus status may not immediately
    appear.

    Processes will be killed if they exceed {timeout} ms. Git integration will
    be disabled following 5 timeouts and you will be notified.

    Git integration may be disabled for git top-level directories via
    {disable_for_dirs}:
    • A list of relative paths evaluated with |fnamemodify()| `:p` OR
    • A function that is passed an absolute path and returns `true` to disable

    See |nvim-tree-icons-highlighting|.

    Fields: ~
      • {enable}?             (`boolean`) (default: `true`)
      • {show_on_dirs}?       (`boolean`, default: `true`) Show status icons
                              of children when directory itself has no status
                              icon
      • {show_on_open_dirs}?  (`boolean`, default: `true`) Show status icons
                              of children on directories that are open.
                              Requires {show_on_dirs}.
      • {disable_for_dirs}?   (`string[]|(fun(path: string): boolean)`,
                              default: `{}`) Disable for top level paths.
      • {timeout}?            (`integer`, default: `400`) `git` processes
                              timeout milliseconds.
      • {cygwin_support}?     (`boolean`, default: `false`) Use `cygpath` if
                              available to resolve paths for git.



==============================================================================
Config: diagnostics                             *nvim-tree-config-diagnostics*

*nvim_tree.config.diagnostics*
    Integrate with |lsp| or COC diagnostics.

    See |nvim-tree-icons-highlighting|.

    Fields: ~
      • {enable}?             (`boolean`) (default: `false`)
      • {debounce_delay}?     (`integer`, default: `500`) Idle milliseconds
                              between diagnostic event and tree update.
      • {show_on_dirs}?       (`boolean`, default: `false`) Show diagnostic
                              icons on parent directories.
      • {show_on_open_dirs}?  (`boolean`, default: `true`) Show diagnostics
                              icons on directories that are open. Requires
                              {show_on_dirs}.
      • {diagnostic_opts}?    (`boolean`, default: `false`) Global
                              |vim.diagnostic.Opts| overrides {severity} and
                              {icons}
      • {severity}?           (`table`)
                                       *nvim_tree.config.diagnostics.severity*
                              • {min}? (`vim.diagnostic.Severity`, default:
                                HINT) |vim.diagnostic.severity|
                              • {max}? (`vim.diagnostic.Severity`, default:
                                ERROR) |vim.diagnostic.severity|
      • {icons}?              (`table`)                                *nvim_tree.config.diagnostics.icons*
                              • {hint}? (`string`) (default: `""` )
                              • {info}? (`string`) (default: `""` )
                              • {warning}? (`string`) (default: `""` )
                              • {error}? (`string`) (default: `""` )



==============================================================================
Config: modified                                   *nvim-tree-config-modified*

*nvim_tree.config.modified*
    Indicate which files have unsaved modification. To see modified status in
    the tree you will need:
    • |nvim_tree.config.renderer.icons.show| {modified} OR
    • |nvim_tree.config.renderer| {highlight_modified}

    See |nvim-tree-icons-highlighting|.

    Fields: ~
      • {enable}?             (`boolean`) (default: `false`)
      • {show_on_dirs}?       (`boolean`, default: `true`) Show modified
                              indication on directory whose children are
                              modified.
      • {show_on_open_dirs}?  (`boolean`, default: `false`) Show modified
                              indication on open directories. Requires
                              {show_on_dirs}.



==============================================================================
Config: filters                                     *nvim-tree-config-filters*

*nvim_tree.config.filters*
    Filters may be applied to the tree to exlude the display of
    file/directories.

    Multiple filters may be applied at once.

    Filters can be set at startup or toggled live via API with default
    mappings.

    `I     `{git_ignored}`         `|nvim_tree.api.filter.git.ignored.toggle()|
    Ignore files based on `.gitignore`. Requires |nvim_tree.config.git|

    `H     `{dotfiles}`            `|nvim_tree.api.filter.dotfiles.toggle()|
    Filter dotfiles: files/directories starting with a `.`

    `C     `{git_clean}`           `|nvim_tree.api.filter.git.clean.toggle()|
    Filter files with no git status. `.gitignore` files will not be filtered
    when {git_ignored}, as they are effectively dirty.

    `B     `{no_buffer}`           `|nvim_tree.api.filter.no_buffer.toggle()|
    Filter files that have no |buflisted()| buffer. For performance reasons
    buffer delete/wipe may not be immediately shown. A reload or filesystem
    event will always result in an update.

    `M     `{no_bookmark}`         `|nvim_tree.api.filter.no_bookmark.toggle()|
    Filter files that are not bookmarked. Enabling this is not useful as there
    is no means yet to persist bookmarks.

    `U     `{custom}`              `|nvim_tree.api.filter.custom.toggle()|
    Disable specific file/directory names via:
    • a list of backslash escaped |regular-expression| e.g. `"^\\.git""`
    • a function passed the absolute path of the directory.

    All filters including live filter may be disabled via {enable} and toggled
    with |nvim_tree.api.filter.toggle()|

    Files/directories may be {exclude}d from filtering: they will always be
    shown, overriding {git_ignored}, {dotfiles} and {custom}.

    Fields: ~
      • {enable}?       (`boolean`, default: `true`) Enable all filters.
      • {git_ignored}?  (`boolean`) (default: `true`)
      • {dotfiles}?     (`boolean`) (default: `false`)
      • {git_clean}?    (`boolean`) (default: `false`)
      • {no_buffer}?    (`boolean`) (default: `false`)
      • {no_bookmark}?  (`boolean`) (default: `false`)
      • {custom}?       (`string[]|(fun(absolute_path: string): boolean)`)
                        (default: `{}`)
      • {exclude}?      (`string[]`) (default: `{}`)



==============================================================================
Config: live_filter                             *nvim-tree-config-live-filter*

*nvim_tree.config.live_filter*
    Live filter allows you to filter the tree nodes dynamically using
    |regular-expression| matching.

    This feature is bound to the `f` key by default. The filter can be cleared
    with the `F` key by default.

    Fields: ~
      • {prefix}?               (`string`, default: `"[FILTER]: "`) Prefix of
                                the filter displayed in the buffer.
      • {always_show_folders}?  (`boolean`, default: `true`) Whether to filter
                                folders or not.



==============================================================================
Config: filesystem_watchers             *nvim-tree-config-filesystem-watchers*

*nvim_tree.config.filesystem_watchers*
    Use file system watchers (libuv `uv_fs_event_t`) to monitor the filesystem
    for changes and update the tree.

    With this feature, the tree will be partially updated on specific
    directory changes, resulting in better performance.

    Watchers may be disabled for absolute directory paths via {ignore_dirs}.
    • A list of |regular-expression| to match a path, backslash escaped e.g.
      `"my-proj/\\.build$"` OR
    • A function that is passed an absolute path and returns `true` to disable
      This may be useful when a path is not in `.gitignore` or git integration
      is disabled.

    After {max_events} consecutive filesystem events on a single directory
    with an interval < {debounce_delay}:
    • The filesystem watcher will be disabled for that directory.
    • A warning notification will be shown.
    • Consider adding this directory to {ignore_dirs}

    Fields: ~
      • {enable}?          (`boolean`) (default: `true`)
      • {debounce_delay}?  (`integer`, default: `50`) Idle milliseconds
                           between filesystem change and tree update.
      • {ignore_dirs}?     (`string[]|(fun(path: string): boolean)`, default: `{ "/.ccls-cache", "/build", "/node_modules", "/target", "/.zig-cache"}`)
                           Disable for specific directories.
      • {max_events}?      (`integer`, default: `0` or `1000` on windows)
                           Disable for a single directory after {max_events}
                           consecutive events with an interval <
                           {debounce_delay}. Set to 0 to allow unlimited
                           consecutive events.



==============================================================================
Config: actions                                     *nvim-tree-config-actions*

*nvim_tree.config.actions*

    Fields: ~
      • {use_system_clipboard}?  (`boolean`, default: `true`) Use the system
                                 clipboard for copy/paste. Copied text will be
                                 stored in registers `+` (system), otherwise,
                                 it will be stored in `1` and `"`
      • {change_dir}?            (`nvim_tree.config.actions.change_dir`)
                                 |nvim_tree.config.actions.change_dir|
      • {expand_all}?            (`nvim_tree.config.actions.expand_all`)
                                 |nvim_tree.config.actions.expand_all|
      • {file_popup}?            (`nvim_tree.config.actions.file_popup`)
                                 |nvim_tree.config.actions.file_popup|
      • {open_file}?             (`nvim_tree.config.actions.open_file`)
                                 |nvim_tree.config.actions.open_file|
      • {remove_file}?           (`nvim_tree.config.actions.remove_file`)
                                 |nvim_tree.config.actions.remove_file|

*nvim_tree.config.actions.change_dir*
    vim |current-directory| behaviour

    Fields: ~
      • {enable}?              (`boolean`, default: `true`) Change the working
                               directory when changing directories in the tree
      • {global}?              (`boolean`, default: `false`) Use `:cd` instead
                               of `:lcd` when changing directories.
      • {restrict_above_cwd}?  (`boolean`, default: `false`) Restrict changing
                               to a directory above the global cwd.

*nvim_tree.config.actions.expand_all*
    Configure |nvim_tree.api.tree.expand_all()| and
    |nvim_tree.api.node.expand()|

    Fields: ~
      • {max_folder_discovery}?  (`integer`, default: `300`) Limit the number
                                 of folders being explored when expanding
                                 every folder. Avoids hanging Nvim when
                                 running this action on very large folders.
      • {exclude}?               (`string[]`, default: `{}`) A list of
                                 directories that should not be expanded
                                 automatically e.g
                                 `{ ".git", "target", "build" }`

*nvim_tree.config.actions.file_popup*
    {file_popup} floating window.

    {open_win_config} is passed to |nvim_open_win()|, default: >lua
        {
          col = 1,
          row = 1,
          relative = "cursor",
          border = "shadow",
          style = "minimal",
        }
<

    You shouldn't define {width} and {height} values here. They will be
    overridden to fit the file_popup content.

    Fields: ~
      • {open_win_config}?  (`vim.api.keyset.win_config`) (default:
                            `{ col = 1, row = 1, relative = "cursor", border = "shadow", style = "minimal", }`)

*nvim_tree.config.actions.open_file*
    Opening files.

    Fields: ~
      • {quit_on_open}?   (`boolean`, default: `false`) Closes the explorer
                          when opening a file
      • {eject}?          (`boolean`, default: `true`) Prevent new opened file
                          from opening in the same window as the tree.
      • {resize_window}?  (`boolean`, default: `true`) Resizes the tree when
                          opening a file
      • {window_picker}?  (`nvim_tree.config.actions.open_file.window_picker`)
                          |nvim_tree.config.actions.open_file.window_picker|

*nvim_tree.config.actions.open_file.window_picker*
    A window picker will be shown when there are multiple windows available to
    open a file. It will show a single character identifier in each window's
    status line.

    When it is not enabled the file will open in the window from which you
    last opened the tree, obeying {exclude}

    You may define a {picker} function that should return the window id that
    will open the node, or `nil` if an invalid window is picked or user
    cancelled the action. The picker may create a new window.

    Fields: ~
      • {enable}?   (`boolean`) (default: `true`)
      • {picker}?   (`"default"|(fun(): integer)`, default: `"default"`)
                    Change the default window picker or define your own.
      • {chars}?    (`string`, default:
                    `"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"`) Identifier
                    characters to use.
      • {exclude}?  (`nvim_tree.config.actions.open_file.window_picker.exclude`)
                    |nvim_tree.config.actions.open_file.window_picker.exclude|

*nvim_tree.config.actions.open_file.window_picker.exclude*
    Tables of buffer option names mapped to a list of option values. Windows
    containing matching buffers will not be:
    • available when using a window picker
    • selected when not using a window picker

    Fields: ~
      • {filetype}?  (`string[]`) (default:
                     `{ "notify", "lazy", "qf", "diff", "fugitive", "fugitiveblame", }`)
      • {buftype}?   (`string[]`) (default:
                     `{ "nofile", "terminal", "help", }`)

*nvim_tree.config.actions.remove_file*
    Removing files.

    Fields: ~
      • {close_window}?  (`boolean`, default: `true`) Close any window that
                         displays a file when removing that file from the
                         tree.



==============================================================================
Config: trash                                         *nvim-tree-config-trash*

*nvim_tree.config.trash*
    Files may be trashed via an external command that must be installed on
    your system.
    • linux: `gio trash`, from linux package `glib2`
    • macOS: `trash`, from homebrew package `trash`
    • windows: `trash`, requires `trash-cli` or similar

    Fields: ~
      • {cmd}?  (`string`) (default: `"gio trash"` or `"trash"`)



==============================================================================
Config: tab                                             *nvim-tree-config-tab*

*nvim_tree.config.tab*

    Fields: ~
      • {sync}?  (`nvim_tree.config.tab.sync`) |nvim_tree.config.tab.sync|

*nvim_tree.config.tab.sync*

    Fields: ~
      • {open}?    (`boolean`, default: `false`) Opens the tree automatically
                   when switching tabpage or opening a new tabpage if the tree
                   was previously open.
      • {close}?   (`boolean`, default: `false`) Closes the tree across all
                   tabpages when the tree is closed.
      • {ignore}?  (`string[]`, default: `{}`) List of filetypes or buffer
                   names on new tab that will prevent `open` and `close`



==============================================================================
Config: notify                                       *nvim-tree-config-notify*

*nvim_tree.config.notify*
    nvim-tree |vim.log.levels|
    • `ERROR`: hard errors e.g. failure to read from the file system.
    • `WARN`: non-fatal errors e.g. unable to system open a file.
    • `INFO`: information only e.g. file copy path confirmation.
    • `DEBUG`: information for troubleshooting, e.g. failures in some window
      closing operations.

    Fields: ~
      • {threshold}?      (`vim.log.levels`, default: `vim.log.levels.INFO`)
                          Specify minimum notification |vim.log.levels|
      • {absolute_path}?  (`boolean`, default: `true`) Use absolute paths in
                          FS action notifications, otherwise item names.



==============================================================================
Config: bookmarks                                 *nvim-tree-config-bookmarks*

*nvim_tree.config.bookmarks*
    Optionally {persist} bookmarks to a json file:
    • `true` use default: `stdpath("data") .. "/nvim-tree-bookmarks.json"`
    • `false` do not persist
    • `string` absolute path of your choice

    Fields: ~
      • {persist}?  (`boolean|string`) (default: `false`)



==============================================================================
Config: help                                           *nvim-tree-config-help*

*nvim_tree.config.help*

    Fields: ~
      • {sort_by}?  (`"key"|"desc"`, default: `"key"`) Alphabetically.



==============================================================================
Config: ui                                               *nvim-tree-config-ui*

*nvim_tree.config.ui*

    Fields: ~
      • {confirm}?  (`nvim_tree.config.ui.confirm`)
                    |nvim_tree.config.ui.confirm|

*nvim_tree.config.ui.confirm*
    Confirmation prompts.

    Fields: ~
      • {remove}?       (`boolean`, default: `true`) Prompt before removing.
      • {trash}?        (`boolean`, default: `true`) Prompt before trashing.
      • {default_yes}?  (`boolean`, default: `false`) If `true` the prompt
                        will be `Y/n`, otherwise `y/N`



==============================================================================
Config: experimental                           *nvim-tree-config-experimental*

*nvim_tree.config.experimental*
    Experimental features that may become default or optional functionality.

    In the event of a problem please disable the experiment and raise an
    issue.



==============================================================================
Config: log                                             *nvim-tree-config-log*

*nvim_tree.config.log*
    Log to a file `nvim-tree.log` in |stdpath()| `log`, usually
    `${XDG_STATE_HOME}/nvim`

    Fields: ~
      • {enable}?    (`boolean`) (default: `false`)
      • {truncate}?  (`boolean`, default: `false`) Remove existing log file at
                     startup.
      • {types}?     (`nvim_tree.config.log.types`)
                     |nvim_tree.config.log.types|

*nvim_tree.config.log.types*
    Specify which information to log.

    Fields: ~
      • {all}?          (`boolean`, default: `false`) Everything.
      • {profile}?      (`boolean`, default: `false`) Timing of some
                        operations.
      • {config}?       (`boolean`, default: `false`) Config and mappings, at
                        startup.
      • {copy_paste}?   (`boolean`, default: `false`) File copy and paste
                        actions.
      • {dev}?          (`boolean`, default: `false`) Used for local
                        development only. Not useful for users.
      • {diagnostics}?  (`boolean`, default: `false`) LSP and COC processing,
                        verbose.
      • {git}?          (`boolean`, default: `false`) Git processing, verbose.
      • {watcher}?      (`boolean`, default: `false`)
                        |nvim_tree.config.filesystem_watchers| processing,
                        verbose.



==============================================================================
Config: Default                                     *nvim-tree-config-default*

Following is the default configuration, see |nvim_tree.config| for details. >lua

    ---@type nvim_tree.config
    local config = {
      on_attach = "default",
      hijack_cursor = false,
      auto_reload_on_write = true,
      disable_netrw = false,
      hijack_netrw = true,
      hijack_unnamed_buffer_when_opening = false,
      root_dirs = {},
      prefer_startup_root = false,
      sync_root_with_cwd = false,
      reload_on_bufenter = false,
      respect_buf_cwd = false,
      select_prompts = false,
      sort = {
        sorter = "name",
        folders_first = true,
        files_first = false,
      },
      view = {
        centralize_selection = false,
        cursorline = true,
        cursorlineopt = "both",
        debounce_delay = 15,
        side = "left",
        preserve_window_proportions = false,
        number = false,
        relativenumber = false,
        signcolumn = "yes",
        width = 30,
        float = {
          enable = false,
          quit_on_focus_loss = true,
          open_win_config = {
            relative = "editor",
            border = "rounded",
            width = 30,
            height = 30,
            row = 1,
            col = 1,
          },
        },
      },
      renderer = {
        add_trailing = false,
        group_empty = false,
        full_name = false,
        root_folder_label = ":~:s?$?/..?",
        indent_width = 2,
        special_files = { "Cargo.toml", "Makefile", "README.md", "readme.md" },
        hidden_display = "none",
        symlink_destination = true,
        decorators = { "Git", "Open", "Hidden", "Modified", "Bookmark", "Diagnostics", "Copied", "Cut", },
        highlight_git = "none",
        highlight_diagnostics = "none",
        highlight_opened_files = "none",
        highlight_modified = "none",
        highlight_hidden = "none",
        highlight_bookmarks = "none",
        highlight_clipboard = "name",
        indent_markers = {
          enable = false,
          inline_arrows = true,
          icons = {
            corner = "└",
            edge = "│",
            item = "│",
            bottom = "─",
            none = " ",
          },
        },
        icons = {
          web_devicons = {
            file = {
              enable = true,
              color = true,
            },
            folder = {
              enable = false,
              color = true,
            },
          },
          git_placement = "before",
          modified_placement = "after",
          hidden_placement = "after",
          diagnostics_placement = "signcolumn",
          bookmarks_placement = "signcolumn",
          padding = {
            icon = " ",
            folder_arrow = " ",
          },
          symlink_arrow = " ➛ ",
          show = {
            file = true,
            folder = true,
            folder_arrow = true,
            git = true,
            modified = true,
            hidden = false,
            diagnostics = true,
            bookmarks = true,
          },
          glyphs = {
            default = "",
            symlink = "",
            bookmark = "󰆤",
            modified = "●",
            hidden = "󰜌",
            folder = {
              arrow_closed = "",
              arrow_open = "",
              default = "",
              open = "",
              empty = "",
              empty_open = "",
              symlink = "",
              symlink_open = "",
            },
            git = {
              unstaged = "✗",
              staged = "✓",
              unmerged = "",
              renamed = "➜",
              untracked = "★",
              deleted = "",
              ignored = "◌",
            },
          },
        },
      },
      hijack_directories = {
        enable = true,
        auto_open = true,
      },
      update_focused_file = {
        enable = false,
        update_root = {
          enable = false,
          ignore_list = {},
        },
        exclude = false,
      },
      system_open = {
        cmd = "",
        args = {},
      },
      git = {
        enable = true,
        show_on_dirs = true,
        show_on_open_dirs = true,
        disable_for_dirs = {},
        timeout = 400,
        cygwin_support = false,
      },
      diagnostics = {
        enable = false,
        show_on_dirs = false,
        show_on_open_dirs = true,
        debounce_delay = 500,
        severity = {
          min = vim.diagnostic.severity.HINT,
          max = vim.diagnostic.severity.ERROR,
        },
        icons = {
          hint = "",
          info = "",
          warning = "",
          error = "",
        },
        diagnostic_opts = false,
      },
      modified = {
        enable = false,
        show_on_dirs = true,
        show_on_open_dirs = true,
      },
      filters = {
        enable = true,
        git_ignored = true,
        dotfiles = false,
        git_clean = false,
        no_buffer = false,
        no_bookmark = false,
        custom = {},
        exclude = {},
      },
      live_filter = {
        prefix = "[FILTER]: ",
        always_show_folders = true,
      },
      filesystem_watchers = {
        enable = true,
        debounce_delay = 50,
        max_events = 0,
        ignore_dirs = {
          "/.ccls-cache",
          "/build",
          "/node_modules",
          "/target",
          "/.zig-cache",
        },
      },
      actions = {
        use_system_clipboard = true,
        change_dir = {
          enable = true,
          global = false,
          restrict_above_cwd = false,
        },
        expand_all = {
          max_folder_discovery = 300,
          exclude = {},
        },
        file_popup = {
          open_win_config = {
            col = 1,
            row = 1,
            relative = "cursor",
            border = "shadow",
            style = "minimal",
          },
        },
        open_file = {
          quit_on_open = false,
          eject = true,
          resize_window = true,
          relative_path = true,
          window_picker = {
            enable = true,
            picker = "default",
            chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
            exclude = {
              filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame" },
              buftype = { "nofile", "terminal", "help" },
            },
          },
        },
        remove_file = {
          close_window = true,
        },
      },
      trash = {
        cmd = "gio trash",
      },
      tab = {
        sync = {
          open = false,
          close = false,
          ignore = {},
        },
      },
      notify = {
        threshold = vim.log.levels.INFO,
        absolute_path = true,
      },
      help = {
        sort_by = "key",
      },
      ui = {
        confirm = {
          remove = true,
          trash = true,
          default_yes = false,
        },
      },
      bookmarks = {
        persist = false,
      },
      experimental = {
      },
      log = {
        enable = false,
        truncate = false,
        types = {
          all = false,
          config = false,
          copy_paste = false,
          dev = false,
          diagnostics = false,
          git = false,
          profile = false,
          watcher = false,
        },
      },
    }
<



==============================================================================
API                                                            *nvim-tree-api*

nvim-tree exposes a public API. This is non breaking, with additions made as
necessary.

Please do not require or use modules other than `nvim-tree.api`, as internal
modules will change without notice.

The API is separated into multiple modules:
• |nvim-tree-api-appearance|
• |nvim-tree-api-commands|
• |nvim-tree-api-events|
• |nvim-tree-api-filter|
• |nvim-tree-api-fs|
• |nvim-tree-api-git|
• |nvim-tree-api-map|
• |nvim-tree-api-marks|
• |nvim-tree-api-node|
• |nvim-tree-api-tree|

Modules are accessed via `api.<module>.<function>`

Example invocation of the `reload` function in the `tree` module: >lua

    local api = require("nvim-tree.api")
    api.tree.reload()
<

Generally, functions accepting a |nvim_tree.api.Node| as their first argument
will use the node under the cursor when that argument is not present or nil.
Some functions are mode-dependent: when invoked in visual mode they will
operate on all nodes in the visual selection instead of a single node. See
|nvim-tree-mappings-default| for which mappings support visual mode.

e.g. the following are functionally identical: >lua

    api.node.open.edit(nil, { focus = true })

    api.node.open.edit(api.tree.get_node_under_cursor(), { focus = true })
<


*nvim_tree.api.Node*
    The Node class is a data class. Instances may be provided by API functions
    for use as a:
    • handle to pass back to API functions e.g. |nvim_tree.api.node.run.cmd()|
    • reference in callbacks e.g. |nvim_tree.config.sort.Sorter| {sorter}

    Please do not mutate the contents of any Node object.

    Fields: ~
      • {absolute_path}   (`string`) of the file or directory
      • {name}            (`string`) file or directory name
      • {parent}?         (`nvim_tree.api.DirectoryNode`) parent directory,
                          nil for root
      • {type}            (`"file"|"directory"|"link"`) |uv.fs_stat()| {type}
      • {executable}      (`boolean`) file is executable
      • {fs_stat}?        (`uv.fs_stat.result`) at time of last tree display,
                          see |uv.fs_stat()|
      • {git_status}      (`nvim_tree.git.Status?`) for files and directories
      • {diag_severity}?  (`lsp.DiagnosticSeverity`) diagnostic status
      • {hidden}          (`boolean`) node is not visible in the tree

*nvim_tree.git.Status*
    Git statuses for a single node.

    `nvim_tree.git.XY`: 2 character string, see `man 1 git-status` "Short
    Format"

    {dir} status is derived from its contents:
    • `direct`: inherited from child files
    • `indirect`: inherited from child directories

    Fields: ~
      • {file}?  (`nvim_tree.git.XY`) status of a file node
      • {dir}?   (`table<"direct"|"indirect", nvim_tree.git.XY[]>`) direct
                 inclusive-or indirect status



==============================================================================
API: appearance                                     *nvim-tree-api-appearance*

hi_test()                                 *nvim_tree.api.appearance.hi_test()*
    Open a new buffer displaying all nvim-tree highlight groups, their link
    chain and concrete definition.

    Similar to `:so $VIMRUNTIME/syntax/hitest.vim` as per |:highlight|


==============================================================================
API: commands                                         *nvim-tree-api-commands*

get()                                           *nvim_tree.api.commands.get()*
    Retrieve all |nvim-tree-commands|

    They have been created via |nvim_create_user_command()|, see also
    |lua-guide-commands-create|

    Return: ~
        (`table[]`)
        • {name} (`string`) name of the `:NvimTree*` command
        • {command}
          (`fun(args: vim.api.keyset.create_user_command.command_args)`)
          function that the command will execute
        • {opts} (`vim.api.keyset.user_command`) |command-attributes|


==============================================================================
API: config                                             *nvim-tree-api-config*

default()                                     *nvim_tree.api.config.default()*
    Default nvim-tree config.

    Return: ~
        (`nvim_tree.config`) immutable deep clone

global()                                       *nvim_tree.api.config.global()*
    Global current nvim-tree config.

    Return: ~
        (`nvim_tree.config`) immutable deep clone

user()                                           *nvim_tree.api.config.user()*
    Reference to config passed to |nvim-tree-setup|

    Return: ~
        (`nvim_tree.config?`) nil when no config passed to setup


==============================================================================
API: events                                             *nvim-tree-api-events*

subscribe({event_type}, {callback})         *nvim_tree.api.events.subscribe()*
    Register a handler for an event, see |nvim-tree-events|.

    Parameters: ~
      • {event_type}  (`nvim_tree.api.events.Event`) |nvim_tree_events_kind|
      • {callback}    (`fun(payload: table?)`)


==============================================================================
API: filter                                             *nvim-tree-api-filter*

custom.toggle()                         *nvim_tree.api.filter.custom.toggle()*
    Toggle |nvim_tree.config.filters| {custom} filter.

dotfiles.toggle()                     *nvim_tree.api.filter.dotfiles.toggle()*
    Toggle |nvim_tree.config.filters| {dotfiles} filter.

git.clean.toggle()                   *nvim_tree.api.filter.git.clean.toggle()*
    Toggle |nvim_tree.config.filters| {git_clean} filter.

git.ignored.toggle()               *nvim_tree.api.filter.git.ignored.toggle()*
    Toggle |nvim_tree.config.filters| {git_ignored} filter.

live.clear()                               *nvim_tree.api.filter.live.clear()*
    Exit live filter mode.

live.start()                               *nvim_tree.api.filter.live.start()*
    Enter live filter mode. Opens an input window with |filetype|
    `NvimTreeFilter`

no_bookmark.toggle()               *nvim_tree.api.filter.no_bookmark.toggle()*
    Toggle |nvim_tree.config.filters| {no_bookmark} filter.

no_buffer.toggle()                   *nvim_tree.api.filter.no_buffer.toggle()*
    Toggle |nvim_tree.config.filters| {no_buffer} filter.

toggle()                                       *nvim_tree.api.filter.toggle()*
    Toggle |nvim_tree.config.filters| {enable} which applies to ALL filters.


==============================================================================
API: fs                                                     *nvim-tree-api-fs*

clear_clipboard()                         *nvim_tree.api.fs.clear_clipboard()*
    Clear the nvim-tree clipboard.

copy.absolute_path({node})             *nvim_tree.api.fs.copy.absolute_path()*
    Copy the absolute path to the system clipboard.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

copy.basename({node})                       *nvim_tree.api.fs.copy.basename()*
    Copy the name with extension omitted to the system clipboard.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

copy.filename({node})                       *nvim_tree.api.fs.copy.filename()*
    Copy the name to the system clipboard.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

copy.node({node})                               *nvim_tree.api.fs.copy.node()*
    Copy to the nvim-tree clipboard. In visual mode, copies all nodes in the
    visual selection.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

copy.relative_path({node})             *nvim_tree.api.fs.copy.relative_path()*
    Copy the path relative to the tree root to the system clipboard.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

create({node})                                     *nvim_tree.api.fs.create()*
    Prompt to create a file or directory.

    When {node} is a file it will be created in the parent directory.

    Use a trailing `"/"` to create a directory e.g. `"foo/"`

    Multiple directories/files may be created e.g. `"foo/bar/baz"`

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

cut({node})                                           *nvim_tree.api.fs.cut()*
    Cut to the nvim-tree clipboard. In visual mode, cuts all nodes in the
    visual selection.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

paste({node})                                       *nvim_tree.api.fs.paste()*
    Paste from the nvim-tree clipboard.

    If {node} is a file it will pasted in the parent directory.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

print_clipboard()                         *nvim_tree.api.fs.print_clipboard()*
    Print the contents of the nvim-tree clipboard.

remove({node})                                     *nvim_tree.api.fs.remove()*
    Delete from the file system. In visual mode, deletes all nodes in the
    visual selection with a single prompt.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

rename({node})                                     *nvim_tree.api.fs.rename()*
    Prompt to rename by name.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

rename_basename({node})                   *nvim_tree.api.fs.rename_basename()*
    Prompt to rename by name with extension omitted.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

rename_full({node})                           *nvim_tree.api.fs.rename_full()*
    Prompt to rename by absolute path.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

rename_node({node})                           *nvim_tree.api.fs.rename_node()*
    Prompt to rename.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

rename_sub({node})                             *nvim_tree.api.fs.rename_sub()*
    Prompt to rename by absolute path with name omitted.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)

trash({node})                                       *nvim_tree.api.fs.trash()*
    Trash as per |nvim_tree.config.trash|. In visual mode, trashes all nodes
    in the visual selection with a single prompt.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`)


==============================================================================
API: git                                                   *nvim-tree-api-git*

reload()                                          *nvim_tree.api.git.reload()*
    Update the git status of the entire tree.


==============================================================================
API: map                                                   *nvim-tree-api-map*

keymap.current()                          *nvim_tree.api.map.keymap.current()*
    Retrieve all buffer local mappings for nvim-tree. These are the mappings
    that are applied by |nvim_tree.config| {on_attach}, which may include
    default mappings.

    Return: ~
        (`vim.api.keyset.get_keymap[]`)

keymap.default()                          *nvim_tree.api.map.keymap.default()*
    Retrieves the buffer local mappings for nvim-tree that are applied by
    |nvim_tree.api.map.on_attach.default()|

    Return: ~
        (`vim.api.keyset.get_keymap[]`)

on_attach.default({bufnr})             *nvim_tree.api.map.on_attach.default()*
    Apply all |nvim-tree-mappings-default|. Call from your |nvim_tree.config|
    {on_attach}.

    Parameters: ~
      • {bufnr}  (`integer`) use the `bufnr` passed to {on_attach}


==============================================================================
API: marks                                               *nvim-tree-api-marks*

bulk.delete()                              *nvim_tree.api.marks.bulk.delete()*
    Delete all marked, prompting if |nvim_tree.config.ui.confirm| {remove}

bulk.move()                                  *nvim_tree.api.marks.bulk.move()*
    Prompts for a directory to move all marked nodes into.

bulk.trash()                                *nvim_tree.api.marks.bulk.trash()*
    Delete all marked, prompting if |nvim_tree.config.ui.confirm| {trash}

clear()                                          *nvim_tree.api.marks.clear()*
    Clear all marks.

get({node})                                        *nvim_tree.api.marks.get()*
    Return the node if it is marked.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file or directory

    Return: ~
        (`nvim_tree.api.Node?`)

list()                                            *nvim_tree.api.marks.list()*
    Retrieve all marked nodes.

    Return: ~
        (`nvim_tree.api.Node[]`)

navigate.next()                          *nvim_tree.api.marks.navigate.next()*
    Navigate to the next marked node, wraps.

navigate.prev()                          *nvim_tree.api.marks.navigate.prev()*
    Navigate to the previous marked node, wraps.

navigate.select()                      *nvim_tree.api.marks.navigate.select()*
    Prompts for selection of a marked node, sorted by absolute paths. A folder
    will be focused, a file will be opened.

toggle({node})                                  *nvim_tree.api.marks.toggle()*
    Toggle mark. In visual mode, toggles all nodes in the visual selection.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file or directory


==============================================================================
API: node                                                 *nvim-tree-api-node*

buffer.delete({node}, {opts})             *nvim_tree.api.node.buffer.delete()*
    Deletes node's related buffer, if one exists. Executes |:bdelete| or
    |:bdelete|!

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file
      • {opts}  (`table?`)
                • {force}? (`boolean`, default: false) Proceed even if the
                  buffer is modified.

buffer.wipe({node}, {opts})                 *nvim_tree.api.node.buffer.wipe()*
    Wipes node's related buffer, if one exists. Executes |:bwipe| or |:bwipe|!

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file
      • {opts}  (`table?`) optional
                • {force}? (`boolean`, default: false) Proceed even if the
                  buffer is modified.

collapse({node}, {opts})                       *nvim_tree.api.node.collapse()*
    Collapse the tree under a directory or a file's parent directory.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file
      • {opts}  (`table?`) optional
                • {keep_buffers}? (`boolean`, default: false) Do not collapse
                  nodes with open buffers.

expand({node}, {opts})                           *nvim_tree.api.node.expand()*
    Recursively expand all nodes under a directory or a file's parent
    directory.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file
      • {opts}  (`table?`) optional
                • {expand_until}?
                  (`fun(expansion_count: integer, node: Node): boolean`)
                  Return `true` if `node` should be expanded.
                  `expansion_count` is the total number of folders expanded.

                              *nvim_tree.api.node.navigate.diagnostics.next()*
navigate.diagnostics.next({node})
    Navigate to the next item showing diagnostic status.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                    *nvim_tree.api.node.navigate.diagnostics.next_recursive()*
navigate.diagnostics.next_recursive({node})
    Navigate to the next item showing diagnostic status, recursively. Needs
    |nvim_tree.config.diagnostics| {show_on_dirs}

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                              *nvim_tree.api.node.navigate.diagnostics.prev()*
navigate.diagnostics.prev({node})
    Navigate to the previous item showing diagnostic status.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                    *nvim_tree.api.node.navigate.diagnostics.prev_recursive()*
navigate.diagnostics.prev_recursive({node})
    Navigate to the previous item showing diagnostic status, recursively.
    Needs |nvim_tree.config.diagnostics| {show_on_dirs}

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

navigate.git.next({node})             *nvim_tree.api.node.navigate.git.next()*
    Navigate to the next item showing git status.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                            *nvim_tree.api.node.navigate.git.next_recursive()*
navigate.git.next_recursive({node})
    Navigate to the next item showing git status, recursively. Needs
    |nvim_tree.config.git| {show_on_dirs}

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                      *nvim_tree.api.node.navigate.git.next_skip_gitignored()*
navigate.git.next_skip_gitignored({node})
    Navigate to the next item showing git status, skipping `.gitignore`

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

navigate.git.prev({node})             *nvim_tree.api.node.navigate.git.prev()*
    Navigate to the previous item showing git status.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                            *nvim_tree.api.node.navigate.git.prev_recursive()*
navigate.git.prev_recursive({node})
    Navigate to the previous item showing git status, recursively. Needs
    |nvim_tree.config.git| {show_on_dirs}

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                      *nvim_tree.api.node.navigate.git.prev_skip_gitignored()*
navigate.git.prev_skip_gitignored({node})
    Navigate to the previous item showing git status, skipping `.gitignore`

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                   *nvim_tree.api.node.navigate.opened.next()*
navigate.opened.next({node})
    Navigate to the next |bufloaded()| file.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                   *nvim_tree.api.node.navigate.opened.prev()*
navigate.opened.prev({node})
    Navigate to the previous |bufloaded()| file.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

navigate.parent({node})                 *nvim_tree.api.node.navigate.parent()*
    Navigate to the parent directory of the node.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                  *nvim_tree.api.node.navigate.parent_close()*
navigate.parent_close({node})
    Navigate to the parent directory of the node, closing it.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                 *nvim_tree.api.node.navigate.sibling.first()*
navigate.sibling.first({node})
    Navigate to the first node in the current node's folder.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                  *nvim_tree.api.node.navigate.sibling.last()*
navigate.sibling.last({node})
    Navigate to the last node in the current node's folder.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                  *nvim_tree.api.node.navigate.sibling.next()*
navigate.sibling.next({node})
    Navigate to the next node in the current node's folder, wraps.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                  *nvim_tree.api.node.navigate.sibling.prev()*
navigate.sibling.prev({node})
    Navigate to the previous node in the current node's folder, wraps.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

open.edit({node}, {opts})                     *nvim_tree.api.node.open.edit()*
    • file: open as per |nvim_tree.config.actions.open_file|
    • directory: expand or collapse
    • root: change directory up

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file
      • {opts}  (`table?`) optional
                • {quit_on_open}? (`boolean`, default: false) Quits the tree
                  when opening the file.
                • {focus}? (`boolean`, default: false) Keep focus in the tree
                  when opening the file.

open.horizontal({node})                 *nvim_tree.api.node.open.horizontal()*
    Open file in a new horizontal split.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file

                              *nvim_tree.api.node.open.horizontal_no_picker()*
open.horizontal_no_picker({node})
    Open file in a new horizontal split without using the window picker.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file

                                  *nvim_tree.api.node.open.no_window_picker()*
open.no_window_picker({node})
    Open file without using the window picker.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file

open.preview({node})                       *nvim_tree.api.node.open.preview()*
    Open file with |'bufhidden'| set to `delete`.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                 *nvim_tree.api.node.open.preview_no_picker()*
open.preview_no_picker({node})
    Open file with |'bufhidden'| set to `delete` without using the window
    picker.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                               *nvim_tree.api.node.open.replace_tree_buffer()*
open.replace_tree_buffer({node})
    Open file in place: in the nvim-tree window.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) file

open.tab({node})                               *nvim_tree.api.node.open.tab()*
    Open file in a new tab.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

open.tab_drop({node})                     *nvim_tree.api.node.open.tab_drop()*
    Switch to tab containing window with selected file if it exists. Open file
    in new tab otherwise.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory or file

                                *nvim_tree.api.node.open.toggle_group_empty()*
open.toggle_group_empty({node})
    Toggle |nvim_tree.config.renderer| {group_empty} for a directory. Needs
    {group_empty} set.

    Parameters: ~
      • {node}  (`nvim_tree.api.Node?`) directory

open.vertical({node})                     *nvim_tree.api.node.open.vertical()*
    Open file in a new vertical split.

    Parameters: ~
      • {node}  (`nv
Download .txt
gitextract_y381tt17/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── feature_request.md
│   │   └── nvt-min.lua
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── luarocks-release.yml
│       ├── release-please.yml
│       └── semantic-pr-subject.yml
├── .gitignore
├── .hooks/
│   └── pre-commit.sh
├── .luacheckrc
├── .luarc.json
├── .release-please-manifest.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── doc/
│   ├── .gitignore
│   └── nvim-tree-lua.txt
├── lua/
│   ├── nvim-tree/
│   │   ├── _meta/
│   │   │   ├── api/
│   │   │   │   ├── appearance.lua
│   │   │   │   ├── commands.lua
│   │   │   │   ├── config.lua
│   │   │   │   ├── decorator.lua
│   │   │   │   ├── decorator_example.lua
│   │   │   │   ├── deprecated.lua
│   │   │   │   ├── events.lua
│   │   │   │   ├── filter.lua
│   │   │   │   ├── fs.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── map.lua
│   │   │   │   ├── marks.lua
│   │   │   │   ├── node.lua
│   │   │   │   └── tree.lua
│   │   │   ├── classes.lua
│   │   │   ├── config/
│   │   │   │   ├── actions.lua
│   │   │   │   ├── bookmarks.lua
│   │   │   │   ├── default.lua
│   │   │   │   ├── diagnostics.lua
│   │   │   │   ├── experimental.lua
│   │   │   │   ├── filesystem_watchers.lua
│   │   │   │   ├── filters.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── help.lua
│   │   │   │   ├── hijack_directories.lua
│   │   │   │   ├── live_filter.lua
│   │   │   │   ├── log.lua
│   │   │   │   ├── modified.lua
│   │   │   │   ├── notify.lua
│   │   │   │   ├── renderer.lua
│   │   │   │   ├── sort.lua
│   │   │   │   ├── system_open.lua
│   │   │   │   ├── tab.lua
│   │   │   │   ├── trash.lua
│   │   │   │   ├── ui.lua
│   │   │   │   ├── update_focused_file.lua
│   │   │   │   └── view.lua
│   │   │   └── config.lua
│   │   ├── actions/
│   │   │   ├── finders/
│   │   │   │   ├── find-file.lua
│   │   │   │   ├── init.lua
│   │   │   │   └── search-node.lua
│   │   │   ├── fs/
│   │   │   │   ├── clipboard.lua
│   │   │   │   ├── create-file.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── remove-file.lua
│   │   │   │   ├── rename-file.lua
│   │   │   │   └── trash.lua
│   │   │   ├── init.lua
│   │   │   ├── moves/
│   │   │   │   ├── init.lua
│   │   │   │   ├── item.lua
│   │   │   │   ├── parent.lua
│   │   │   │   └── sibling.lua
│   │   │   ├── node/
│   │   │   │   ├── buffer.lua
│   │   │   │   ├── file-popup.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── open-file.lua
│   │   │   │   ├── run-command.lua
│   │   │   │   └── system-open.lua
│   │   │   └── tree/
│   │   │       ├── change-dir.lua
│   │   │       ├── collapse.lua
│   │   │       ├── find-file.lua
│   │   │       ├── init.lua
│   │   │       ├── open.lua
│   │   │       ├── resize.lua
│   │   │       └── toggle.lua
│   │   ├── api/
│   │   │   └── impl.lua
│   │   ├── api.lua
│   │   ├── appearance/
│   │   │   ├── hi-test.lua
│   │   │   └── init.lua
│   │   ├── buffers.lua
│   │   ├── classic.lua
│   │   ├── commands.lua
│   │   ├── config.lua
│   │   ├── core.lua
│   │   ├── diagnostics.lua
│   │   ├── enum.lua
│   │   ├── events.lua
│   │   ├── explorer/
│   │   │   ├── filters.lua
│   │   │   ├── init.lua
│   │   │   ├── live-filter.lua
│   │   │   ├── sorter.lua
│   │   │   └── watch.lua
│   │   ├── git/
│   │   │   ├── init.lua
│   │   │   ├── runner.lua
│   │   │   └── utils.lua
│   │   ├── help.lua
│   │   ├── iterators/
│   │   │   └── node-iterator.lua
│   │   ├── keymap.lua
│   │   ├── legacy.lua
│   │   ├── lib.lua
│   │   ├── log.lua
│   │   ├── marks/
│   │   │   └── init.lua
│   │   ├── node/
│   │   │   ├── directory-link.lua
│   │   │   ├── directory.lua
│   │   │   ├── factory.lua
│   │   │   ├── file-link.lua
│   │   │   ├── file.lua
│   │   │   ├── init.lua
│   │   │   ├── link.lua
│   │   │   └── root.lua
│   │   ├── notify.lua
│   │   ├── renderer/
│   │   │   ├── builder.lua
│   │   │   ├── components/
│   │   │   │   ├── devicons.lua
│   │   │   │   ├── full-name.lua
│   │   │   │   ├── init.lua
│   │   │   │   └── padding.lua
│   │   │   ├── decorator/
│   │   │   │   ├── bookmarks.lua
│   │   │   │   ├── builtin.lua
│   │   │   │   ├── copied.lua
│   │   │   │   ├── cut.lua
│   │   │   │   ├── diagnostics.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── hidden.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── modified.lua
│   │   │   │   └── opened.lua
│   │   │   └── init.lua
│   │   ├── utils.lua
│   │   ├── view.lua
│   │   └── watcher.lua
│   └── nvim-tree.lua
├── plugin/
│   └── nvim-tree.lua
├── release-please-config.json
└── scripts/
    ├── doc-comments.sh
    ├── help-defaults.sh
    ├── luals-check.sh
    ├── setup-hooks.sh
    ├── vimdoc.sh
    └── vimdoc_config.lua
Condensed preview — 151 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (737K chars).
[
  {
    "path": ".editorconfig",
    "chars": 591,
    "preview": "root = true\n\n[*]\ninsert_final_newline = true\nend_of_line = lf\n\n[nvim-tree-lua.txt]\nmax_line_length = 78\n\n# keep these in"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 66,
    "preview": "# These are supported funding model platforms\n\ngithub: kyazdani42\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3233,
    "preview": "name: Bug report\ndescription: Report a problem with nvim-tree\nlabels: [bug]\nbody:\n  - type: markdown\n    attributes:\n   "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 1058,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: feature request\nassignees: ''\n\n---\n*"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/nvt-min.lua",
    "chars": 1553,
    "preview": "vim.g.loaded_netrw = 1\nvim.g.loaded_netrwPlugin = 1\n\nvim.cmd([[set runtimepath=$VIMRUNTIME]])\nvim.cmd([[set packpath=/tm"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 150,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n   "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 2855,
    "preview": "name: CI\n\non:\n  pull_request:\n  push:\n    branches: [master]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n"
  },
  {
    "path": ".github/workflows/luarocks-release.yml",
    "chars": 818,
    "preview": "name: Luarocks Release\n\non:\n  push:\n    tags:\n      - v*\n  workflow_dispatch:\n\njobs:\n  luarocks-upload:\n    runs-on: ubu"
  },
  {
    "path": ".github/workflows/release-please.yml",
    "chars": 2538,
    "preview": "on:\n  push:\n    branches:\n      - master\n  workflow_dispatch:\nconcurrency:\n  group: ${{ github.workflow }}\n  cancel-in-p"
  },
  {
    "path": ".github/workflows/semantic-pr-subject.yml",
    "chars": 439,
    "preview": "name: Semantic Pull Request Subject\non:\n  pull_request:\n    types:\n      - opened\n      - reopened\n      - edited\n      "
  },
  {
    "path": ".gitignore",
    "chars": 42,
    "preview": "/luals-out/\n/luals/\n# backup vim files\n*~\n"
  },
  {
    "path": ".hooks/pre-commit.sh",
    "chars": 24,
    "preview": "#!/usr/bin/env sh\n\nmake\n"
  },
  {
    "path": ".luacheckrc",
    "chars": 200,
    "preview": "local M = {}\n\n-- Don't report unused self arguments of methods.\nM.self = false\n\nM.ignore = {\n  \"631\",  -- max_line_lengt"
  },
  {
    "path": ".luarc.json",
    "chars": 2741,
    "preview": "{\n  \"$schema\": \"https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json\",\n  \"runtime.version\": \""
  },
  {
    "path": ".release-please-manifest.json",
    "chars": 20,
    "preview": "{\n  \".\": \"1.16.0\"\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 40946,
    "preview": "# Changelog\n\n## [1.16.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.15.0...nvim-tree-v1.16.0) (2026"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 9792,
    "preview": "# Contributing to `nvim-tree.lua`\n\nThank you for contributing.\n\nSee [wiki: Development](https://github.com/nvim-tree/nvi"
  },
  {
    "path": "LICENSE",
    "chars": 718,
    "preview": "nvim-tree.lua is a file explorer / filesystem tree view plugin for neovim\nCopyright © 2019 Yazdani Kiyan\n\nThis program i"
  },
  {
    "path": "Makefile",
    "chars": 933,
    "preview": "all: lint style check\n\n#\n# mandatory checks\n#\nlint: luacheck\n\nstyle: style-check style-doc\n\ncheck: luals\n\n#\n# subtasks\n#"
  },
  {
    "path": "README.md",
    "chars": 7407,
    "preview": "# A File Explorer For Neovim Written In Lua\n\n[![CI](https://github.com/nvim-tree/nvim-tree.lua/actions/workflows/ci.yml/"
  },
  {
    "path": "doc/.gitignore",
    "chars": 5,
    "preview": "tags\n"
  },
  {
    "path": "doc/nvim-tree-lua.txt",
    "chars": 141487,
    "preview": "*nvim-tree-lua.txt*       A File Explorer For Nvim        *nvim_tree*  *nvim-tree*\n\nAuthor: Yazdani Kiyan\n              "
  },
  {
    "path": "lua/nvim-tree/_meta/api/appearance.lua",
    "chars": 327,
    "preview": "---@meta\nlocal nvim_tree = { api = { appearance = {} } }\n\n---\n---Open a new buffer displaying all nvim-tree highlight gr"
  },
  {
    "path": "lua/nvim-tree/_meta/api/commands.lua",
    "chars": 618,
    "preview": "---@meta\nlocal nvim_tree = { api = { commands = {} } }\n\n---\n---@class nvim_tree.api.commands.Command\n---@inlinedoc\n---\n-"
  },
  {
    "path": "lua/nvim-tree/_meta/api/config.lua",
    "chars": 913,
    "preview": "---@meta\nlocal nvim_tree = { api = { config = {} } }\n\n---\n---Default nvim-tree config.\n---\n---@return nvim_tree.config i"
  },
  {
    "path": "lua/nvim-tree/_meta/api/decorator.lua",
    "chars": 3471,
    "preview": "---@meta\n\n---@brief\n---Highlighting and icons for nodes are provided by Decorators, see [nvim-tree-icons-highlighting] f"
  },
  {
    "path": "lua/nvim-tree/_meta/api/decorator_example.lua",
    "chars": 3011,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n---@brief\n---\n---A decorator class for nodes named \"example\", overriding a"
  },
  {
    "path": "lua/nvim-tree/_meta/api/deprecated.lua",
    "chars": 741,
    "preview": "---@meta\n-- Deprecated top level API modules.\n-- Remember to add mappings in legacy.lua `api_map`\n\nlocal nvim_tree = { a"
  },
  {
    "path": "lua/nvim-tree/_meta/api/events.lua",
    "chars": 870,
    "preview": "---@meta\nlocal nvim_tree = { api = { events = {} } }\n\n---@enum nvim_tree.api.events.Event\nnvim_tree.api.events.Event = {"
  },
  {
    "path": "lua/nvim-tree/_meta/api/filter.lua",
    "chars": 1429,
    "preview": "---@meta\nlocal nvim_tree = { api = { filter = {} } }\n\n---\n---Toggle [nvim_tree.config.filters] {enable} which applies to"
  },
  {
    "path": "lua/nvim-tree/_meta/api/fs.lua",
    "chars": 2871,
    "preview": "---@meta\nlocal nvim_tree = { api = { fs = {} } }\n\n---\n---Clear the nvim-tree clipboard.\n---\nfunction nvim_tree.api.fs.cl"
  },
  {
    "path": "lua/nvim-tree/_meta/api/git.lua",
    "chars": 170,
    "preview": "---@meta\nlocal nvim_tree = { api = { git = {} } }\n\n---\n---Update the git status of the entire tree.\n---\nfunction nvim_tr"
  },
  {
    "path": "lua/nvim-tree/_meta/api/map.lua",
    "chars": 828,
    "preview": "---@meta\nlocal nvim_tree = { api = { map = {} } }\n\nnvim_tree.api.map.keymap = {}\n\n---\n---Retrieve all buffer local mappi"
  },
  {
    "path": "lua/nvim-tree/_meta/api/marks.lua",
    "chars": 1441,
    "preview": "---@meta\nlocal nvim_tree = { api = { marks = {} } }\n\n---\n---Return the node if it is marked.\n---\n---@param node? nvim_tr"
  },
  {
    "path": "lua/nvim-tree/_meta/api/node.lua",
    "chars": 8430,
    "preview": "---@meta\nlocal nvim_tree = { api = { node = {} } }\n\nnvim_tree.api.node.open = {}\n\n---\n---@class nvim_tree.api.node.open."
  },
  {
    "path": "lua/nvim-tree/_meta/api/tree.lua",
    "chars": 6782,
    "preview": "---@meta\nlocal nvim_tree = { api = { tree = {} } }\n\n---\n---Open the tree, focusing it if already open.\n---\n---@param opt"
  },
  {
    "path": "lua/nvim-tree/_meta/classes.lua",
    "chars": 802,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n---\n---File\n---\n---@class (exact) nvim_tree.api.FileNode: nvim_tree.api.No"
  },
  {
    "path": "lua/nvim-tree/_meta/config/actions.lua",
    "chars": 4478,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---@class nvim_tree.config.actions\n---\n---Use the system clipboard for c"
  },
  {
    "path": "lua/nvim-tree/_meta/config/bookmarks.lua",
    "chars": 343,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n---Optionally {persist} bookmarks to a json file:\n---- `true` use default"
  },
  {
    "path": "lua/nvim-tree/_meta/config/default.lua",
    "chars": 212,
    "preview": "---@brief\n---Following is the default configuration, see |nvim_tree.config| for details.\n---\n---```lua\n---\n--- ---@type "
  },
  {
    "path": "lua/nvim-tree/_meta/config/diagnostics.lua",
    "chars": 1437,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Integrate with [lsp] or COC diagnostics.\n---\n---See [nvim-tree-icons-"
  },
  {
    "path": "lua/nvim-tree/_meta/config/experimental.lua",
    "chars": 427,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Experimental features that may become default or optional functionali"
  },
  {
    "path": "lua/nvim-tree/_meta/config/filesystem_watchers.lua",
    "chars": 1555,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Use file system watchers (libuv `uv_fs_event_t`) to monitor the files"
  },
  {
    "path": "lua/nvim-tree/_meta/config/filters.lua",
    "chars": 2263,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Filters may be applied to the tree to exlude the display of file/dire"
  },
  {
    "path": "lua/nvim-tree/_meta/config/git.lua",
    "chars": 1254,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Git operations are run in the background thus status may not immediat"
  },
  {
    "path": "lua/nvim-tree/_meta/config/help.lua",
    "chars": 161,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---\n---@class nvim_tree.config.help\n---\n---Alphabetically.\n---(default: "
  },
  {
    "path": "lua/nvim-tree/_meta/config/hijack_directories.lua",
    "chars": 496,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Hijack directory buffers by replacing the directory buffer with the t"
  },
  {
    "path": "lua/nvim-tree/_meta/config/live_filter.lua",
    "chars": 512,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n--- Live filter allows you to filter the tree nodes dynamically using [r"
  },
  {
    "path": "lua/nvim-tree/_meta/config/log.lua",
    "chars": 1189,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Log to a file `nvim-tree.log` in [stdpath()] `log`, usually `${XDG_ST"
  },
  {
    "path": "lua/nvim-tree/_meta/config/modified.lua",
    "chars": 665,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Indicate which files have unsaved modification.\n---To see modified st"
  },
  {
    "path": "lua/nvim-tree/_meta/config/notify.lua",
    "chars": 665,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---nvim-tree |vim.log.levels|\n---- `ERROR`: hard errors e.g. failure to "
  },
  {
    "path": "lua/nvim-tree/_meta/config/renderer.lua",
    "chars": 10835,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Controls the appearance of the tree.\n---\n---{highlight_} [nvim_tree.c"
  },
  {
    "path": "lua/nvim-tree/_meta/config/sort.lua",
    "chars": 1385,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Sort files within a directory.\n---\n---{sorter} presets [nvim_tree.con"
  },
  {
    "path": "lua/nvim-tree/_meta/config/system_open.lua",
    "chars": 649,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Open files or directories via the OS.\n---\n---Nvim:\n---- `>=` 0.10 use"
  },
  {
    "path": "lua/nvim-tree/_meta/config/tab.lua",
    "chars": 612,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---@class nvim_tree.config.tab\n---\n---[nvim_tree.config.tab.sync]\n---@fi"
  },
  {
    "path": "lua/nvim-tree/_meta/config/trash.lua",
    "chars": 400,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Files may be trashed via an external command that must be installed o"
  },
  {
    "path": "lua/nvim-tree/_meta/config/ui.lua",
    "chars": 495,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---@class nvim_tree.config.ui\n---\n---[nvim_tree.config.ui.confirm]\n---@f"
  },
  {
    "path": "lua/nvim-tree/_meta/config/update_focused_file.lua",
    "chars": 1153,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Update the focused file on [BufEnter], uncollapsing folders recursive"
  },
  {
    "path": "lua/nvim-tree/_meta/config/view.lua",
    "chars": 3004,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n---Configures the dimensions and appearance of the nvim-tree window.\n---"
  },
  {
    "path": "lua/nvim-tree/_meta/config.lua",
    "chars": 4215,
    "preview": "---@meta\nerror(\"Cannot require a meta file\")\n\n\n\n-- Root class {field}s are documented manually above \"Fields:\" as there "
  },
  {
    "path": "lua/nvim-tree/actions/finders/find-file.lua",
    "chars": 2655,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal view = require(\"nvim-tree.view\")\nlocal utils = require(\"nvim-tree.utils\")\nloc"
  },
  {
    "path": "lua/nvim-tree/actions/finders/init.lua",
    "chars": 150,
    "preview": "local M = {}\n\nM.find_file = require(\"nvim-tree.actions.finders.find-file\")\nM.search_node = require(\"nvim-tree.actions.fi"
  },
  {
    "path": "lua/nvim-tree/actions/finders/search-node.lua",
    "chars": 3044,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal find_file = require(\"nvim-tree.actions.finders.find-file\").fn\n\nlocal M = {}"
  },
  {
    "path": "lua/nvim-tree/actions/fs/clipboard.lua",
    "chars": 15263,
    "preview": "local lib = require(\"nvim-tree.lib\")\nlocal log = require(\"nvim-tree.log\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal"
  },
  {
    "path": "lua/nvim-tree/actions/fs/create-file.lua",
    "chars": 3054,
    "preview": "local utils = require(\"nvim-tree.utils\")\nlocal events = require(\"nvim-tree.events\")\nlocal core = require(\"nvim-tree.core"
  },
  {
    "path": "lua/nvim-tree/actions/fs/init.lua",
    "chars": 358,
    "preview": "local M = {}\n\nM.create_file = require(\"nvim-tree.actions.fs.create-file\")\nM.remove_file = require(\"nvim-tree.actions.fs."
  },
  {
    "path": "lua/nvim-tree/actions/fs/remove-file.lua",
    "chars": 6465,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal events = require(\"nvim-tree.events"
  },
  {
    "path": "lua/nvim-tree/actions/fs/rename-file.lua",
    "chars": 4862,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal events = require(\"nvim-tree.events"
  },
  {
    "path": "lua/nvim-tree/actions/fs/trash.lua",
    "chars": 4584,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal lib = require(\"nvim-tree.lib\")\nlocal notify = require(\"nvim-tree.notify\")\nl"
  },
  {
    "path": "lua/nvim-tree/actions/init.lua",
    "chars": 332,
    "preview": "local M = {}\n\nM.finders = require(\"nvim-tree.actions.finders\")\nM.fs = require(\"nvim-tree.actions.fs\")\nM.moves = require("
  },
  {
    "path": "lua/nvim-tree/actions/moves/init.lua",
    "chars": 181,
    "preview": "local M = {}\n\nM.item = require(\"nvim-tree.actions.moves.item\")\nM.parent = require(\"nvim-tree.actions.moves.parent\")\nM.si"
  },
  {
    "path": "lua/nvim-tree/actions/moves/item.lua",
    "chars": 7714,
    "preview": "local view = require(\"nvim-tree.view\")\nlocal core = require(\"nvim-tree.core\")\nlocal diagnostics = require(\"nvim-tree.dia"
  },
  {
    "path": "lua/nvim-tree/actions/moves/parent.lua",
    "chars": 954,
    "preview": "local view = require(\"nvim-tree.view\")\nlocal DirectoryNode = require(\"nvim-tree.node.directory\")\n\nlocal M = {}\n\n---@para"
  },
  {
    "path": "lua/nvim-tree/actions/moves/sibling.lua",
    "chars": 1473,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal Iterator = require(\"nvim-tree.iterators.node-iterator\")\n\nlocal M = {}\n\n---@"
  },
  {
    "path": "lua/nvim-tree/actions/node/buffer.lua",
    "chars": 1500,
    "preview": "-- Copyright 2019 Yazdani Kiyan under MIT License\nlocal notify = require(\"nvim-tree.notify\")\n\nlocal M = {}\n\n---@param no"
  },
  {
    "path": "lua/nvim-tree/actions/node/file-popup.lua",
    "chars": 2260,
    "preview": "local utils = require(\"nvim-tree.utils\")\n\nlocal M = {}\n\n---@param node Node\n---@return table\nlocal function get_formatte"
  },
  {
    "path": "lua/nvim-tree/actions/node/init.lua",
    "chars": 523,
    "preview": "local M = {}\n\nM.file_popup = require(\"nvim-tree.actions.node.file-popup\")\nM.open_file = require(\"nvim-tree.actions.node."
  },
  {
    "path": "lua/nvim-tree/actions/node/open-file.lua",
    "chars": 17263,
    "preview": "-- Copyright 2019 Yazdani Kiyan under MIT License\nlocal lib = require(\"nvim-tree.lib\")\nlocal notify = require(\"nvim-tree"
  },
  {
    "path": "lua/nvim-tree/actions/node/run-command.lua",
    "chars": 636,
    "preview": "local utils = require(\"nvim-tree.utils\")\nlocal core = require(\"nvim-tree.core\")\n\nlocal M = {}\n\n---Retrieves the absolute"
  },
  {
    "path": "lua/nvim-tree/actions/node/system-open.lua",
    "chars": 2302,
    "preview": "local notify = require(\"nvim-tree.notify\")\nlocal utils = require(\"nvim-tree.utils\")\n\nlocal M = {}\n\n---@param node Node\nl"
  },
  {
    "path": "lua/nvim-tree/actions/tree/change-dir.lua",
    "chars": 444,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal find_file = require(\"nvim-tree.actions.tree.find-file\")\n\nlocal M = {}\n\n---@"
  },
  {
    "path": "lua/nvim-tree/actions/tree/collapse.lua",
    "chars": 1908,
    "preview": "local utils = require(\"nvim-tree.utils\")\nlocal core = require(\"nvim-tree.core\")\nlocal Iterator = require(\"nvim-tree.iter"
  },
  {
    "path": "lua/nvim-tree/actions/tree/find-file.lua",
    "chars": 1626,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal lib = require(\"nvim-tree.lib\")\nlocal view = require(\"nvim-tree.view\")\nlocal"
  },
  {
    "path": "lua/nvim-tree/actions/tree/init.lua",
    "chars": 498,
    "preview": "local M = {}\n\nM.change_dir = require(\"nvim-tree.actions.tree.change-dir\")\nM.find_file = require(\"nvim-tree.actions.tree."
  },
  {
    "path": "lua/nvim-tree/actions/tree/open.lua",
    "chars": 1214,
    "preview": "local lib = require(\"nvim-tree.lib\")\nlocal view = require(\"nvim-tree.view\")\nlocal finders_find_file = require(\"nvim-tree"
  },
  {
    "path": "lua/nvim-tree/actions/tree/resize.lua",
    "chars": 1001,
    "preview": "local view = require(\"nvim-tree.view\")\n\nlocal M = {}\n\n---Resize the tree, persisting the new size.\n---@param opts? nvim_"
  },
  {
    "path": "lua/nvim-tree/actions/tree/toggle.lua",
    "chars": 1742,
    "preview": "local lib = require(\"nvim-tree.lib\")\nlocal view = require(\"nvim-tree.view\")\nlocal finders_find_file = require(\"nvim-tree"
  },
  {
    "path": "lua/nvim-tree/api/impl.lua",
    "chars": 15942,
    "preview": "---Hydrates API meta functions with their implementations.\n---For startup performance reasons, all API implementation's "
  },
  {
    "path": "lua/nvim-tree/api.lua",
    "chars": 3732,
    "preview": "---@brief\n---nvim-tree exposes a public API. This is non breaking, with additions made as necessary.\n---\n---Please do no"
  },
  {
    "path": "lua/nvim-tree/appearance/hi-test.lua",
    "chars": 4725,
    "preview": "local appearance = require(\"nvim-tree.appearance\")\n\nlocal Class = require(\"nvim-tree.classic\")\n\n-- others with name and "
  },
  {
    "path": "lua/nvim-tree/appearance/init.lua",
    "chars": 9499,
    "preview": "local M = {}\n\n---@class HighlightGroup\n---@field group string\n---@field link string|nil\n---@field def string|nil\n\n---@ty"
  },
  {
    "path": "lua/nvim-tree/buffers.lua",
    "chars": 1441,
    "preview": "local DirectoryNode = require(\"nvim-tree.node.directory\")\n\nlocal M = {}\n\n---@type table<string, boolean> record of which"
  },
  {
    "path": "lua/nvim-tree/classic.lua",
    "chars": 4740,
    "preview": "--\n-- classic\n--\n-- Copyright (c) 2014, rxi\n--\n-- This module is free software; you can redistribute it and/or modify it"
  },
  {
    "path": "lua/nvim-tree/commands.lua",
    "chars": 3438,
    "preview": "local M = {}\n\n---@type nvim_tree.api.commands.Command[]\nlocal CMDS = {\n  {\n    name = \"NvimTreeOpen\",\n    opts = {\n     "
  },
  {
    "path": "lua/nvim-tree/config.lua",
    "chars": 13279,
    "preview": "--This will be required after api, before setup.\n--This file should have minimal requires that are cheap and have no dep"
  },
  {
    "path": "lua/nvim-tree/core.lua",
    "chars": 1335,
    "preview": "local events = require(\"nvim-tree.events\")\nlocal notify = require(\"nvim-tree.notify\")\nlocal view = require(\"nvim-tree.vi"
  },
  {
    "path": "lua/nvim-tree/diagnostics.lua",
    "chars": 7445,
    "preview": "local core = require(\"nvim-tree.core\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal view = require(\"nvim-tree.view\")\nl"
  },
  {
    "path": "lua/nvim-tree/enum.lua",
    "chars": 205,
    "preview": "local M = {}\n\n---Reason for filter in filter.lua\n---@enum FILTER_REASON\nM.FILTER_REASON = {\n  none = 0, -- It's not filt"
  },
  {
    "path": "lua/nvim-tree/events.lua",
    "chars": 2496,
    "preview": "local notify = require(\"nvim-tree.notify\")\nlocal Event = require(\"nvim-tree._meta.api.events\").Event\n\nlocal M = {}\n\nloca"
  },
  {
    "path": "lua/nvim-tree/explorer/filters.lua",
    "chars": 7960,
    "preview": "local utils = require(\"nvim-tree.utils\")\nlocal FILTER_REASON = require(\"nvim-tree.enum\").FILTER_REASON\n\nlocal Class = re"
  },
  {
    "path": "lua/nvim-tree/explorer/init.lua",
    "chars": 23374,
    "preview": "local appearance = require(\"nvim-tree.appearance\")\nlocal buffers = require(\"nvim-tree.buffers\")\nlocal core = require(\"nv"
  },
  {
    "path": "lua/nvim-tree/explorer/live-filter.lua",
    "chars": 6437,
    "preview": "local view = require(\"nvim-tree.view\")\nlocal utils = require(\"nvim-tree.utils\")\n\nlocal Class = require(\"nvim-tree.classi"
  },
  {
    "path": "lua/nvim-tree/explorer/sorter.lua",
    "chars": 7915,
    "preview": "local Class = require(\"nvim-tree.classic\")\nlocal DirectoryNode = require(\"nvim-tree.node.directory\")\n\n---@alias SorterTy"
  },
  {
    "path": "lua/nvim-tree/explorer/watch.lua",
    "chars": 3769,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal git = require(\"nvim-tree.git\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal"
  },
  {
    "path": "lua/nvim-tree/git/init.lua",
    "chars": 10970,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal git_utils = require(\"nvim-tree.git.u"
  },
  {
    "path": "lua/nvim-tree/git/runner.lua",
    "chars": 7041,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal notify = require(\"nvim-tree.notify\")"
  },
  {
    "path": "lua/nvim-tree/git/utils.lua",
    "chars": 5407,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal utils = require(\"nvim-tree.utils\")\n\nlocal M = {\n  use_cygpath = false,\n}\n\n---"
  },
  {
    "path": "lua/nvim-tree/help.lua",
    "chars": 7781,
    "preview": "local keymap = require(\"nvim-tree.keymap\")\nlocal api = {} -- circular dependency\n\nlocal PAT_MOUSE = \"^<.*Mouse\"\nlocal PA"
  },
  {
    "path": "lua/nvim-tree/iterators/node-iterator.lua",
    "chars": 1720,
    "preview": "---@class NodeIterator\nlocal NodeIterator = {}\nNodeIterator.__index = NodeIterator\n\n---@param nodes Node[]\n---@return No"
  },
  {
    "path": "lua/nvim-tree/keymap.lua",
    "chars": 7618,
    "preview": "local M = {}\n\n--- Apply mappings to a scratch buffer and return buffer local mappings\n---@param fn fun(bufnr: integer) o"
  },
  {
    "path": "lua/nvim-tree/legacy.lua",
    "chars": 6304,
    "preview": "local notify = require(\"nvim-tree.notify\")\n\nlocal M = {}\n\n--- Create empty sub-tables if not present\n---@param tbl table"
  },
  {
    "path": "lua/nvim-tree/lib.lua",
    "chars": 3991,
    "preview": "local view = require(\"nvim-tree.view\")\nlocal core = require(\"nvim-tree.core\")\nlocal notify = require(\"nvim-tree.notify\")"
  },
  {
    "path": "lua/nvim-tree/log.lua",
    "chars": 3449,
    "preview": "---@alias LogTypes \"all\" | \"config\" | \"copy_paste\" | \"dev\" | \"diagnostics\" | \"git\" | \"profile\" | \"watcher\"\n\n---@type tab"
  },
  {
    "path": "lua/nvim-tree/marks/init.lua",
    "chars": 9333,
    "preview": "local Iterator = require(\"nvim-tree.iterators.node-iterator\")\nlocal core = require(\"nvim-tree.core\")\nlocal lib = require"
  },
  {
    "path": "lua/nvim-tree/node/directory-link.lua",
    "chars": 2853,
    "preview": "local git_utils = require(\"nvim-tree.git.utils\")\nlocal utils = require(\"nvim-tree.utils\")\n\nlocal DirectoryNode = require"
  },
  {
    "path": "lua/nvim-tree/node/directory.lua",
    "chars": 11159,
    "preview": "local git_utils = require(\"nvim-tree.git.utils\")\nlocal icons = require(\"nvim-tree.renderer.components.devicons\")\nlocal n"
  },
  {
    "path": "lua/nvim-tree/node/factory.lua",
    "chars": 1395,
    "preview": "local DirectoryLinkNode = require(\"nvim-tree.node.directory-link\")\nlocal DirectoryNode = require(\"nvim-tree.node.directo"
  },
  {
    "path": "lua/nvim-tree/node/file-link.lua",
    "chars": 2144,
    "preview": "local git_utils = require(\"nvim-tree.git.utils\")\nlocal utils = require(\"nvim-tree.utils\")\n\nlocal FileNode = require(\"nvi"
  },
  {
    "path": "lua/nvim-tree/node/file.lua",
    "chars": 2797,
    "preview": "local git_utils = require(\"nvim-tree.git.utils\")\nlocal icons = require(\"nvim-tree.renderer.components.devicons\")\nlocal u"
  },
  {
    "path": "lua/nvim-tree/node/init.lua",
    "chars": 4203,
    "preview": "local Class = require(\"nvim-tree.classic\")\n\n---Abstract Node class.\n---@class (exact) Node: nvim_tree.Class\n---@field ui"
  },
  {
    "path": "lua/nvim-tree/node/link.lua",
    "chars": 464,
    "preview": "local Class = require(\"nvim-tree.classic\")\n\n---@class (exact) LinkNode: nvim_tree.Class\n---@field link_to string\n---@fie"
  },
  {
    "path": "lua/nvim-tree/node/root.lua",
    "chars": 847,
    "preview": "local DirectoryNode = require(\"nvim-tree.node.directory\")\n\n---@class (exact) RootNode: DirectoryNode\nlocal RootNode = Di"
  },
  {
    "path": "lua/nvim-tree/notify.lua",
    "chars": 1760,
    "preview": "local M = {}\n\nlocal config = {\n  threshold = vim.log.levels.INFO,\n  absolute_path = true,\n}\n\nlocal title_support\n---@ret"
  },
  {
    "path": "lua/nvim-tree/renderer/builder.lua",
    "chars": 15118,
    "preview": "local notify = require(\"nvim-tree.notify\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal view = require(\"nvim-tree.view"
  },
  {
    "path": "lua/nvim-tree/renderer/components/devicons.lua",
    "chars": 937,
    "preview": "---@alias devicons_get_icon fun(name: string, ext: string?, opts: table?): string?, string?\n---@alias devicons_setup fun"
  },
  {
    "path": "lua/nvim-tree/renderer/components/full-name.lua",
    "chars": 3898,
    "preview": "local M = {}\n\nlocal utils = require(\"nvim-tree.utils\")\nlocal view = require(\"nvim-tree.view\")\n\nlocal function hide(win)\n"
  },
  {
    "path": "lua/nvim-tree/renderer/components/init.lua",
    "chars": 316,
    "preview": "local M = {}\n\nM.full_name = require(\"nvim-tree.renderer.components.full-name\")\nM.devicons = require(\"nvim-tree.renderer."
  },
  {
    "path": "lua/nvim-tree/renderer/components/padding.lua",
    "chars": 4174,
    "preview": "local DirectoryNode = require(\"nvim-tree.node.directory\")\n\nlocal M = {}\n\nlocal function check_siblings_for_folder(node, "
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/bookmarks.lua",
    "chars": 1465,
    "preview": "local BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\n\n---@class (exact) BookmarkDecorator: BuiltinDe"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/builtin.lua",
    "chars": 1366,
    "preview": "local Decorator = require(\"nvim-tree.renderer.decorator\")\n\n---Abstract builtin decorator\n---Overrides all methods to use"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/copied.lua",
    "chars": 862,
    "preview": "local BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\n\n---@class (exact) CopiedDecorator: BuiltinDeco"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/cut.lua",
    "chars": 826,
    "preview": "local BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\n\n---@class (exact) CutDecorator: BuiltinDecorat"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/diagnostics.lua",
    "chars": 3771,
    "preview": "local diagnostics = require(\"nvim-tree.diagnostics\")\n\nlocal BuiltinDecorator = require(\"nvim-tree.renderer.decorator.bui"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/git.lua",
    "chars": 7067,
    "preview": "local notify = require(\"nvim-tree.notify\")\n\nlocal BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\nloc"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/hidden.lua",
    "chars": 1595,
    "preview": "local BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\nlocal DirectoryNode = require(\"nvim-tree.node.d"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/init.lua",
    "chars": 2560,
    "preview": "local DecoratorInterface = require(\"nvim-tree._meta.api.decorator\")\n\n---\n---Abstract decorator\n---\n---@class (exact) Dec"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/modified.lua",
    "chars": 1701,
    "preview": "local buffers = require(\"nvim-tree.buffers\")\n\nlocal BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\nl"
  },
  {
    "path": "lua/nvim-tree/renderer/decorator/opened.lua",
    "chars": 948,
    "preview": "local buffers = require(\"nvim-tree.buffers\")\n\nlocal BuiltinDecorator = require(\"nvim-tree.renderer.decorator.builtin\")\n\n"
  },
  {
    "path": "lua/nvim-tree/renderer/init.lua",
    "chars": 4077,
    "preview": "local log = require(\"nvim-tree.log\")\nlocal view = require(\"nvim-tree.view\")\nlocal events = require(\"nvim-tree.events\")\n\n"
  },
  {
    "path": "lua/nvim-tree/utils.lua",
    "chars": 15103,
    "preview": "local M = {\n  debouncers = {},\n}\n\nM.is_unix = vim.fn.has(\"unix\") == 1\nM.is_macos = vim.fn.has(\"mac\") == 1 or vim.fn.has("
  },
  {
    "path": "lua/nvim-tree/view.lua",
    "chars": 17949,
    "preview": "local events = require(\"nvim-tree.events\")\nlocal utils = require(\"nvim-tree.utils\")\nlocal log = require(\"nvim-tree.log\")"
  },
  {
    "path": "lua/nvim-tree/watcher.lua",
    "chars": 6754,
    "preview": "local notify = require(\"nvim-tree.notify\")\nlocal log = require(\"nvim-tree.log\")\nlocal utils = require(\"nvim-tree.utils\")"
  },
  {
    "path": "lua/nvim-tree.lua",
    "chars": 9049,
    "preview": "local api = require(\"nvim-tree.api\")\nlocal log = require(\"nvim-tree.log\")\nlocal view = require(\"nvim-tree.view\")\nlocal u"
  },
  {
    "path": "plugin/nvim-tree.lua",
    "chars": 38,
    "preview": "require(\"nvim-tree.commands\").setup()\n"
  },
  {
    "path": "release-please-config.json",
    "chars": 299,
    "preview": "{\n  \"$schema\": \"https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json\",\n  \"include-v-in-t"
  },
  {
    "path": "scripts/doc-comments.sh",
    "chars": 333,
    "preview": "#!/usr/bin/env bash\n\nout=$(grep -nr \"^--- @\" lua)\n\nif [ \"$out\" ]; then\n\tlast_file=\"\"\n\twhile read -r line; do\n\t\tfile=\"$(e"
  },
  {
    "path": "scripts/help-defaults.sh",
    "chars": 2080,
    "preview": "#!/usr/bin/env sh\n\n# run after changing default config or keymap.lua M.on_attach_default\n# scrapes and updates nvim-tree"
  },
  {
    "path": "scripts/luals-check.sh",
    "chars": 1662,
    "preview": "#!/usr/bin/env sh\n\n# Performs a lua-language-server check on all lua files.\n# $VIMRUNTIME specifies neovim runtime path,"
  },
  {
    "path": "scripts/setup-hooks.sh",
    "chars": 77,
    "preview": "#!/usr/bin/env bash\n\nln -sf ../../.hooks/pre-commit.sh .git/hooks/pre-commit\n"
  },
  {
    "path": "scripts/vimdoc.sh",
    "chars": 2917,
    "preview": "#!/usr/bin/env sh\n\n# Wrapper around Nvim make targets:\n#\n# make doc - gen_vimdoc.lua\n#   Generates doc/nvim-tree-lua.txt"
  },
  {
    "path": "scripts/vimdoc_config.lua",
    "chars": 9619,
    "preview": "--nvim-tree configuration for Nvim's gen_vimdoc.lua\n--Returned config is injected into the above.\n--Execute with `make d"
  }
]

About this extraction

This page contains the full source code of the nvim-tree/nvim-tree.lua GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 151 files (681.9 KB), approximately 183.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!