Compare commits

...

48 Commits
v0 ... v1.4

Author SHA1 Message Date
github-actions[bot]
2086e564c4 chore(master): release nvim-tree 1.4.0 (#2785)
* chore(master): release nvim-tree 1.4.0

* add neovim minimum version 0.9 notice

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-06-09 12:43:06 +10:00
Alexander Courtis
1cac8005df chore: release 1.4.0
Release-As: 1.4.0
2024-06-09 12:30:45 +10:00
Alexander Courtis
8704b6f7fc chore(#2787): minimum nvim version 0.9, replace 0.10 deprecated, enable deprecated warnings (#2788)
* refactor(#2787): replace deprecated

* refactor(#2787): enable deprecated checks

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): use inline deprecation disabling

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): replace deprecated

* refactor(#2787): deprecated are now warnings

* refactor(#2787): 0.9 is the minimum supported version

* Revert "refactor(#2787): replace deprecated"

This reverts commit b6b4c32fcb.

* refactor(#2787): suppress deprecated until 0.11

* refactor(#2787): minimum nvim version 0.8 -> 0.9

* refactor(#2787): reset globals

* refactor(#2787): explicitly check for vim.diagnostic.is_enabled function presence
2024-06-09 12:24:35 +10:00
Alexander Courtis
26632f496e chore(#2731): neovim luadoc 0.10 compliance (#2786)
* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings, type gymnastics

* refactor(#2731): resolve warnings, type gymnastics

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): handle cwd unavailable when opening

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings, type gymnastics

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): style

* refactor(#2731): add _meta library, explicit check disables

* refactor(#2731): add lua-language-server manual install instructions

* refactor(#2731): resolve warnings

* refactor(#2731): explicitly set all diagnostics, reduce deprecated to hint

* Revert "refactor(#2731): resolve warnings"

This reverts commit 9c0526b7b0.

* Revert "refactor(#2731): resolve warnings"

This reverts commit f534fbc606.

* refactor(#2731): handle directory unavailable when deleting

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): resolve warnings

* refactor(#2731): handle directory unavailable when creating explorer

* refactor(#2731): add all nvim lua libraries

* refactor(#2731): resolve warnings

* refactor(#2731): remove vim global

* refactor(#2731): disable deprecated until we have a 0.9->0.10 story
2024-06-01 15:24:03 +10:00
Alexander Courtis
5a87ffe35c ci: release tags vMAJOR.MINOR.PATCH (#2772)
* ci: release tags vMAJOR.MINOR.PATCH

* ci: tidy luarocks release naming
2024-05-28 16:11:06 +10:00
Alexander Courtis
517e4fbb9e revert(#2781): "refactor: replace deprecated use of vim.diagnostic.is_disabled()" (#2784)
Revert "refactor: replace deprecated use of vim.diagnostic.is_disabled()  (#2781)"

This reverts commit 4215f33da5.
2024-05-26 11:34:03 +10:00
Alexander Courtis
4c8ddee453 ci: add lua-language-server 3.9.1 (#2782)
* add lua-language-server 3.9.1

* remove lua-language-server 3.7.3
2024-05-25 15:42:38 +10:00
Zachary Rizer
4215f33da5 refactor: replace deprecated use of vim.diagnostic.is_disabled() (#2781)
* Deprecation fix

* Deprecation fix

* remove unnecessary assignment

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-05-25 14:42:34 +10:00
github-actions[bot]
2bc725a3eb chore(master): release nvim-tree 1.3.3 (#2776)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-14 10:44:50 +10:00
Jacob Kania
340d3a9795 fix: nil access exception with git integration when changing branches (#2774)
Fix nil access exception appearing when changing branches
2024-05-14 10:31:56 +10:00
dependabot[bot]
edd4e25fd4 chore(deps): bump actions/checkout from 3 to 4 (#2773)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-13 12:14:07 +03:00
github-actions[bot]
78c4c083ed chore(master): release nvim-tree 1.3.2 (#2771)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-12 14:45:55 +10:00
Andrew Plaza
acffab931a ci: luarocks releases (#2764)
* add luarocks upload

* refactor

* restrict to full semver versions

* tweak luarocks descriptions

* remove test release following successful run

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-05-12 14:37:49 +10:00
Alexander Courtis
64f61e4c91 fix(#925): handle newlines in file names (#2754) 2024-05-04 13:51:13 +10:00
Alexander Courtis
347e1eb352 fix(#2758): use nvim-webdevicons default file icon, not renderer.icons.glyphs.default, as per :help (#2759)
fix(#2758): use nvim-webdevicons default for default files
2024-04-30 11:32:51 +10:00
github-actions[bot]
76db7ed0da chore(master): release nvim-tree 1.3.1 (#2736)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-04-30 11:12:07 +10:00
dependabot[bot]
5a18b98274 chore(deps): bump amannn/action-semantic-pull-request from 5.5.0 to 5.5.2 (#2756)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-25 11:35:54 +03:00
dependabot[bot]
62008e5cf2 chore(deps): bump amannn/action-semantic-pull-request from 5.4.0 to 5.5.0 (#2755)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-24 11:14:32 +03:00
Alexander Courtis
ae8e46e8fa chore: add plugin manager requirements to bug template (#2752) 2024-04-21 12:58:49 +10:00
Alexander Courtis
81eb8d5192 fix(#2733): escape trash path (#2735)
* fix(#2733): escape trash path

* fix(#2733): escape trash path

* fix(#2733): escape trash path
2024-04-06 12:28:41 +11:00
Yida Zhang
d8d3a1590a fix(#2535): TextYankPost event sends vim.v.event (#2734)
* fix TextYankPost event

* Update lua/nvim-tree/actions/fs/copy-paste.lua

Co-authored-by: Alexander Courtis <alex@courtis.org>

* fix format string

* style

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-31 17:24:47 +11:00
github-actions[bot]
ddd1d6eb21 chore(master): release nvim-tree 1.3.0 (#2725)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-03-30 17:53:21 +11:00
Alexander Courtis
0aca0920f4 fix(#2658): change SpellCap groups to reduce confusion: ExecFile->Question, ImageFile->Question, SpecialFile->Title, Symlink->Underlined; add all other highlight groups to :NvimTreeHiTest (#2732)
* fix(#2658): add all highlight groups to :NvimTreeHiTest

* fix(#2658): add all highlight groups to :NvimTreeHiTest

* fix(#2658): change SpellCap groups: ExecFile->Question, ImageFile->Question, SpecialFile->Title, Symlink->Underlined
2024-03-30 17:47:30 +11:00
Alexander Courtis
308f2fcec2 docs: retire matrix (#2730) 2024-03-30 14:09:08 +11:00
remvn
2d97059661 fix: bookmark filter shows marked directory children (#2719)
* fix: bookmark filter include marked-directory's children

* fix(perf): add path_type to filter functions

* fix: replace undefined type

* fix: correct Node.fs_stat type

* fix: file info popup check fs_stat not nil

* refactor: add stat to should_filter, Node constructor

* perf: early return if bookmark is empty

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-30 13:21:55 +11:00
Alexander Courtis
e508bdc418 docs: contributing: PR subject (#2726)
* docs: contributing: PR subject

* docs: contributing: PR subject
2024-03-26 12:23:48 +11:00
Ava Harris
e20966ae55 feat: add update_focused_file.exclude (#2673)
* Add update_focused_file.exclude and move update_focused_file.ignore_list to update_focused_file.update_root.ignore_list

* Pass ci checks

* Add config migration for update_root and ignore_list

* Missed one mention of update root in find_file.lua

* Update migration code

Co-authored-by: Alexander Courtis <alex@courtis.org>

* make docs consistent

* match on filename instead of entire path

* exclude as a function

* fix docs

* default exclude value

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-25 15:41:05 +11:00
github-actions[bot]
85c502e907 chore(master): release nvim-tree 1.2.0 (#2713)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-03-24 13:25:16 +11:00
gegoune
b1bbd4f7dc ci(workflows): include matrices in concurrency groups (#2715) 2024-03-24 12:44:16 +11:00
Denys Lytviak
f7c09bd72e feat: add api.tree.toggle_enable_filters (#2706)
* feat: toggle filters

* naming refactoring

* change name to enable

* fix default opt

* fix api name

* update doc

* remove default keybinding, toggle live filter

* add API doc

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-16 12:35:13 +11:00
github-actions[bot]
707b24af91 chore(master): release nvim-tree 1.1.1 (#2709)
* chore(master): release nvim-tree 1.1.1

* doc: remove duplicate bug fix entry

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-15 12:26:28 +11:00
remvn
76b98109f6 fix: bookmark filter should include parent directory (#2704)
* fix: bookmark filter should include parent directory

* fix: dont match mark's siblings

* fix: match mark from the start

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-15 12:21:04 +11:00
Asman Umbetov
cfea5bd080 fix(#2395): marks.bulk.move defaults to directory at cursor (#2688)
* fix(#2395): marks.bulk.move defaults to directory at cursor

* fix(#2395): adds check if node_at_cursor.parent is nil

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-15 12:03:06 +11:00
Alexander Courtis
1fd9c98960 fix(#2705): change NvimTreeWindowPicker cterm background from Cyan to more visible DarkBlue (#2708)
fix(#2705): change NvimTreeWindowPicker from Cyan to the more visible DarkBlue
2024-03-15 10:58:40 +11:00
github-actions[bot]
164f11db4f chore(master): release nvim-tree 1.1.0 (#2691)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-03-14 12:10:17 +02:00
Rami Elwan
8f2a50f1cd feat: add api.fs.copy.basename, default mapping ge (#2698)
* feat: add copy basename

* fix: change keymap for copy basename

* fix: use double quotes

* fix: add missing help

---------

Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-03-14 16:57:46 +11:00
gegoune
c64becf80c ci: set concurrency and trigger ci on master (#2701) 2024-03-14 07:36:22 +02:00
Alexander Courtis
3c4267eb50 fix(#2695): git toplevel guard against missing paths (#2696) 2024-03-14 16:23:58 +11:00
DB
041dbd18f4 fix: searchcount exception on invalid search regex (#2693)
* fix: wrap searchcount in pcall to avoid error

* fix: searchcount in pcall

---------

Co-authored-by: xVermillionx <xVermillionx@notvalid>
2024-03-09 13:27:23 +11:00
Mohamed Arish
efafd73efa feat(#2630): file renames can now create directories (#2657)
* Added creating of directories when renaming files

* Style check error? fixed

* Forgot, I added back the line of code that creates a directory named as the file and forgot to remove it

* Added a check for file already exists and also switched the is_error values as they were mismatched

* I don't know how but this somehow fixed the creation of a directory?
2024-03-03 12:25:17 +11:00
Alexander Courtis
d52fdeb0a3 docs: add help indexes (#2684)
* docs: add nvim-tree-index-api

* docs: add nvim-tree-index-opts

* docs: add nvim-tree-index-api

* docs: sort indices

* docs: less verbose

* docs: use dictionary sort for indices
2024-02-24 17:53:25 +11:00
Alexander Courtis
7efaa339d3 docs: :help nvim-tree-legacy (#2679)
doc: add help nvim-tree-legacy
2024-02-24 15:50:10 +11:00
Alexander Courtis
030defdb65 docs: add highlight examples to quickstart, document pre-overhaul SpellCap groups (#2680)
* docs: add highlight examples to quickstart, document pre-overhaul SpellLocal groups

* docs: add highlight examples to quickstart

* docs: document pre-overhaul SpellCap groups

* docs: document pre-overhaul SpellCap groups
2024-02-20 13:24:37 +11:00
github-actions[bot]
d35a8d5ec6 chore(master): release nvim-tree 1.0.0 (#2670)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-02-18 17:28:24 +11:00
Alexander Courtis
d16246a757 chore: release 1.0.0 (#2678)
Release-As: 1.0.0
2024-02-18 17:24:05 +11:00
gegoune
863cf832ce ci: triggers, nvim stable version & env vars (#2671) 2024-02-12 09:49:39 +01:00
dependabot[bot]
c7d4650c38 chore(deps): bump JohnnyMorganz/stylua-action from 3 to 4 (#2672)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-12 09:48:00 +01:00
darcy
4a87b8b46b feat(#2654): filters.custom may be a function (#2655)
* feat(#2654): add `binaries` field to `filters`

* feat(#2648): allow functions in `filters.custom`

* ci: fix: stylua check

* ci: fix: add new keybind and config to docs

* fix: replace os-specific binary filter with `vim.fn.executable`

* fix: remove function and mapping for `binaries` filter

* fix: add `node` parameter to custom filter function

* fix: update doc for custom filter function signature

* fix: add custom filter to `ACCEPTED_TYPES`

* fix: accept single function for custom filter

* fix: change custom filter on `ACCEPTED_TYPES`

* fix: revert to using `path` for custom filter function

* fix: use `function` type for custom filter

* fix: type for custom filter in help

* fix: custom filter single function no longer mutates `M.config.filter_custom`

* fix: remove dead `if` statement in custom filter

* fix: separate custom filter function from `M.ignore_list`

* doc nit

---------

Co-authored-by: darcy <44690813+darccyy@users.noreply.github.com>
Co-authored-by: Alexander Courtis <alex@courtis.org>
2024-02-11 17:18:40 +11:00
50 changed files with 1276 additions and 349 deletions

View File

@@ -59,9 +59,9 @@ body:
If not provided it is very unlikely that the nvim-tree team will be able to address your 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. 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 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 render: lua
validations: validations:
required: true required: true

View File

@@ -2,13 +2,8 @@ name: CI
on: on:
pull_request: pull_request:
branches:
- '*'
push: push:
branches: branches: [master]
- master
- release-please--branches--master--components--nvim-tree
workflow_dispatch: workflow_dispatch:
permissions: permissions:
@@ -18,6 +13,10 @@ jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
concurrency:
group: ${{ github.workflow }}-${{ matrix.lua_version }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
strategy: strategy:
matrix: matrix:
lua_version: [ 5.1 ] lua_version: [ 5.1 ]
@@ -38,6 +37,10 @@ jobs:
style: style:
runs-on: ubuntu-latest runs-on: ubuntu-latest
concurrency:
group: ${{ github.workflow }}-${{ matrix.stylua_version }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
strategy: strategy:
matrix: matrix:
stylua_version: [ 0.19.1 ] stylua_version: [ 0.19.1 ]
@@ -46,7 +49,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: stylua - name: stylua
uses: JohnnyMorganz/stylua-action@v3 uses: JohnnyMorganz/stylua-action@v4
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
version: ${{ matrix.stylua_version }} version: ${{ matrix.stylua_version }}
@@ -57,10 +60,14 @@ jobs:
check: check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
concurrency:
group: ${{ github.workflow }}-${{ matrix.nvim_version }}-${{ matrix.luals_version }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
strategy: strategy:
matrix: matrix:
nvim_version: [ v0.9.4 ] nvim_version: [ stable, nightly ]
luals_version: [ 3.7.3 ] luals_version: [ 3.9.1 ]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -75,7 +82,11 @@ jobs:
mkdir -p luals 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 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
- run: echo "luals/bin" >> "$GITHUB_PATH"
- name: make check - name: make check
run: VIMRUNTIME=/home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime PATH="luals/bin:${PATH}" make check env:
VIMRUNTIME: /home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime
run: make check
- run: make help-check - run: make help-check

37
.github/workflows/luarocks-release.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Luarocks Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
workflow_dispatch:
jobs:
luarocks-upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: LuaRocks Upload
uses: nvim-neorocks/luarocks-tag-release@v5
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

View File

@@ -3,7 +3,9 @@ on:
branches: branches:
- master - master
workflow_dispatch: workflow_dispatch:
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
name: release-please name: release-please
permissions: permissions:
contents: write contents: write
@@ -21,11 +23,15 @@ jobs:
git config user.name github-actions[bot] git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git" git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git"
git tag -d v${{ steps.release.outputs.major }} || true 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 }} || true
git push origin :v${{ steps.release.outputs.major }} || 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 }}.${{ steps.release.outputs.minor }} || true git push origin :v${{ steps.release.outputs.major }} || true
git tag -a v${{ steps.release.outputs.major }} -m "Release v${{ steps.release.outputs.major }}" git push origin :v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true
git tag -a v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} -m "Release 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 }} || true
git push origin v${{ steps.release.outputs.major }} git tag -a v${{ steps.release.outputs.major }} -m "Release v${{ steps.release.outputs.major }}"
git push origin v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} 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 }}

View File

@@ -7,11 +7,13 @@ on:
- edited - edited
- synchronize - synchronize
workflow_dispatch: workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true
jobs: jobs:
semantic-pr-subject: semantic-pr-subject:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: amannn/action-semantic-pull-request@v5.4.0 - uses: amannn/action-semantic-pull-request@v5.5.2
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,17 +1,15 @@
{ {
"$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json", "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json",
"runtime.version" : "Lua 5.1", "runtime.version": "Lua 5.1",
"workspace": { "workspace": {
"library": [ "library": [
"$VIMRUNTIME/lua/vim/lsp", "$VIMRUNTIME/lua/vim",
"${3rd}/luv/library" "${3rd}/luv/library"
] ]
}, },
"diagnostics": { "diagnostics": {
"libraryFiles": "Disable", "libraryFiles": "Disable",
"globals": [ "globals": [],
"vim"
],
"neededFileStatus": { "neededFileStatus": {
"ambiguity-1": "Any", "ambiguity-1": "Any",
"assign-type-mismatch": "Any", "assign-type-mismatch": "Any",
@@ -33,11 +31,19 @@
"duplicate-index": "Any", "duplicate-index": "Any",
"duplicate-set-field": "Any", "duplicate-set-field": "Any",
"empty-block": "Any", "empty-block": "Any",
"global-element": "Any",
"global-in-nil-env": "Any", "global-in-nil-env": "Any",
"incomplete-signature-doc": "None",
"inject-field": "Any",
"invisible": "Any",
"lowercase-global": "Any", "lowercase-global": "Any",
"missing-fields": "Any",
"missing-global-doc": "Any",
"missing-local-export-doc": "None",
"missing-parameter": "Any", "missing-parameter": "Any",
"missing-return": "Any", "missing-return": "Any",
"missing-return-value": "Any", "missing-return-value": "Any",
"name-style-check": "None",
"need-check-nil": "Any", "need-check-nil": "Any",
"newfield-call": "Any", "newfield-call": "Any",
"newline-call": "Any", "newline-call": "Any",
@@ -70,4 +76,3 @@
} }
} }
} }

View File

@@ -1,3 +1,3 @@
{ {
".": "0.100.0" ".": "1.4.0"
} }

View File

@@ -1,5 +1,99 @@
# Changelog # Changelog
## [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) ## [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)

View File

@@ -61,6 +61,15 @@ Assumes `$VIMRUNTIME` is `/usr/share/nvim/runtime`. Adjust as necessary e.g.
VIMRUNTIME="/my/path/to/runtime" make check 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` e.g.
```sh
mkdir luals
curl -L "https://github.com/LuaLS/lua-language-server/releases/download/3.9.1/lua-language-server-3.9.1-linux-x64.tar.gz" | tar zx --directory luals
PATH="luals/bin:${PATH}" make check
```
# Adding New Actions # Adding New Actions
To add a new action, add a file in `actions/name-of-the-action.lua`. You should export a `setup` function if some configuration is needed. To add a new action, add a file in `actions/name-of-the-action.lua`. You should export a `setup` function if some configuration is needed.
@@ -69,15 +78,43 @@ Once you did, you should run `make help-update`
# Documentation # Documentation
## Opts
When adding new options, you should declare the defaults in the main `nvim-tree.lua` file. When adding new options, you should declare the defaults in the main `nvim-tree.lua` file.
Documentation for options should also be added to `nvim-tree-opts` in `doc/nvim-tree-lua.txt` Documentation for options should also be added to `nvim-tree-opts` in `doc/nvim-tree-lua.txt`
## API
When adding or changing API please update :help nvim-tree-api
# Pull Request # Pull Request
Please reference any issues in the description e.g. "resolves #1234". 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. Please check "allow edits by maintainers" to allow nvim-tree developers to make small changes such as documentation tweaks.
A test case to reproduce the issue is required. A ["Clean Room" Replication](https://github.com/nvim-tree/nvim-tree.lua/wiki/Troubleshooting#clean-room-replication) is preferred. ## 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)

View File

@@ -22,7 +22,7 @@ style-doc:
scripts/doc-comments.sh scripts/doc-comments.sh
luals: luals:
scripts/luals-check.sh @scripts/luals-check.sh
# #
# fixes # fixes

View File

@@ -24,11 +24,11 @@
Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for Showcases, Tips, Recipes and more. Take a look at the [wiki](https://github.com/nvim-tree/nvim-tree.lua/wiki) for Showcases, Tips, Recipes and more.
Community support: [matrix](https://matrix.to/#/#nvim-tree:matrix.org) Questions and general support: [Discussions](https://github.com/nvim-tree/nvim-tree.lua/discussions)
## Requirements ## Requirements
[neovim >=0.8.0](https://github.com/neovim/neovim/wiki/Installing-Neovim) [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" [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"
@@ -38,6 +38,8 @@ Please install via your preferred package manager. See [Installation](https://gi
`nvim-tree/nvim-tree.lua` `nvim-tree/nvim-tree.lua`
Major or minor versions may be specified via tags: `v<MAJOR>` e.g. `v1` or `v<MAJOR>.<MINOR>` e.g. `v1.23`
`nvim-tree/nvim-web-devicons` optional, for file icons `nvim-tree/nvim-web-devicons` optional, for file icons
Disabling [netrw](https://neovim.io/doc/user/pi_netrw.html) is strongly advised, see [:help nvim-tree-netrw](doc/nvim-tree-lua.txt) Disabling [netrw](https://neovim.io/doc/user/pi_netrw.html) is strongly advised, see [:help nvim-tree-netrw](doc/nvim-tree-lua.txt)
@@ -110,6 +112,23 @@ require("nvim-tree").setup {
} }
``` ```
### 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 [:help nvim-tree-highlight](doc/nvim-tree-lua.txt) for details.
## Commands ## Commands
See [:help nvim-tree-commands](doc/nvim-tree-lua.txt) See [:help nvim-tree-commands](doc/nvim-tree-lua.txt)

View File

@@ -48,12 +48,18 @@ CONTENTS *nvim-tree*
7. Mappings |nvim-tree-mappings| 7. Mappings |nvim-tree-mappings|
7.1 Mappings: Default |nvim-tree-mappings-default| 7.1 Mappings: Default |nvim-tree-mappings-default|
8. Highlight |nvim-tree-highlight| 8. Highlight |nvim-tree-highlight|
8.1 Highlight Default |nvim-tree-highlight-default| 8.1 Highlight: Default |nvim-tree-highlight-default|
8.2 Highlight Overhaul |nvim-tree-highlight-overhaul| 8.2 Highlight: Overhaul |nvim-tree-highlight-overhaul|
9. Events |nvim-tree-events| 9. Events |nvim-tree-events|
10. Prompts |nvim-tree-prompts| 10. Prompts |nvim-tree-prompts|
11. OS Specific Restrictions |nvim-tree-os-specific| 11. OS Specific Restrictions |nvim-tree-os-specific|
12. Netrw |nvim-tree-netrw| 12. Netrw |nvim-tree-netrw|
13. Legacy |nvim-tree-legacy|
13.1 Legacy: Opts |nvim-tree-legacy-opts|
13.2 Legacy: Highlight |nvim-tree-legacy-highlight|
14. Index |nvim-tree-index|
14.1 Index: Opts |nvim-tree-index-opts|
14.2 Index: API |nvim-tree-index-api|
============================================================================== ==============================================================================
1. INTRODUCTION *nvim-tree-introduction* 1. INTRODUCTION *nvim-tree-introduction*
@@ -97,7 +103,7 @@ Git Integration
Requirements Requirements
This file explorer requires `neovim >= 0.8.0` This file explorer requires `neovim >= 0.9.0`
============================================================================== ==============================================================================
2. QUICKSTART *nvim-tree-quickstart* 2. QUICKSTART *nvim-tree-quickstart*
@@ -179,6 +185,7 @@ Show the mappings: `g?`
`f` Live Filter: Start |nvim-tree-api.live_filter.start()| `f` Live Filter: Start |nvim-tree-api.live_filter.start()|
`g?` Help |nvim-tree-api.tree.toggle_help()| `g?` Help |nvim-tree-api.tree.toggle_help()|
`gy` Copy Absolute Path |nvim-tree-api.fs.copy.absolute_path()| `gy` Copy Absolute Path |nvim-tree-api.fs.copy.absolute_path()|
`ge` Copy Basename |nvim-tree-api.fs.copy.basename()|
`H` Toggle Filter: Dotfiles |nvim-tree-api.tree.toggle_hidden_filter()| `H` Toggle Filter: Dotfiles |nvim-tree-api.tree.toggle_hidden_filter()|
`I` Toggle Filter: Git Ignore |nvim-tree-api.tree.toggle_gitignore_filter()| `I` Toggle Filter: Git Ignore |nvim-tree-api.tree.toggle_gitignore_filter()|
`J` Last Sibling |nvim-tree-api.node.navigate.sibling.last()| `J` Last Sibling |nvim-tree-api.node.navigate.sibling.last()|
@@ -238,8 +245,15 @@ via |nvim-tree.on_attach| e.g. >
Run |:NvimTreeHiTest| to show all the highlights that nvim-tree uses. 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 They can be customised before or after setup is called and will be immediately
applied at runtime. applied at runtime. e.g. >
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| for details. See |nvim-tree-highlight| for details.
============================================================================== ==============================================================================
@@ -486,8 +500,11 @@ Following is the default configuration. See |nvim-tree-opts| for details.
}, },
update_focused_file = { update_focused_file = {
enable = false, enable = false,
update_root = false, update_root = {
ignore_list = {}, enable = false,
ignore_list = {},
},
exclude = false,
}, },
system_open = { system_open = {
cmd = "", cmd = "",
@@ -523,6 +540,7 @@ Following is the default configuration. See |nvim-tree-opts| for details.
show_on_open_dirs = true, show_on_open_dirs = true,
}, },
filters = { filters = {
enable = true,
git_ignored = true, git_ignored = true,
dotfiles = false, dotfiles = false,
git_clean = false, git_clean = false,
@@ -665,7 +683,7 @@ Prefer startup root directory when updating root directory of the tree.
Only relevant when `update_focused_file.update_root` is `true` Only relevant when `update_focused_file.update_root` is `true`
Type: `boolean`, Default: `false` Type: `boolean`, Default: `false`
*nvim-tree.sync_root_with_cwd* (previously `update_cwd`) *nvim-tree.sync_root_with_cwd*
Changes the tree root directory on `DirChanged` and refreshes the tree. Changes the tree root directory on `DirChanged` and refreshes the tree.
Type: `boolean`, Default: `false` Type: `boolean`, Default: `false`
@@ -687,7 +705,7 @@ Type: `boolean`, Default: `false`
File and folder sorting options. File and folder sorting options.
*nvim-tree.sort.sorter* (previously `sort_by`) *nvim-tree.sort.sorter*
Changes how files within the same directory are sorted. Changes how files within the same directory are sorted.
Can be one of `"name"`, `"case_sensitive"`, `"modification_time"`, `"extension"`, Can be one of `"name"`, `"case_sensitive"`, `"modification_time"`, `"extension"`,
`"suffix"`, `"filetype"` or a function. `"suffix"`, `"filetype"` or a function.
@@ -766,7 +784,7 @@ Show |signcolumn|. Value can be `"yes"`, `"auto"`, `"no"`.
Width of the window: can be a `%` string, a number representing columns, a Width of the window: can be a `%` string, a number representing columns, a
function or a table. function or a table.
A table indicates that the view should be dynamically sized based on the A table indicates that the view should be dynamically sized based on the
longest line (previously `view.adaptive_size`). longest line.
Type: `string | number | table | function()` returning a number Type: `string | number | table | function()` returning a number
Default: `30` Default: `30`
@@ -814,7 +832,6 @@ Use nvim-tree in a floating window.
Highlight precedence, additive: Highlight precedence, additive:
git < opened < modified < bookmarked < diagnostics < copied < cut git < opened < modified < bookmarked < diagnostics < copied < cut
Neovim <= 0.8 will only show the highest.
*nvim-tree.renderer.add_trailing* *nvim-tree.renderer.add_trailing*
Appends a trailing slash to folder names. Appends a trailing slash to folder names.
@@ -1086,19 +1103,25 @@ Enable this feature.
Type: `boolean`, Default: `false` Type: `boolean`, Default: `false`
*nvim-tree.update_focused_file.update_root* *nvim-tree.update_focused_file.update_root*
(previously `update_focused_file.update_cwd`)
Update the root directory of the tree if the file is not under current Update the root directory of the tree if the file is not under current
root directory. It prefers vim's cwd and `root_dirs`. root directory. It prefers vim's cwd and `root_dirs`.
Otherwise it falls back to the folder containing the file. Otherwise it falls back to the folder containing the file.
Only relevant when `update_focused_file.enable` is `true` Only relevant when `update_focused_file.enable` is `true`
Type: `boolean`, Default: `false`
*nvim-tree.update_focused_file.ignore_list* *nvim-tree.update_focused_file.update_root.enable*
List of buffer names and filetypes that will not update the root dir Type: `boolean`, Default: `false`
of the tree if the file isn't found under the current root directory.
Only relevant when `update_focused_file.update_root` and *nvim-tree.update_focused_file.update_root.ignore_list*
`update_focused_file.enable` are `true`. List of buffer names and filetypes that will not update the root dir
Type: {string}, Default: `{}` of the tree if the file isn't found under the current root directory.
Only relevant when `update_focused_file.update_root.enable` and
`update_focused_file.enable` are `true`.
Type: {string}, Default: `{}`
*nvim-tree.update_focused_file.exclude*
A function that returns true if the file should not be focused when opening.
Takes the `BufEnter` event as an argument. see |autocmd-events|
Type: {function}, Default: `false`
============================================================================== ==============================================================================
5.6 OPTS: SYSTEM OPEN *nvim-tree-opts-system-open* 5.6 OPTS: SYSTEM OPEN *nvim-tree-opts-system-open*
@@ -1229,7 +1252,12 @@ Only relevant when |modified.show_on_dirs| is `true`.
File / folder filters that may be toggled. File / folder filters that may be toggled.
*nvim-tree.filters.git_ignored* (previously `git.ignore`) *nvim-tree.filters.enable*
Enable / disable all filters including live filter.
Toggle via |nvim-tree-api.tree.toggle_enable_filters()|
Type: `boolean`, Default: `true`
*nvim-tree.filters.git_ignored*
Ignore files based on `.gitignore`. Requires |git.enable| `= true` Ignore files based on `.gitignore`. Requires |git.enable| `= true`
Toggle via |nvim-tree-api.tree.toggle_gitignore_filter()|, default `I` Toggle via |nvim-tree-api.tree.toggle_gitignore_filter()|, default `I`
Type: `boolean`, Default: `true` Type: `boolean`, Default: `true`
@@ -1262,7 +1290,7 @@ Enabling this is not useful as there is no means yet to persist bookmarks.
Custom list of vim regex for file/directory names that will not be shown. Custom list of vim regex for file/directory names that will not be shown.
Backslashes must be escaped e.g. "^\\.git". See |string-match|. Backslashes must be escaped e.g. "^\\.git". See |string-match|.
Toggle via |nvim-tree-api.tree.toggle_custom_filter()|, default `U` Toggle via |nvim-tree-api.tree.toggle_custom_filter()|, default `U`
Type: {string}, Default: `{}` Type: {string} | `function(absolute_path)`, Default: `{}`
*nvim-tree.filters.exclude* *nvim-tree.filters.exclude*
List of directories or files to exclude from filtering: always show them. List of directories or files to exclude from filtering: always show them.
@@ -1376,7 +1404,7 @@ Configuration options for opening a file from nvim-tree.
Prevent new opened file from opening in the same window as the tree. Prevent new opened file from opening in the same window as the tree.
Type: `boolean`, Default: `true` Type: `boolean`, Default: `true`
*nvim-tree.actions.open_file.resize_window* (previously `view.auto_resize`) *nvim-tree.actions.open_file.resize_window*
Resizes the tree when opening a file. Resizes the tree when opening a file.
Type: `boolean`, Default: `true` Type: `boolean`, Default: `true`
@@ -1444,7 +1472,7 @@ Windows default `"trash"` requires `trash-cli` or similar
*nvim-tree.tab.sync* *nvim-tree.tab.sync*
Configuration for syncing nvim-tree across tabs. Configuration for syncing nvim-tree across tabs.
*nvim-tree.tab.sync.open* (previously `nvim-tree.open_on_tab`) *nvim-tree.tab.sync.open*
Opens the tree automatically when switching tabpage or opening a new Opens the tree automatically when switching tabpage or opening a new
tabpage if the tree was previously open. tabpage if the tree was previously open.
Type: `boolean`, Default: `false` Type: `boolean`, Default: `false`
@@ -1453,7 +1481,7 @@ Configuration for syncing nvim-tree across tabs.
Closes the tree across all tabpages when the tree is closed. Closes the tree across all tabpages when the tree is closed.
Type: `boolean`, Default: `false` Type: `boolean`, Default: `false`
*nvim-tree.tab.sync.ignore* (previously `nvim-tree.ignore_buf_on_tab_change`) *nvim-tree.tab.sync.ignore*
List of filetypes or buffer names on new tab that will prevent List of filetypes or buffer names on new tab that will prevent
|nvim-tree.tab.sync.open| and |nvim-tree.tab.sync.close| |nvim-tree.tab.sync.open| and |nvim-tree.tab.sync.close|
Type: {string}, Default: `{}` Type: {string}, Default: `{}`
@@ -1493,7 +1521,7 @@ Confirmation prompts.
Prompt before removing. Prompt before removing.
Type: `boolean`, Default: `true` Type: `boolean`, Default: `true`
*nvim-tree.ui.confirm.trash* (previously `trash.require_confirm`) *nvim-tree.ui.confirm.trash*
Prompt before trashing. Prompt before trashing.
Type: `boolean`, Default: `true` Type: `boolean`, Default: `true`
@@ -1689,6 +1717,10 @@ tree.expand_all() *nvim-tree-api.tree.expand_all()*
Recursively expand all nodes in the tree. Recursively expand all nodes in the tree.
Folder: only the nodes underneath that folder. Folder: only the nodes underneath that folder.
*nvim-tree-api.tree.toggle_enable_filters()*
tree.toggle_enable_filters()
Toggle |nvim-tree.filters.enable| all filters.
*nvim-tree-api.tree.toggle_gitignore_filter()* *nvim-tree-api.tree.toggle_gitignore_filter()*
tree.toggle_gitignore_filter() tree.toggle_gitignore_filter()
Toggle |nvim-tree.filters.git_ignored| filter. Toggle |nvim-tree.filters.git_ignored| filter.
@@ -2228,6 +2260,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function.
vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start')) vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start'))
vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) 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', '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.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles')) vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles'))
vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore')) vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore'))
vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling'))
@@ -2301,7 +2334,7 @@ To prevent usage of a highlight:
`:hi! link NvimTreeExecFile NONE` `:hi! link NvimTreeExecFile NONE`
============================================================================== ==============================================================================
8.1 HIGHLIGHT DEFAULT *nvim-tree-highlight-default* 8.1 HIGHLIGHT: DEFAULT *nvim-tree-highlight-default*
|:highlight-link| `default` or |:highlight-default| define the groups on setup: |:highlight-link| `default` or |:highlight-default| define the groups on setup:
@@ -2419,7 +2452,9 @@ Diagnostics Folder Highlight: >
NvimTreeDiagnosticHintFolderHL NvimTreeDiagnosticHintFileHL NvimTreeDiagnosticHintFolderHL NvimTreeDiagnosticHintFileHL
< <
============================================================================== ==============================================================================
8.1 HIGHLIGHT OVERHAUL *nvim-tree-highlight-overhaul* 8.2 HIGHLIGHT: OVERHAUL *nvim-tree-highlight-overhaul*
See |nvim-tree-legacy-highlight| for old highlight group compatibility.
2024-01-20: significant highlighting changes, some breaking: 2024-01-20: significant highlighting changes, some breaking:
@@ -2444,51 +2479,14 @@ Diagnostics Folder Highlight: >
- NvimTreeSpecialFile PreProc -> SpellCap - NvimTreeSpecialFile PreProc -> SpellCap
- NvimTreeSymlink Statement -> SpellCap - NvimTreeSymlink Statement -> SpellCap
Legacy highlight group are still obeyed when they are defined and the current Approximate pre-overhaul values for the `SpellCap` groups may be set via: >
highlight group is not, hard linking as follows: >
NvimTreeModifiedIcon NvimTreeModifiedFile vim.cmd([[
NvimTreeOpenedHL NvimTreeOpenedFile :hi NvimTreeExecFile gui=bold guifg=#ffa0a0
NvimTreeBookmarkIcon NvimTreeBookmark :hi NvimTreeSymlink gui=bold guifg=#ffff60
:hi NvimTreeSpecialFile gui=bold,underline guifg=#ff80ff
NvimTreeGitDeletedIcon NvimTreeGitDeleted :hi NvimTreeImageFile gui=bold guifg=#ff80ff
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
< <
============================================================================== ==============================================================================
9. EVENTS *nvim-tree-events* 9. EVENTS *nvim-tree-events*
@@ -2642,7 +2640,7 @@ Windows WSL and PowerShell
- Some filesystem watcher error related to permissions will not be reported - Some filesystem watcher error related to permissions will not be reported
============================================================================== ==============================================================================
12. NETRW *nvim-tree-netrw* 12. NETRW *nvim-tree-netrw*
|netrw| is a standard neovim plugin that is enabled by default. It provides, |netrw| is a standard neovim plugin that is enabled by default. It provides,
amongst other functionality, a file/directory browser. amongst other functionality, a file/directory browser.
@@ -2662,4 +2660,343 @@ keep using |netrw| without its browser features please ensure:
|nvim-tree.disable_netrw| `= false` |nvim-tree.disable_netrw| `= false`
|nvim-tree.hijack_netrw| ` = true` |nvim-tree.hijack_netrw| ` = true`
==============================================================================
13. LEGACY *nvim-tree-legacy*
Breaking refactors have been made however the legacy versions will be silently
migrated and used.
There are no plans to remove this migration.
==============================================================================
13.1 LEGACY: OPTS *nvim-tree-legacy-opts*
Legacy options are translated to the current, making type and value changes as
needed.
`update_cwd` |nvim-tree.sync_root_with_cwd|
`update_focused_file.update_cwd` |nvim-tree.update_focused_file.update_root|
`open_on_tab` |nvim-tree.tab.sync.open|
`ignore_buf_on_tab_change` |nvim-tree.tab.sync.ignore|
`renderer.root_folder_modifier` |nvim-tree.renderer.root_folder_label|
`update_focused_file.debounce_delay` |nvim-tree.view.debounce_delay|
`trash.require_confirm` |nvim-tree.ui.confirm.trash|
`view.adaptive_size` |nvim-tree.view.width|
`sort_by` |nvim-tree.sort.sorter|
`git.ignore` |nvim-tree.filters.git_ignored|
`renderer.icons.webdev_colors` |nvim-tree.renderer.icons.web_devicons.file.color|
==============================================================================
13.2 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
<
==============================================================================
14 INDEX *nvim-tree-index*
==============================================================================
14.1 INDEX: OPTS *nvim-tree-index-opts*
|nvim-tree.actions.change_dir|
|nvim-tree.actions.change_dir.enable|
|nvim-tree.actions.change_dir.global|
|nvim-tree.actions.change_dir.restrict_above_cwd|
|nvim-tree.actions.expand_all|
|nvim-tree.actions.expand_all.exclude|
|nvim-tree.actions.expand_all.max_folder_discovery|
|nvim-tree.actions.file_popup|
|nvim-tree.actions.file_popup.open_win_config|
|nvim-tree.actions.open_file|
|nvim-tree.actions.open_file.eject|
|nvim-tree.actions.open_file.quit_on_open|
|nvim-tree.actions.open_file.resize_window|
|nvim-tree.actions.open_file.window_picker|
|nvim-tree.actions.open_file.window_picker.chars|
|nvim-tree.actions.open_file.window_picker.enable|
|nvim-tree.actions.open_file.window_picker.exclude|
|nvim-tree.actions.open_file.window_picker.picker|
|nvim-tree.actions.remove_file.close_window|
|nvim-tree.actions.use_system_clipboard|
|nvim-tree.auto_reload_on_write|
|nvim-tree.diagnostics.debounce_delay|
|nvim-tree.diagnostics.enable|
|nvim-tree.diagnostics.icons|
|nvim-tree.diagnostics.severity|
|nvim-tree.diagnostics.severity.max|
|nvim-tree.diagnostics.severity.min|
|nvim-tree.diagnostics.show_on_dirs|
|nvim-tree.diagnostics.show_on_open_dirs|
|nvim-tree.disable_netrw|
|nvim-tree.experimental|
|nvim-tree.filesystem_watchers.debounce_delay|
|nvim-tree.filesystem_watchers.enable|
|nvim-tree.filesystem_watchers.ignore_dirs|
|nvim-tree.filters.custom|
|nvim-tree.filters.dotfiles|
|nvim-tree.filters.enable|
|nvim-tree.filters.exclude|
|nvim-tree.filters.git_clean|
|nvim-tree.filters.git_ignored|
|nvim-tree.filters.no_bookmark|
|nvim-tree.filters.no_buffer|
|nvim-tree.git.cygwin_support|
|nvim-tree.git.disable_for_dirs|
|nvim-tree.git.enable|
|nvim-tree.git.show_on_dirs|
|nvim-tree.git.show_on_open_dirs|
|nvim-tree.git.timeout|
|nvim-tree.help.sort_by|
|nvim-tree.hijack_cursor|
|nvim-tree.hijack_directories.auto_open|
|nvim-tree.hijack_directories.enable|
|nvim-tree.hijack_netrw|
|nvim-tree.hijack_unnamed_buffer_when_opening|
|nvim-tree.live_filter.always_show_folders|
|nvim-tree.live_filter.prefix|
|nvim-tree.log.enable|
|nvim-tree.log.truncate|
|nvim-tree.log.types|
|nvim-tree.log.types.all|
|nvim-tree.log.types.config|
|nvim-tree.log.types.copy_paste|
|nvim-tree.log.types.dev|
|nvim-tree.log.types.diagnostics|
|nvim-tree.log.types.git|
|nvim-tree.log.types.profile|
|nvim-tree.log.types.watcher|
|nvim-tree.modified.enable|
|nvim-tree.modified.show_on_dirs|
|nvim-tree.modified.show_on_open_dirs|
|nvim-tree.notify.threshold|
|nvim-tree.on_attach|
|nvim-tree.prefer_startup_root|
|nvim-tree.reload_on_bufenter|
|nvim-tree.renderer.add_trailing|
|nvim-tree.renderer.full_name|
|nvim-tree.renderer.group_empty|
|nvim-tree.renderer.highlight_bookmarks|
|nvim-tree.renderer.highlight_clipboard|
|nvim-tree.renderer.highlight_diagnostics|
|nvim-tree.renderer.highlight_git|
|nvim-tree.renderer.highlight_modified|
|nvim-tree.renderer.highlight_opened_files|
|nvim-tree.renderer.icons|
|nvim-tree.renderer.icons.bookmarks_placement|
|nvim-tree.renderer.icons.diagnostics_placement|
|nvim-tree.renderer.icons.git_placement|
|nvim-tree.renderer.icons.glyphs|
|nvim-tree.renderer.icons.glyphs.default|
|nvim-tree.renderer.icons.glyphs.folder|
|nvim-tree.renderer.icons.glyphs.git|
|nvim-tree.renderer.icons.glyphs.modified|
|nvim-tree.renderer.icons.glyphs.symlink|
|nvim-tree.renderer.icons.modified_placement|
|nvim-tree.renderer.icons.padding|
|nvim-tree.renderer.icons.show|
|nvim-tree.renderer.icons.show.bookmarks|
|nvim-tree.renderer.icons.show.diagnostics|
|nvim-tree.renderer.icons.show.file|
|nvim-tree.renderer.icons.show.folder|
|nvim-tree.renderer.icons.show.folder_arrow|
|nvim-tree.renderer.icons.show.git|
|nvim-tree.renderer.icons.show.modified|
|nvim-tree.renderer.icons.symlink_arrow|
|nvim-tree.renderer.icons.web_devicons|
|nvim-tree.renderer.icons.web_devicons.file|
|nvim-tree.renderer.icons.web_devicons.file.color|
|nvim-tree.renderer.icons.web_devicons.file.enable|
|nvim-tree.renderer.icons.web_devicons.folder|
|nvim-tree.renderer.icons.web_devicons.folder.color|
|nvim-tree.renderer.icons.web_devicons.folder.enable|
|nvim-tree.renderer.indent_markers|
|nvim-tree.renderer.indent_markers.enable|
|nvim-tree.renderer.indent_markers.icons|
|nvim-tree.renderer.indent_markers.inline_arrows|
|nvim-tree.renderer.indent_width|
|nvim-tree.renderer.root_folder_label|
|nvim-tree.renderer.special_files|
|nvim-tree.renderer.symlink_destination|
|nvim-tree.respect_buf_cwd|
|nvim-tree.root_dirs|
|nvim-tree.select_prompts|
|nvim-tree.sort.files_first|
|nvim-tree.sort.folders_first|
|nvim-tree.sort.sorter|
|nvim-tree.sync_root_with_cwd|
|nvim-tree.system_open.args|
|nvim-tree.system_open.cmd|
|nvim-tree.tab.sync|
|nvim-tree.tab.sync.close|
|nvim-tree.tab.sync.ignore|
|nvim-tree.tab.sync.open|
|nvim-tree.trash.cmd|
|nvim-tree.ui.confirm|
|nvim-tree.ui.confirm.default_yes|
|nvim-tree.ui.confirm.remove|
|nvim-tree.ui.confirm.trash|
|nvim-tree.update_focused_file.enable|
|nvim-tree.update_focused_file.exclude|
|nvim-tree.update_focused_file.update_root|
|nvim-tree.update_focused_file.update_root.enable|
|nvim-tree.update_focused_file.update_root.ignore_list|
|nvim-tree.view.centralize_selection|
|nvim-tree.view.cursorline|
|nvim-tree.view.debounce_delay|
|nvim-tree.view.float|
|nvim-tree.view.float.enable|
|nvim-tree.view.float.open_win_config|
|nvim-tree.view.float.quit_on_focus_loss|
|nvim-tree.view.number|
|nvim-tree.view.preserve_window_proportions|
|nvim-tree.view.relativenumber|
|nvim-tree.view.side|
|nvim-tree.view.signcolumn|
|nvim-tree.view.width|
|nvim-tree.view.width.max|
|nvim-tree.view.width.min|
|nvim-tree.view.width.padding|
==============================================================================
14.2 INDEX: API *nvim-tree-index-api*
|nvim-tree-api.commands.get()|
|nvim-tree-api.config.mappings.default_on_attach()|
|nvim-tree-api.config.mappings.get_keymap()|
|nvim-tree-api.config.mappings.get_keymap_default()|
|nvim-tree-api.diagnostics.hi_test()|
|nvim-tree-api.events.subscribe()|
|nvim-tree-api.fs.clear_clipboard()|
|nvim-tree-api.fs.copy.absolute_path()|
|nvim-tree-api.fs.copy.filename()|
|nvim-tree-api.fs.copy.node()|
|nvim-tree-api.fs.copy.relative_path()|
|nvim-tree-api.fs.create()|
|nvim-tree-api.fs.cut()|
|nvim-tree-api.fs.paste()|
|nvim-tree-api.fs.print_clipboard()|
|nvim-tree-api.fs.remove()|
|nvim-tree-api.fs.rename()|
|nvim-tree-api.fs.rename_basename()|
|nvim-tree-api.fs.rename_full()|
|nvim-tree-api.fs.rename_node()|
|nvim-tree-api.fs.rename_sub()|
|nvim-tree-api.fs.trash()|
|nvim-tree-api.git.reload()|
|nvim-tree-api.live_filter.clear()|
|nvim-tree-api.live_filter.start()|
|nvim-tree-api.marks.bulk.delete()|
|nvim-tree-api.marks.bulk.move()|
|nvim-tree-api.marks.bulk.trash()|
|nvim-tree-api.marks.clear()|
|nvim-tree-api.marks.get()|
|nvim-tree-api.marks.list()|
|nvim-tree-api.marks.navigate.next()|
|nvim-tree-api.marks.navigate.prev()|
|nvim-tree-api.marks.navigate.select()|
|nvim-tree-api.marks.toggle()|
|nvim-tree-api.node.navigate.diagnostics.next()|
|nvim-tree-api.node.navigate.diagnostics.next_recursive()|
|nvim-tree-api.node.navigate.diagnostics.prev()|
|nvim-tree-api.node.navigate.diagnostics.prev_recursive()|
|nvim-tree-api.node.navigate.git.next()|
|nvim-tree-api.node.navigate.git.next_recursive()|
|nvim-tree-api.node.navigate.git.next_skip_gitignored()|
|nvim-tree-api.node.navigate.git.prev()|
|nvim-tree-api.node.navigate.git.prev_recursive()|
|nvim-tree-api.node.navigate.git.prev_skip_gitignored()|
|nvim-tree-api.node.navigate.opened.next()|
|nvim-tree-api.node.navigate.opened.prev()|
|nvim-tree-api.node.navigate.parent()|
|nvim-tree-api.node.navigate.parent_close()|
|nvim-tree-api.node.navigate.sibling.first()|
|nvim-tree-api.node.navigate.sibling.last()|
|nvim-tree-api.node.navigate.sibling.next()|
|nvim-tree-api.node.navigate.sibling.prev()|
|nvim-tree-api.node.open.drop()|
|nvim-tree-api.node.open.edit()|
|nvim-tree-api.node.open.horizontal()|
|nvim-tree-api.node.open.no_window_picker()|
|nvim-tree-api.node.open.preview()|
|nvim-tree-api.node.open.preview_no_picker()|
|nvim-tree-api.node.open.replace_tree_buffer()|
|nvim-tree-api.node.open.tab()|
|nvim-tree-api.node.open.tab_drop()|
|nvim-tree-api.node.open.toggle_group_empty()|
|nvim-tree-api.node.open.vertical()|
|nvim-tree-api.node.run.cmd()|
|nvim-tree-api.node.run.system()|
|nvim-tree-api.node.show_info_popup()|
|nvim-tree-api.tree.change_root()|
|nvim-tree-api.tree.change_root_to_node()|
|nvim-tree-api.tree.change_root_to_parent()|
|nvim-tree-api.tree.close()|
|nvim-tree-api.tree.close_in_all_tabs()|
|nvim-tree-api.tree.close_in_this_tab()|
|nvim-tree-api.tree.collapse_all()|
|nvim-tree-api.tree.expand_all()|
|nvim-tree-api.tree.find_file()|
|nvim-tree-api.tree.focus()|
|nvim-tree-api.tree.get_nodes()|
|nvim-tree-api.tree.get_node_under_cursor()|
|nvim-tree-api.tree.is_tree_buf()|
|nvim-tree-api.tree.is_visible()|
|nvim-tree-api.tree.open()|
|nvim-tree-api.tree.reload()|
|nvim-tree-api.tree.search_node()|
|nvim-tree-api.tree.toggle()|
|nvim-tree-api.tree.toggle_custom_filter()|
|nvim-tree-api.tree.toggle_enable_filters()|
|nvim-tree-api.tree.toggle_git_clean_filter()|
|nvim-tree-api.tree.toggle_gitignore_filter()|
|nvim-tree-api.tree.toggle_help()|
|nvim-tree-api.tree.toggle_hidden_filter()|
|nvim-tree-api.tree.toggle_no_bookmark_filter()|
|nvim-tree-api.tree.toggle_no_buffer_filter()|
|nvim-tree-api.tree.winid()|
==============================================================================
vim:tw=78:ts=4:sw=4:et:ft=help:norl: vim:tw=78:ts=4:sw=4:et:ft=help:norl:

View File

@@ -11,7 +11,6 @@ local core = require "nvim-tree.core"
local git = require "nvim-tree.git" local git = require "nvim-tree.git"
local filters = require "nvim-tree.explorer.filters" local filters = require "nvim-tree.explorer.filters"
local buffers = require "nvim-tree.buffers" local buffers = require "nvim-tree.buffers"
local events = require "nvim-tree.events"
local notify = require "nvim-tree.notify" local notify = require "nvim-tree.notify"
local _config = {} local _config = {}
@@ -26,8 +25,15 @@ local M = {
function M.change_root(path, bufnr) function M.change_root(path, bufnr)
-- skip if current file is in ignore_list -- skip if current file is in ignore_list
if type(bufnr) == "number" then if type(bufnr) == "number" then
local ft = vim.api.nvim_buf_get_option(bufnr, "filetype") or "" local ft
for _, value in pairs(_config.update_focused_file.ignore_list) do
if vim.fn.has "nvim-0.10" == 1 then
ft = vim.api.nvim_get_option_value("filetype", { buf = bufnr }) or ""
else
ft = vim.api.nvim_buf_get_option(bufnr, "filetype") or "" ---@diagnostic disable-line: deprecated
end
for _, value in pairs(_config.update_focused_file.update_root.ignore_list) do
if utils.str_find(path, value) or utils.str_find(ft, value) then if utils.str_find(path, value) or utils.str_find(ft, value) then
return return
end end
@@ -78,7 +84,14 @@ end
function M.tab_enter() function M.tab_enter()
if view.is_visible { any_tabpage = true } then if view.is_visible { any_tabpage = true } then
local bufname = vim.api.nvim_buf_get_name(0) local bufname = vim.api.nvim_buf_get_name(0)
local ft = vim.api.nvim_buf_get_option(0, "ft")
local ft
if vim.fn.has "nvim-0.10" == 1 then
ft = vim.api.nvim_get_option_value("filetype", { buf = 0 }) or ""
else
ft = vim.api.nvim_buf_get_option(0, "ft") ---@diagnostic disable-line: deprecated
end
for _, filter in ipairs(M.config.tab.sync.ignore) do for _, filter in ipairs(M.config.tab.sync.ignore) do
if bufname:match(filter) ~= nil or ft:match(filter) ~= nil then if bufname:match(filter) ~= nil or ft:match(filter) ~= nil then
return return
@@ -105,8 +118,8 @@ function M.open_on_directory()
end end
function M.place_cursor_on_node() function M.place_cursor_on_node()
local search = vim.fn.searchcount() local ok, search = pcall(vim.fn.searchcount)
if search and search.exact_match == 1 then if ok and search and search.exact_match == 1 then
return return
end end
@@ -149,7 +162,7 @@ function M.change_dir(name)
actions.root.change_dir.fn(name) actions.root.change_dir.fn(name)
end end
if _config.update_focused_file.enable then if _config.update_focused_file.update_root.enable then
actions.tree.find_file.fn() actions.tree.find_file.fn()
end end
end end
@@ -247,7 +260,11 @@ local function setup_autocommands(opts)
end end
if opts.update_focused_file.enable then if opts.update_focused_file.enable then
create_nvim_tree_autocmd("BufEnter", { create_nvim_tree_autocmd("BufEnter", {
callback = function() callback = function(event)
local exclude = opts.update_focused_file.exclude
if type(exclude) == "function" and exclude(event) then
return
end
utils.debounce("BufEnter:find_file", opts.view.debounce_delay, function() utils.debounce("BufEnter:find_file", opts.view.debounce_delay, function()
actions.tree.find_file.fn() actions.tree.find_file.fn()
end) end)
@@ -320,21 +337,6 @@ local function setup_autocommands(opts)
end, end,
}) })
end end
-- TODO #1545 remove similar check from view.resize
if vim.fn.has "nvim-0.9" == 1 then
create_nvim_tree_autocmd("WinResized", {
callback = function()
if vim.v.event and vim.v.event.windows then
for _, winid in ipairs(vim.v.event.windows) do
if vim.api.nvim_win_is_valid(winid) and utils.is_nvim_tree_buf(vim.api.nvim_win_get_buf(winid)) then
events._dispatch_on_tree_resize(vim.api.nvim_win_get_width(winid))
end
end
end
end,
})
end
end end
local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
@@ -462,8 +464,11 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
}, },
update_focused_file = { update_focused_file = {
enable = false, enable = false,
update_root = false, update_root = {
ignore_list = {}, enable = false,
ignore_list = {},
},
exclude = false,
}, },
system_open = { system_open = {
cmd = "", cmd = "",
@@ -499,6 +504,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
show_on_open_dirs = true, show_on_open_dirs = true,
}, },
filters = { filters = {
enable = true,
git_ignored = true, git_ignored = true,
dotfiles = false, dotfiles = false,
git_clean = false, git_clean = false,
@@ -623,6 +629,12 @@ local ACCEPTED_TYPES = {
group_empty = { "boolean", "function" }, group_empty = { "boolean", "function" },
root_folder_label = { "function", "string", "boolean" }, root_folder_label = { "function", "string", "boolean" },
}, },
update_focused_file = {
exclude = { "function" },
},
filters = {
custom = { "function" },
},
actions = { actions = {
open_file = { open_file = {
window_picker = { window_picker = {
@@ -752,8 +764,8 @@ end
---@param conf table|nil ---@param conf table|nil
function M.setup(conf) function M.setup(conf)
if vim.fn.has "nvim-0.8" == 0 then if vim.fn.has "nvim-0.9" == 0 then
notify.warn "nvim-tree.lua requires Neovim 0.8 or higher" notify.warn "nvim-tree.lua requires Neovim 0.9 or higher"
return return
end end

View File

@@ -36,12 +36,13 @@ local function search(search_dir, input_path)
while name do while name do
path = dir .. "/" .. name path = dir .. "/" .. name
---@type uv.fs_stat.result|nil
stat, _ = vim.loop.fs_stat(path) stat, _ = vim.loop.fs_stat(path)
if not stat then if not stat then
break break
end end
if not filters.should_filter(path, filter_status) then if not filters.should_filter(path, stat, filter_status) then
if string.find(path, "/" .. input_path .. "$") then if string.find(path, "/" .. input_path .. "$") then
return path return path
end end
@@ -68,8 +69,15 @@ function M.fn()
-- temporarily set &path -- temporarily set &path
local bufnr = vim.api.nvim_get_current_buf() local bufnr = vim.api.nvim_get_current_buf()
local path_existed, path_opt = pcall(vim.api.nvim_buf_get_option, bufnr, "path")
vim.api.nvim_buf_set_option(bufnr, "path", core.get_cwd() .. "/**") local path_existed, path_opt
if vim.fn.has "nvim-0.10" == 1 then
path_existed, path_opt = pcall(vim.api.nvim_get_option_value, "path", { buf = bufnr })
vim.api.nvim_set_option_value("path", core.get_cwd() .. "/**", { buf = bufnr })
else
path_existed, path_opt = pcall(vim.api.nvim_buf_get_option, bufnr, "path") ---@diagnostic disable-line: deprecated
vim.api.nvim_buf_set_option(bufnr, "path", core.get_cwd() .. "/**") ---@diagnostic disable-line: deprecated
end
vim.ui.input({ prompt = "Search: ", completion = "file_in_path" }, function(input_path) vim.ui.input({ prompt = "Search: ", completion = "file_in_path" }, function(input_path)
if not input_path or input_path == "" then if not input_path or input_path == "" then
@@ -77,9 +85,17 @@ function M.fn()
end end
-- reset &path -- reset &path
if path_existed then if path_existed then
vim.api.nvim_buf_set_option(bufnr, "path", path_opt) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("path", path_opt, { buf = bufnr })
else
vim.api.nvim_buf_set_option(bufnr, "path", path_opt) ---@diagnostic disable-line: deprecated
end
else else
vim.api.nvim_buf_set_option(bufnr, "path", nil) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("path", nil, { buf = bufnr })
else
vim.api.nvim_buf_set_option(bufnr, "path", nil) ---@diagnostic disable-line: deprecated
end
end end
-- strip trailing slash -- strip trailing slash

View File

@@ -276,17 +276,24 @@ end
---@param content string ---@param content string
local function copy_to_clipboard(content) local function copy_to_clipboard(content)
local clipboard_name local clipboard_name
local reg
if M.config.actions.use_system_clipboard == true then if M.config.actions.use_system_clipboard == true then
vim.fn.setreg("+", content)
vim.fn.setreg('"', content)
clipboard_name = "system" clipboard_name = "system"
reg = "+"
else else
vim.fn.setreg('"', content)
vim.fn.setreg("1", content)
clipboard_name = "neovim" clipboard_name = "neovim"
reg = "1"
end end
vim.api.nvim_exec_autocmds("TextYankPost", {}) -- manually firing TextYankPost does not set vim.v.event
-- workaround: create a scratch buffer with the clipboard contents and send a yank command
local temp_buf = vim.api.nvim_create_buf(false, true)
vim.api.nvim_buf_set_text(temp_buf, 0, 0, 0, 0, { content })
vim.api.nvim_buf_call(temp_buf, function()
vim.cmd(string.format('normal! "%sy$', reg))
end)
vim.api.nvim_buf_delete(temp_buf, {})
notify.info(string.format("Copied %s to %s clipboard!", content, clipboard_name)) notify.info(string.format("Copied %s to %s clipboard!", content, clipboard_name))
end end
@@ -295,6 +302,12 @@ function M.copy_filename(node)
copy_to_clipboard(node.name) copy_to_clipboard(node.name)
end end
---@param node Node
function M.copy_basename(node)
local basename = vim.fn.fnamemodify(node.name, ":r")
copy_to_clipboard(basename)
end
---@param node Node ---@param node Node
function M.copy_path(node) function M.copy_path(node)
local absolute_path = node.absolute_path local absolute_path = node.absolute_path

View File

@@ -12,7 +12,7 @@ local M = {}
local function create_and_notify(file) local function create_and_notify(file)
events._dispatch_will_create_file(file) events._dispatch_will_create_file(file)
local ok, fd = pcall(vim.loop.fs_open, file, "w", 420) local ok, fd = pcall(vim.loop.fs_open, file, "w", 420)
if not ok then if not ok or type(fd) ~= "number" then
notify.error("Couldn't create file " .. notify.render_path(file)) notify.error("Couldn't create file " .. notify.render_path(file))
return return
end end

View File

@@ -49,9 +49,9 @@ end
---@param cwd string ---@param cwd string
---@return boolean|nil ---@return boolean|nil
local function remove_dir(cwd) local function remove_dir(cwd)
local handle = vim.loop.fs_scandir(cwd) local handle, err = vim.loop.fs_scandir(cwd)
if type(handle) == "string" then if not handle then
notify.error(handle) notify.error(err)
return return
end end

View File

@@ -9,6 +9,16 @@ local M = {
config = {}, config = {},
} }
---@param iter function iterable
---@return integer
local function get_num_nodes(iter)
local i = 0
for _ in iter do
i = i + 1
end
return i
end
local ALLOWED_MODIFIERS = { local ALLOWED_MODIFIERS = {
[":p"] = true, [":p"] = true,
[":p:h"] = true, [":p:h"] = true,
@@ -31,15 +41,46 @@ function M.rename(node, to)
return return
end end
events._dispatch_will_rename_node(node.absolute_path, to) -- create a folder for each path element if the folder does not exist
local success, err = vim.loop.fs_rename(node.absolute_path, to) local idx = 0
if not success then local path_to_create = ""
notify.warn(err_fmt(notify_from, notify_to, err))
return local num_nodes = get_num_nodes(utils.path_split(utils.path_remove_trailing(to)))
local is_error = false
for path in utils.path_split(to) do
idx = idx + 1
local p = utils.path_remove_trailing(path)
if #path_to_create == 0 and vim.fn.has "win32" == 1 then
path_to_create = utils.path_join { p, path_to_create }
else
path_to_create = utils.path_join { path_to_create, p }
end
if idx == num_nodes then
events._dispatch_will_rename_node(node.absolute_path, to)
local success, err = vim.loop.fs_rename(node.absolute_path, to)
if not success then
notify.warn(err_fmt(notify_from, notify_to, err))
return
end
elseif not utils.file_exists(path_to_create) then
local success = vim.loop.fs_mkdir(path_to_create, 493)
if not success then
notify.error("Could not create folder " .. notify.render_path(path_to_create))
is_error = true
break
end
is_error = false
end
end
if not is_error then
notify.info(string.format("%s -> %s", notify_from, notify_to))
utils.rename_loaded_buffers(node.absolute_path, to)
events._dispatch_node_renamed(node.absolute_path, to)
end end
notify.info(string.format("%s -> %s", notify_from, notify_to))
utils.rename_loaded_buffers(node.absolute_path, to)
events._dispatch_node_renamed(node.absolute_path, to)
end end
---@param default_modifier string|nil ---@param default_modifier string|nil

View File

@@ -42,7 +42,7 @@ function M.remove(node)
-- trashes a path (file or folder) -- trashes a path (file or folder)
local function trash_path(on_exit) local function trash_path(on_exit)
local need_sync_wait = utils.is_windows local need_sync_wait = utils.is_windows
local job = vim.fn.jobstart(M.config.trash.cmd .. ' "' .. node.absolute_path .. '"', { local job = vim.fn.jobstart(M.config.trash.cmd .. " " .. vim.fn.shellescape(node.absolute_path), {
detach = not need_sync_wait, detach = not need_sync_wait,
on_exit = on_exit, on_exit = on_exit,
on_stderr = on_stderr, on_stderr = on_stderr,

View File

@@ -6,6 +6,14 @@ local M = {}
---@return table ---@return table
local function get_formatted_lines(node) local function get_formatted_lines(node)
local stats = node.fs_stat local stats = node.fs_stat
if stats == nil then
return {
"",
" Can't retrieve file information",
"",
}
end
local fpath = " fullpath: " .. node.absolute_path local fpath = " fullpath: " .. node.absolute_path
local created_at = " created: " .. os.date("%x %X", stats.birthtime.sec) local created_at = " created: " .. os.date("%x %X", stats.birthtime.sec)
local modified_at = " modified: " .. os.date("%x %X", stats.mtime.sec) local modified_at = " modified: " .. os.date("%x %X", stats.mtime.sec)
@@ -48,7 +56,7 @@ end
function M.close_popup() function M.close_popup()
if current_popup ~= nil then if current_popup ~= nil then
vim.api.nvim_win_close(current_popup.winnr, { force = true }) vim.api.nvim_win_close(current_popup.winnr, true)
vim.cmd "augroup NvimTreeRemoveFilePopup | au! CursorMoved | augroup END" vim.cmd "augroup NvimTreeRemoveFilePopup | au! CursorMoved | augroup END"
current_popup = nil current_popup = nil

View File

@@ -26,14 +26,20 @@ local function usable_win_ids()
return vim.tbl_filter(function(id) return vim.tbl_filter(function(id)
local bufid = vim.api.nvim_win_get_buf(id) local bufid = vim.api.nvim_win_get_buf(id)
for option, v in pairs(M.window_picker.exclude) do for option, v in pairs(M.window_picker.exclude) do
local ok, option_value = pcall(vim.api.nvim_buf_get_option, bufid, option) local ok, option_value
if vim.fn.has "nvim-0.10" == 1 then
ok, option_value = pcall(vim.api.nvim_get_option_value, option, { buf = bufid })
else
ok, option_value = pcall(vim.api.nvim_buf_get_option, bufid, option) ---@diagnostic disable-line: deprecated
end
if ok and vim.tbl_contains(v, option_value) then if ok and vim.tbl_contains(v, option_value) then
return false return false
end end
end end
local win_config = vim.api.nvim_win_get_config(id) local win_config = vim.api.nvim_win_get_config(id)
return id ~= tree_winid and win_config.focusable and not win_config.external return id ~= tree_winid and win_config.focusable and not win_config.external or false
end, win_ids) end, win_ids)
end end
@@ -83,8 +89,15 @@ local function pick_win_id()
if laststatus == 3 then if laststatus == 3 then
for _, win_id in ipairs(not_selectable) do for _, win_id in ipairs(not_selectable) do
local ok_status, statusline = pcall(vim.api.nvim_win_get_option, win_id, "statusline") local ok_status, statusline, ok_hl, winhl
local ok_hl, winhl = pcall(vim.api.nvim_win_get_option, win_id, "winhl")
if vim.fn.has "nvim-0.10" == 1 then
ok_status, statusline = pcall(vim.api.nvim_get_option_value, "statusline", { win = win_id })
ok_hl, winhl = pcall(vim.api.nvim_get_option_value, "winhl", { win = win_id })
else
ok_status, statusline = pcall(vim.api.nvim_win_get_option, win_id, "statusline") ---@diagnostic disable-line: deprecated
ok_hl, winhl = pcall(vim.api.nvim_win_get_option, win_id, "winhl") ---@diagnostic disable-line: deprecated
end
win_opts[win_id] = { win_opts[win_id] = {
statusline = ok_status and statusline or "", statusline = ok_status and statusline or "",
@@ -92,15 +105,26 @@ local function pick_win_id()
} }
-- Clear statusline for windows not selectable -- Clear statusline for windows not selectable
vim.api.nvim_win_set_option(win_id, "statusline", " ") if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("statusline", " ", { win = win_id })
else
vim.api.nvim_win_set_option(win_id, "statusline", " ") ---@diagnostic disable-line: deprecated
end
end end
end end
-- Setup UI -- Setup UI
for _, id in ipairs(selectable) do for _, id in ipairs(selectable) do
local char = M.window_picker.chars:sub(i, i) local char = M.window_picker.chars:sub(i, i)
local ok_status, statusline = pcall(vim.api.nvim_win_get_option, id, "statusline")
local ok_hl, winhl = pcall(vim.api.nvim_win_get_option, id, "winhl") local ok_status, statusline, ok_hl, winhl
if vim.fn.has "nvim-0.10" == 1 then
ok_status, statusline = pcall(vim.api.nvim_get_option_value, "statusline", { win = id })
ok_hl, winhl = pcall(vim.api.nvim_get_option_value, "winhl", { win = id })
else
ok_status, statusline = pcall(vim.api.nvim_win_get_option, id, "statusline") ---@diagnostic disable-line: deprecated
ok_hl, winhl = pcall(vim.api.nvim_win_get_option, id, "winhl") ---@diagnostic disable-line: deprecated
end
win_opts[id] = { win_opts[id] = {
statusline = ok_status and statusline or "", statusline = ok_status and statusline or "",
@@ -108,8 +132,13 @@ local function pick_win_id()
} }
win_map[char] = id win_map[char] = id
vim.api.nvim_win_set_option(id, "statusline", "%=" .. char .. "%=") if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_win_set_option(id, "winhl", "StatusLine:NvimTreeWindowPicker,StatusLineNC:NvimTreeWindowPicker") vim.api.nvim_set_option_value("statusline", "%=" .. char .. "%=", { win = id })
vim.api.nvim_set_option_value("winhl", "StatusLine:NvimTreeWindowPicker,StatusLineNC:NvimTreeWindowPicker", { win = id })
else
vim.api.nvim_win_set_option(id, "statusline", "%=" .. char .. "%=") ---@diagnostic disable-line: deprecated
vim.api.nvim_win_set_option(id, "winhl", "StatusLine:NvimTreeWindowPicker,StatusLineNC:NvimTreeWindowPicker") ---@diagnostic disable-line: deprecated
end
i = i + 1 i = i + 1
if i > #M.window_picker.chars then if i > #M.window_picker.chars then
@@ -128,14 +157,22 @@ local function pick_win_id()
-- Restore window options -- Restore window options
for _, id in ipairs(selectable) do for _, id in ipairs(selectable) do
for opt, value in pairs(win_opts[id]) do for opt, value in pairs(win_opts[id]) do
vim.api.nvim_win_set_option(id, opt, value) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value(opt, value, { win = id })
else
vim.api.nvim_win_set_option(id, opt, value) ---@diagnostic disable-line: deprecated
end
end end
end end
if laststatus == 3 then if laststatus == 3 then
for _, id in ipairs(not_selectable) do for _, id in ipairs(not_selectable) do
for opt, value in pairs(win_opts[id]) do for opt, value in pairs(win_opts[id]) do
vim.api.nvim_win_set_option(id, opt, value) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value(opt, value, { win = id })
else
vim.api.nvim_win_set_option(id, opt, value) ---@diagnostic disable-line: deprecated
end
end end
end end
end end
@@ -258,23 +295,31 @@ local function open_in_new_window(filename, mode)
-- If `hidden` is not enabled, check if buffer in target window is -- If `hidden` is not enabled, check if buffer in target window is
-- modified, and create new split if it is. -- modified, and create new split if it is.
local target_bufid = vim.api.nvim_win_get_buf(target_winid) local target_bufid = vim.api.nvim_win_get_buf(target_winid)
if vim.api.nvim_buf_get_option(target_bufid, "modified") then
local modified
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
if modified then
if not mode:match "split$" then if not mode:match "split$" then
mode = "vsplit" mode = "vsplit"
end end
end end
end end
local fname = vim.fn.fnameescape(filename) local fname = utils.escape_special_chars(vim.fn.fnameescape(filename))
fname = utils.escape_special_chars(fname)
local cmd local command
if create_new_window then if create_new_window then
cmd = string.format("%s vsplit %s", new_window_side, fname) -- generated from vim.api.nvim_parse_cmd("belowright vsplit foo", {})
command = { cmd = "vsplit", mods = { split = new_window_side }, args = { fname } }
elseif mode:match "split$" then elseif mode:match "split$" then
cmd = string.format("%s %s", mode, fname) command = { cmd = mode, args = { fname } }
else else
cmd = string.format("edit %s", fname) command = { cmd = "edit", args = { fname } }
end end
if (mode == "preview" or mode == "preview_no_picker") and view.View.float.enable then if (mode == "preview" or mode == "preview_no_picker") and view.View.float.enable then
@@ -286,7 +331,7 @@ local function open_in_new_window(filename, mode)
set_current_win_no_autocmd(target_winid, { "BufEnter" }) set_current_win_no_autocmd(target_winid, { "BufEnter" })
end end
pcall(vim.cmd, cmd) pcall(vim.api.nvim_cmd, command, { output = false })
lib.set_target_win() lib.set_target_win()
end end

View File

@@ -24,18 +24,19 @@ function M.fn(opts)
local bufnr, path local bufnr, path
-- (optional) buffer number and path -- (optional) buffer number and path
if type(opts.buf) == "nil" then local opts_buf = opts.buf
if type(opts_buf) == "nil" then
bufnr = vim.api.nvim_get_current_buf() bufnr = vim.api.nvim_get_current_buf()
path = vim.api.nvim_buf_get_name(bufnr) path = vim.api.nvim_buf_get_name(bufnr)
elseif type(opts.buf) == "number" then elseif type(opts_buf) == "number" then
if not vim.api.nvim_buf_is_valid(opts.buf) then if not vim.api.nvim_buf_is_valid(opts_buf) then
return return
end end
bufnr = tonumber(opts.buf) bufnr = opts_buf
path = vim.api.nvim_buf_get_name(bufnr) path = vim.api.nvim_buf_get_name(bufnr)
elseif type(opts.buf) == "string" then elseif type(opts_buf) == "string" then
bufnr = nil bufnr = nil
path = tostring(opts.buf) path = tostring(opts_buf)
else else
return return
end end
@@ -55,7 +56,7 @@ function M.fn(opts)
end end
-- update root -- update root
if opts.update_root or M.config.update_focused_file.update_root then if opts.update_root or M.config.update_focused_file.update_root.enable then
require("nvim-tree").change_root(path, bufnr) require("nvim-tree").change_root(path, bufnr)
end end

View File

@@ -41,4 +41,9 @@ function M.dotfiles()
reload() reload()
end end
function M.enable()
filters.config.enable = not filters.config.enable
reload()
end
return M return M

View File

@@ -128,6 +128,7 @@ Api.tree.find_file = wrap(actions.tree.find_file.fn)
Api.tree.search_node = wrap(actions.finders.search_node.fn) Api.tree.search_node = wrap(actions.finders.search_node.fn)
Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse_all.fn) Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse_all.fn)
Api.tree.expand_all = wrap_node(actions.tree.modifiers.expand_all.fn) Api.tree.expand_all = wrap_node(actions.tree.modifiers.expand_all.fn)
Api.tree.toggle_enable_filters = wrap(actions.tree.modifiers.toggles.enable)
Api.tree.toggle_gitignore_filter = wrap(actions.tree.modifiers.toggles.git_ignored) Api.tree.toggle_gitignore_filter = wrap(actions.tree.modifiers.toggles.git_ignored)
Api.tree.toggle_git_clean_filter = wrap(actions.tree.modifiers.toggles.git_clean) Api.tree.toggle_git_clean_filter = wrap(actions.tree.modifiers.toggles.git_clean)
Api.tree.toggle_no_buffer_filter = wrap(actions.tree.modifiers.toggles.no_buffer) Api.tree.toggle_no_buffer_filter = wrap(actions.tree.modifiers.toggles.no_buffer)
@@ -163,6 +164,7 @@ Api.fs.print_clipboard = wrap(actions.fs.copy_paste.print_clipboard)
Api.fs.copy.node = wrap_node(actions.fs.copy_paste.copy) Api.fs.copy.node = wrap_node(actions.fs.copy_paste.copy)
Api.fs.copy.absolute_path = wrap_node(actions.fs.copy_paste.copy_absolute_path) Api.fs.copy.absolute_path = wrap_node(actions.fs.copy_paste.copy_absolute_path)
Api.fs.copy.filename = wrap_node(actions.fs.copy_paste.copy_filename) Api.fs.copy.filename = wrap_node(actions.fs.copy_paste.copy_filename)
Api.fs.copy.basename = wrap_node(actions.fs.copy_paste.copy_basename)
Api.fs.copy.relative_path = wrap_node(actions.fs.copy_paste.copy_path) Api.fs.copy.relative_path = wrap_node(actions.fs.copy_paste.copy_path)
---@param mode string ---@param mode string

View File

@@ -1,5 +1,8 @@
local appearance = require "nvim-tree.appearance" local appearance = require "nvim-tree.appearance"
-- others with name and links less than this arbitrary value are short
local SHORT_LEN = 50
local M = {} local M = {}
---@class HighlightDisplay for :NvimTreeHiTest ---@class HighlightDisplay for :NvimTreeHiTest
@@ -8,7 +11,7 @@ local M = {}
---@field def string :hi concrete definition after following any links ---@field def string :hi concrete definition after following any links
local HighlightDisplay = {} local HighlightDisplay = {}
---@param group string nvim-tree highlight group ---@param group string nvim-tree highlight group name
---@return HighlightDisplay ---@return HighlightDisplay
function HighlightDisplay:new(group) function HighlightDisplay:new(group)
local o = {} local o = {}
@@ -39,41 +42,99 @@ function HighlightDisplay:new(group)
return o return o
end end
---Render one group.
---@param bufnr number to render in
---@param fmt string format string for group, links, def
---@param l number line number to render at
---@return number l next line number
function HighlightDisplay:render(bufnr, fmt, l) function HighlightDisplay:render(bufnr, fmt, l)
local text = string.format(fmt, self.group, self.links, self.def) local text = string.format(fmt, self.group, self.links, self.def)
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { text }) vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { text })
vim.api.nvim_buf_add_highlight(bufnr, -1, self.group, l, 0, #self.group) vim.api.nvim_buf_add_highlight(bufnr, -1, self.group, l, 0, #self.group)
return l + 1
end end
---Run a test similar to :so $VIMRUNTIME/syntax/hitest.vim ---Render many groups.
---Display all nvim-tree highlight groups, their link chain and actual definition ---@param header string before with underline line
function M.hi_test() ---@param displays HighlightDisplay[] highlight group
local displays = {} ---@param bufnr number to render in
---@param l number line number to start at
---@return number l next line number
local function render_displays(header, displays, bufnr, l)
local max_group_len = 0 local max_group_len = 0
local max_links_len = 0 local max_links_len = 0
-- build all highlight groups, name only -- build all highlight groups, using name only
for _, highlight_group in ipairs(appearance.HIGHLIGHT_GROUPS) do for _, display in ipairs(displays) do
local display = HighlightDisplay:new(highlight_group.group)
table.insert(displays, display)
max_group_len = math.max(max_group_len, #display.group) max_group_len = math.max(max_group_len, #display.group)
max_links_len = math.max(max_links_len, #display.links) max_links_len = math.max(max_links_len, #display.links)
end end
-- header
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { header, (header:gsub(".", "-")) })
l = l + 2
-- render and highlight
local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s", max_group_len, max_group_len, max_links_len, max_links_len)
for _, display in ipairs(displays) do
l = display:render(bufnr, fmt, l)
end
return l
end
---Run a test similar to :so $VIMRUNTIME/syntax/hitest.vim
---Display all nvim-tree and neovim highlight groups, their link chain and actual definition
function M.hi_test()
-- create a buffer -- create a buffer
local bufnr = vim.api.nvim_create_buf(false, true) local bufnr = vim.api.nvim_create_buf(false, true)
-- render and highlight
local l = 0 local l = 0
local fmt = string.format("%%-%d.%ds %%-%d.%ds %%s", max_group_len, max_group_len, max_links_len, max_links_len)
for _, display in ipairs(displays) do -- nvim-tree groups, ordered
display:render(bufnr, fmt, l) local displays = {}
l = l + 1 for _, highlight_group in ipairs(appearance.HIGHLIGHT_GROUPS) do
local display = HighlightDisplay:new(highlight_group.group)
table.insert(displays, display)
end
l = render_displays("nvim-tree", displays, bufnr, l)
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { "" })
l = l + 1
-- built in groups, ordered opaquely by nvim
local displays_short, displays_long = {}, {}
local ok, out = pcall(vim.api.nvim_cmd, { cmd = "highlight" }, { output = true })
if ok then
for group in string.gmatch(out, "(%w*)%s+xxx") do
if group:find("NvimTree", 1, true) ~= 1 then
local display = HighlightDisplay:new(group)
if #display.group + #display.links > SHORT_LEN then
table.insert(displays_long, display)
else
table.insert(displays_short, display)
end
end
end
end end
-- short ones first
l = render_displays("other, short", displays_short, bufnr, l)
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { "" })
l = l + 1
-- long
render_displays("other, long", displays_long, bufnr, l)
-- finalise and focus the buffer -- finalise and focus the buffer
vim.api.nvim_buf_set_option(bufnr, "modifiable", false) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("modifiable", false, { buf = bufnr })
else
vim.api.nvim_buf_set_option(bufnr, "modifiable", false) ---@diagnostic disable-line: deprecated
end
vim.cmd.buffer(bufnr) vim.cmd.buffer(bufnr)
end end

View File

@@ -1,5 +1,11 @@
local M = {} local M = {}
---@class HighlightGroup
---@field group string
---@field link string|nil
---@field def string|nil
---@type HighlightGroup[]
-- All highlight groups: linked or directly defined. -- All highlight groups: linked or directly defined.
-- Please add new groups to help and preserve order. -- Please add new groups to help and preserve order.
-- Please avoid directly defined groups to preserve accessibility for TUI. -- Please avoid directly defined groups to preserve accessibility for TUI.
@@ -24,10 +30,10 @@ M.HIGHLIGHT_GROUPS = {
{ group = "NvimTreeStatusLineNC", link = "StatusLineNC" }, { group = "NvimTreeStatusLineNC", link = "StatusLineNC" },
-- File Text -- File Text
{ group = "NvimTreeExecFile", link = "SpellCap" }, { group = "NvimTreeExecFile", link = "Question" },
{ group = "NvimTreeImageFile", link = "SpellCap" }, { group = "NvimTreeImageFile", link = "Question" },
{ group = "NvimTreeSpecialFile", link = "SpellCap" }, { group = "NvimTreeSpecialFile", link = "Title" },
{ group = "NvimTreeSymlink", link = "SpellCap" }, { group = "NvimTreeSymlink", link = "Underlined" },
-- Folder Text -- Folder Text
{ group = "NvimTreeRootFolder", link = "Title" }, { group = "NvimTreeRootFolder", link = "Title" },
@@ -51,7 +57,7 @@ M.HIGHLIGHT_GROUPS = {
{ group = "NvimTreeIndentMarker", link = "NvimTreeFolderIcon" }, { group = "NvimTreeIndentMarker", link = "NvimTreeFolderIcon" },
-- Picker -- Picker
{ group = "NvimTreeWindowPicker", def = "guifg=#ededed guibg=#4493c8 gui=bold ctermfg=White ctermbg=Cyan" }, { group = "NvimTreeWindowPicker", def = "guifg=#ededed guibg=#4493c8 gui=bold ctermfg=White ctermbg=DarkBlue" },
-- LiveFilter -- LiveFilter
{ group = "NvimTreeLiveFilterPrefix", link = "PreProc" }, { group = "NvimTreeLiveFilterPrefix", link = "PreProc" },
@@ -177,15 +183,8 @@ function M.setup()
-- hard link override when legacy only is present -- hard link override when legacy only is present
for from, to in pairs(M.LEGACY_LINKS) do for from, to in pairs(M.LEGACY_LINKS) do
local hl_from local hl_from = vim.api.nvim_get_hl(0, { name = from })
local hl_to local hl_to = vim.api.nvim_get_hl(0, { name = to })
if vim.fn.has "nvim-0.9" == 1 then
hl_from = vim.api.nvim_get_hl(0, { name = from })
hl_to = vim.api.nvim_get_hl(0, { name = to })
else
hl_from = vim.api.nvim__get_hl_defs(0)[from] or {}
hl_to = vim.api.nvim__get_hl_defs(0)[to] or {}
end
if vim.tbl_isempty(hl_from) and not vim.tbl_isempty(hl_to) then if vim.tbl_isempty(hl_from) and not vim.tbl_isempty(hl_to) then
vim.api.nvim_command("hi link " .. from .. " " .. to) vim.api.nvim_command("hi link " .. from .. " " .. to)
end end

View File

@@ -6,7 +6,7 @@ M._modified = {}
---refresh M._modified ---refresh M._modified
function M.reload_modified() function M.reload_modified()
M._modified = {} M._modified = {}
local bufs = vim.fn.getbufinfo { bufmodified = true, buflisted = true } local bufs = vim.fn.getbufinfo { bufmodified = 1, buflisted = 1 }
for _, buf in pairs(bufs) do for _, buf in pairs(bufs) do
local path = buf.name local path = buf.name
if path ~= "" then -- not a [No Name] buffer if path ~= "" then -- not a [No Name] buffer

View File

@@ -39,19 +39,21 @@ end
local function from_nvim_lsp() local function from_nvim_lsp()
local buffer_severity = {} local buffer_severity = {}
local is_disabled = false -- is_enabled is not present in all 0.10 builds/releases, see #2781
if vim.fn.has "nvim-0.9" == 1 then local is_enabled = false
is_disabled = vim.diagnostic.is_disabled() if vim.fn.has "nvim-0.10" == 1 and type(vim.diagnostic.is_enabled) == "function" then
is_enabled = vim.diagnostic.is_enabled()
elseif type(vim.diagnostic.is_disabled) == "function" then ---@diagnostic disable-line: deprecated
is_enabled = not vim.diagnostic.is_disabled() ---@diagnostic disable-line: deprecated
end end
if not is_disabled then if is_enabled then
for _, diagnostic in ipairs(vim.diagnostic.get(nil, { severity = M.severity })) do for _, diagnostic in ipairs(vim.diagnostic.get(nil, { severity = M.severity })) do
local buf = diagnostic.bufnr if diagnostic.severity and diagnostic.bufnr and vim.api.nvim_buf_is_valid(diagnostic.bufnr) then
if vim.api.nvim_buf_is_valid(buf) then local bufname = uniformize_path(vim.api.nvim_buf_get_name(diagnostic.bufnr))
local bufname = uniformize_path(vim.api.nvim_buf_get_name(buf)) if not buffer_severity[bufname] or diagnostic.severity < buffer_severity[bufname] then
local severity = diagnostic.severity buffer_severity[bufname] = diagnostic.severity
local highest_severity = buffer_severity[bufname] or severity end
buffer_severity[bufname] = math.min(highest_severity, severity)
end end
end end
end end

View File

@@ -11,13 +11,6 @@ local Watcher = require "nvim-tree.watcher"
local M = {} local M = {}
---@param type_ string|nil
---@param cwd string
---@return any
local function get_type_from(type_, cwd)
return type_ or (vim.loop.fs_stat(cwd) or {}).type
end
---@param handle uv.uv_fs_t ---@param handle uv.uv_fs_t
---@param cwd string ---@param cwd string
---@param node Node ---@param node Node
@@ -33,18 +26,19 @@ local function populate_children(handle, cwd, node, git_status)
end end
local abs = utils.path_join { cwd, name } local abs = utils.path_join { cwd, name }
local profile = log.profile_start("explore populate_children %s", abs) local profile = log.profile_start("explore populate_children %s", abs)
t = get_type_from(t, abs) ---@type uv.fs_stat.result|nil
if not filters.should_filter(abs, filter_status) and not nodes_by_path[abs] and Watcher.is_fs_event_capable(abs) then local stat = vim.loop.fs_stat(abs)
if not filters.should_filter(abs, stat, filter_status) and not nodes_by_path[abs] and Watcher.is_fs_event_capable(abs) then
local child = nil local child = nil
if t == "directory" and vim.loop.fs_access(abs, "R") then if t == "directory" and vim.loop.fs_access(abs, "R") then
child = builders.folder(node, abs, name) child = builders.folder(node, abs, name, stat)
elseif t == "file" then elseif t == "file" then
child = builders.file(node, abs, name) child = builders.file(node, abs, name, stat)
elseif t == "link" then elseif t == "link" then
local link = builders.link(node, abs, name) local link = builders.link(node, abs, name, stat)
if link.link_to ~= nil then if link.link_to ~= nil then
child = link child = link
end end

View File

@@ -4,6 +4,7 @@ local marks = require "nvim-tree.marks"
local M = { local M = {
ignore_list = {}, ignore_list = {},
exclude_list = {}, exclude_list = {},
custom_function = nil,
} }
---@param path string ---@param path string
@@ -70,9 +71,39 @@ local function dotfile(path)
end end
---@param path string ---@param path string
---@param bookmarks table<string, boolean> absolute paths bookmarked ---@param path_type string|nil filetype of path
local function bookmark(path, bookmarks) ---@param bookmarks table<string, string|nil> path, filetype table of bookmarked files
return M.config.filter_no_bookmark and not bookmarks[path] local function bookmark(path, path_type, bookmarks)
if not M.config.filter_no_bookmark then
return false
end
-- if bookmark is empty, we should see a empty filetree
if next(bookmarks) == nil then
return true
end
local mark_parent = utils.path_add_trailing(path)
for mark, mark_type in pairs(bookmarks) do
if path == mark then
return false
end
if path_type == "directory" then
-- check if path is mark's parent
if vim.fn.stridx(mark, mark_parent) == 0 then
return false
end
end
if mark_type == "directory" then
-- check if mark is path's parent
local path_parent = utils.path_add_trailing(mark)
if vim.fn.stridx(path, path_parent) == 0 then
return false
end
end
end
return true
end end
---@param path string ---@param path string
@@ -84,6 +115,11 @@ local function custom(path)
local basename = utils.path_basename(path) local basename = utils.path_basename(path)
-- filter user's custom function
if M.custom_function and M.custom_function(path) then
return true
end
-- filter custom regexes -- filter custom regexes
local relpath = utils.path_relative(path, vim.loop.cwd()) local relpath = utils.path_relative(path, vim.loop.cwd())
for pat, _ in pairs(M.ignore_list) do for pat, _ in pairs(M.ignore_list) do
@@ -120,7 +156,7 @@ function M.prepare(git_status)
end end
for _, node in pairs(marks.get_marks()) do for _, node in pairs(marks.get_marks()) do
status.bookmarks[node.absolute_path] = true status.bookmarks[node.absolute_path] = node.type
end end
return status return status
@@ -128,19 +164,29 @@ end
---Check if the given path should be filtered. ---Check if the given path should be filtered.
---@param path string Absolute path ---@param path string Absolute path
---@param fs_stat uv.fs_stat.result|nil fs_stat of file
---@param status table from prepare ---@param status table from prepare
---@return boolean ---@return boolean
function M.should_filter(path, status) function M.should_filter(path, fs_stat, status)
if not M.config.enable then
return false
end
-- exclusions override all filters -- exclusions override all filters
if is_excluded(path) then if is_excluded(path) then
return false return false
end end
return git(path, status.git_status) or buf(path, status.bufinfo) or dotfile(path) or custom(path) or bookmark(path, status.bookmarks) return git(path, status.git_status)
or buf(path, status.bufinfo)
or dotfile(path)
or custom(path)
or bookmark(path, fs_stat and fs_stat.type, status.bookmarks)
end end
function M.setup(opts) function M.setup(opts)
M.config = { M.config = {
enable = opts.filters.enable,
filter_custom = true, filter_custom = true,
filter_dotfiles = opts.filters.dotfiles, filter_dotfiles = opts.filters.dotfiles,
filter_git_ignored = opts.filters.git_ignored, filter_git_ignored = opts.filters.git_ignored,
@@ -153,9 +199,13 @@ function M.setup(opts)
M.exclude_list = opts.filters.exclude M.exclude_list = opts.filters.exclude
local custom_filter = opts.filters.custom local custom_filter = opts.filters.custom
if custom_filter and #custom_filter > 0 then if type(custom_filter) == "function" then
for _, filter_name in pairs(custom_filter) do M.custom_function = custom_filter
M.ignore_list[filter_name] = true else
if custom_filter and #custom_filter > 0 then
for _, filter_name in pairs(custom_filter) do
M.ignore_list[filter_name] = true
end
end end
end end
end end

View File

@@ -1,4 +1,5 @@
local git = require "nvim-tree.git" local git = require "nvim-tree.git"
local notify = require "nvim-tree.notify"
local watch = require "nvim-tree.explorer.watch" local watch = require "nvim-tree.explorer.watch"
local explorer_node = require "nvim-tree.explorer.node" local explorer_node = require "nvim-tree.explorer.node"
@@ -15,14 +16,24 @@ M.reload = require("nvim-tree.explorer.reload").reload
local Explorer = {} local Explorer = {}
Explorer.__index = Explorer Explorer.__index = Explorer
---@param cwd string|nil ---@param path string|nil
---@return Explorer ---@return Explorer|nil
function Explorer.new(cwd) function Explorer.new(path)
cwd = vim.loop.fs_realpath(cwd or vim.loop.cwd()) local err
if path then
path, err = vim.loop.fs_realpath(path)
else
path, err = vim.loop.cwd()
end
if not path then
notify.error(err)
return
end
---@class Explorer ---@class Explorer
local explorer = setmetatable({ local explorer = setmetatable({
absolute_path = cwd, absolute_path = path,
nodes = {}, nodes = {},
open = true, open = true,
}, Explorer) }, Explorer)

View File

@@ -6,15 +6,16 @@ local M = {}
---@param parent Node ---@param parent Node
---@param absolute_path string ---@param absolute_path string
---@param name string ---@param name string
---@param fs_stat uv.fs_stat.result|nil
---@return Node ---@return Node
function M.folder(parent, absolute_path, name) function M.folder(parent, absolute_path, name, fs_stat)
local handle = vim.loop.fs_scandir(absolute_path) local handle = vim.loop.fs_scandir(absolute_path)
local has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil local has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil
local node = { local node = {
type = "directory", type = "directory",
absolute_path = absolute_path, absolute_path = absolute_path,
fs_stat = vim.loop.fs_stat(absolute_path), fs_stat = fs_stat,
group_next = nil, -- If node is grouped, this points to the next child dir/link node group_next = nil, -- If node is grouped, this points to the next child dir/link node
has_children = has_children, has_children = has_children,
name = name, name = name,
@@ -43,8 +44,9 @@ end
---@param parent Node ---@param parent Node
---@param absolute_path string ---@param absolute_path string
---@param name string ---@param name string
---@param fs_stat uv.fs_stat.result|nil
---@return Node ---@return Node
function M.file(parent, absolute_path, name) function M.file(parent, absolute_path, name, fs_stat)
local ext = string.match(name, ".?[^.]+%.(.*)") or "" local ext = string.match(name, ".?[^.]+%.(.*)") or ""
return { return {
@@ -52,7 +54,7 @@ function M.file(parent, absolute_path, name)
absolute_path = absolute_path, absolute_path = absolute_path,
executable = M.is_executable(absolute_path), executable = M.is_executable(absolute_path),
extension = ext, extension = ext,
fs_stat = vim.loop.fs_stat(absolute_path), fs_stat = fs_stat,
name = name, name = name,
parent = parent, parent = parent,
} }
@@ -66,15 +68,16 @@ end
---@param parent Node ---@param parent Node
---@param absolute_path string ---@param absolute_path string
---@param name string ---@param name string
---@param fs_stat uv.fs_stat.result|nil
---@return Node ---@return Node
function M.link(parent, absolute_path, name) function M.link(parent, absolute_path, name, fs_stat)
--- I dont know if this is needed, because in my understanding, there isn't hard links in windows, but just to be sure i changed it. --- I dont know if this is needed, because in my understanding, there isn't hard links in windows, but just to be sure i changed it.
local link_to = vim.loop.fs_realpath(absolute_path) local link_to = vim.loop.fs_realpath(absolute_path)
local open, nodes, has_children local open, nodes, has_children
local is_dir_link = (link_to ~= nil) and vim.loop.fs_stat(link_to).type == "directory" local is_dir_link = (link_to ~= nil) and vim.loop.fs_stat(link_to).type == "directory"
if is_dir_link then if is_dir_link and link_to then
local handle = vim.loop.fs_scandir(link_to) local handle = vim.loop.fs_scandir(link_to)
has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil
open = false open = false
@@ -84,7 +87,7 @@ function M.link(parent, absolute_path, name)
local node = { local node = {
type = "link", type = "link",
absolute_path = absolute_path, absolute_path = absolute_path,
fs_stat = vim.loop.fs_stat(absolute_path), fs_stat = fs_stat,
group_next = nil, -- If node is grouped, this points to the next child dir/link node group_next = nil, -- If node is grouped, this points to the next child dir/link node
has_children = has_children, has_children = has_children,
link_to = link_to, link_to = link_to,

View File

@@ -29,7 +29,7 @@ end
---@param absolute_path string ---@param absolute_path string
---@return GitStatus ---@return GitStatus
local function get_git_status(parent_ignored, status, absolute_path) local function get_git_status(parent_ignored, status, absolute_path)
local file_status = parent_ignored and "!!" or status.files and status.files[absolute_path] local file_status = parent_ignored and "!!" or (status and status.files and status.files[absolute_path])
return { file = file_status } return { file = file_status }
end end

View File

@@ -85,30 +85,23 @@ function M.reload(node, git_status)
node.group_next = nil node.group_next = nil
end end
local child_names = {} local remain_childs = {}
local node_ignored = explorer_node.is_git_ignored(node) local node_ignored = explorer_node.is_git_ignored(node)
---@type table<string, Node>
local nodes_by_path = utils.key_by(node.nodes, "absolute_path") local nodes_by_path = utils.key_by(node.nodes, "absolute_path")
while true do while true do
local name, t = vim.loop.fs_scandir_next(handle, cwd) local name, t = vim.loop.fs_scandir_next(handle)
if not name then if not name then
break break
end end
local stat
local function fs_stat_cached(path)
if stat ~= nil then
return stat
end
stat = vim.loop.fs_stat(path)
return stat
end
local abs = utils.path_join { cwd, name } local abs = utils.path_join { cwd, name }
t = t or (fs_stat_cached(abs) or {}).type ---@type uv.fs_stat.result|nil
if not filters.should_filter(abs, filter_status) then local stat = vim.loop.fs_stat(abs)
child_names[abs] = true
if not filters.should_filter(abs, stat, filter_status) then
remain_childs[abs] = true
-- Recreate node if type changes. -- Recreate node if type changes.
if nodes_by_path[abs] then if nodes_by_path[abs] then
@@ -122,26 +115,26 @@ function M.reload(node, git_status)
end end
if not nodes_by_path[abs] then if not nodes_by_path[abs] then
local new_child = nil
if t == "directory" and vim.loop.fs_access(abs, "R") and Watcher.is_fs_event_capable(abs) then if t == "directory" and vim.loop.fs_access(abs, "R") and Watcher.is_fs_event_capable(abs) then
local folder = builders.folder(node, abs, name) new_child = builders.folder(node, abs, name, stat)
nodes_by_path[abs] = folder
table.insert(node.nodes, folder)
elseif t == "file" then elseif t == "file" then
local file = builders.file(node, abs, name) new_child = builders.file(node, abs, name, stat)
nodes_by_path[abs] = file
table.insert(node.nodes, file)
elseif t == "link" then elseif t == "link" then
local link = builders.link(node, abs, name) local link = builders.link(node, abs, name, stat)
if link.link_to ~= nil then if link.link_to ~= nil then
nodes_by_path[abs] = link new_child = link
table.insert(node.nodes, link)
end end
end end
if new_child then
table.insert(node.nodes, new_child)
nodes_by_path[abs] = new_child
end
else else
local n = nodes_by_path[abs] local n = nodes_by_path[abs]
if n then if n then
n.executable = builders.is_executable(abs) n.executable = builders.is_executable(abs) or false
n.fs_stat = fs_stat_cached(abs) n.fs_stat = stat
end end
end end
end end
@@ -150,8 +143,8 @@ function M.reload(node, git_status)
node.nodes = vim.tbl_map( node.nodes = vim.tbl_map(
update_status(nodes_by_path, node_ignored, git_status), update_status(nodes_by_path, node_ignored, git_status),
vim.tbl_filter(function(n) vim.tbl_filter(function(n)
if child_names[n.absolute_path] then if remain_childs[n.absolute_path] then
return child_names[n.absolute_path] return remain_childs[n.absolute_path]
else else
explorer_node.node_destroy(n) explorer_node.node_destroy(n)
return false return false

View File

@@ -136,6 +136,10 @@ end
---@param path string absolute ---@param path string absolute
---@return string|nil ---@return string|nil
function M.get_toplevel(path) function M.get_toplevel(path)
if not path then
return nil
end
if not M.config.git.enable then if not M.config.git.enable then
return nil return nil
end end

View File

@@ -173,7 +173,12 @@ local function open()
-- populate it -- populate it
vim.api.nvim_buf_set_lines(M.bufnr, 0, -1, false, lines) vim.api.nvim_buf_set_lines(M.bufnr, 0, -1, false, lines)
vim.api.nvim_buf_set_option(M.bufnr, "modifiable", false)
if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("modifiable", false, { buf = M.bufnr })
else
vim.api.nvim_buf_set_option(M.bufnr, "modifiable", false) ---@diagnostic disable-line: deprecated
end
-- highlight it -- highlight it
for _, h in ipairs(hl) do for _, h in ipairs(hl) do

View File

@@ -68,6 +68,7 @@ function M.default_on_attach(bufnr)
vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start')) vim.keymap.set('n', 'f', api.live_filter.start, opts('Live Filter: Start'))
vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help')) 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', '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.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles')) vim.keymap.set('n', 'H', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles'))
vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore')) vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore'))
vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling')) vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling'))

View File

@@ -3,6 +3,7 @@ local notify = require "nvim-tree.notify"
local M = {} local M = {}
-- silently move, please add to help nvim-tree-legacy-opts
local function refactored(opts) local function refactored(opts)
-- 2022/06/20 -- 2022/06/20
utils.move_missing_val(opts, "update_focused_file", "update_cwd", opts, "update_focused_file", "update_root", true) utils.move_missing_val(opts, "update_focused_file", "update_cwd", opts, "update_focused_file", "update_root", true)
@@ -51,6 +52,14 @@ local function refactored(opts)
if type(opts.renderer) == "table" and type(opts.renderer.highlight_git) == "boolean" then if type(opts.renderer) == "table" and type(opts.renderer.highlight_git) == "boolean" then
opts.renderer.highlight_git = opts.renderer.highlight_git and "name" or "none" opts.renderer.highlight_git = opts.renderer.highlight_git and "name" or "none"
end end
-- 2024/02/15
if type(opts.update_focused_file) == "table" then
if type(opts.update_focused_file.update_root) ~= "table" then
opts.update_focused_file.update_root = { enable = opts.update_focused_file.update_root }
end
end
utils.move_missing_val(opts, "update_focused_file", "ignore_list", opts, "update_focused_file.update_root", "ignore_list", true)
end end
local function deprecated(opts) local function deprecated(opts)
@@ -61,12 +70,12 @@ end
local function removed(opts) local function removed(opts)
if opts.auto_close then if opts.auto_close then
notify.warn "auto close feature has been removed, see note in the README (tips & reminder section)" notify.warn "auto close feature has been removed: https://github.com/nvim-tree/nvim-tree.lua/wiki/Auto-Close"
opts.auto_close = nil opts.auto_close = nil
end end
if opts.focus_empty_on_setup then if opts.focus_empty_on_setup then
notify.warn "focus_empty_on_setup has been removed and will be replaced by a new startup configuration. Please remove this option. See https://bit.ly/3yJch2T" notify.warn "focus_empty_on_setup has been removed: https://github.com/nvim-tree/nvim-tree.lua/wiki/Open-At-Startup"
opts.focus_empty_on_setup = nil opts.focus_empty_on_setup = nil
end end

View File

@@ -3,6 +3,7 @@ local view = require "nvim-tree.view"
local core = require "nvim-tree.core" local core = require "nvim-tree.core"
local utils = require "nvim-tree.utils" local utils = require "nvim-tree.utils"
local events = require "nvim-tree.events" local events = require "nvim-tree.events"
local notify = require "nvim-tree.notify"
local explorer_node = require "nvim-tree.explorer.node" local explorer_node = require "nvim-tree.explorer.node"
---@class LibOpenOpts ---@class LibOpenOpts
@@ -57,6 +58,7 @@ local function clone_node(node)
name = node.name, name = node.name,
open = node.open, open = node.open,
type = node.type, type = node.type,
fs_stat = node.fs_stat,
} }
if type(node.nodes) == "table" then if type(node.nodes) == "table" then
@@ -83,8 +85,7 @@ function M.get_last_group_node(node)
node = node.group_next node = node.group_next
end end
---@diagnostic disable-next-line: return-type-mismatch -- it can't be nil return node ---@diagnostic disable-line: return-type-mismatch -- it can't be nil
return node
end end
---Group empty folders ---Group empty folders
@@ -197,8 +198,15 @@ end
local function should_hijack_current_buf() local function should_hijack_current_buf()
local bufnr = vim.api.nvim_get_current_buf() local bufnr = vim.api.nvim_get_current_buf()
local bufname = vim.api.nvim_buf_get_name(bufnr) local bufname = vim.api.nvim_buf_get_name(bufnr)
local bufmodified = vim.api.nvim_buf_get_option(bufnr, "modified")
local ft = vim.api.nvim_buf_get_option(bufnr, "ft") local bufmodified, ft
if vim.fn.has "nvim-0.10" == 1 then
bufmodified = vim.api.nvim_get_option_value("modified", { buf = bufnr })
ft = vim.api.nvim_get_option_value("ft", { buf = bufnr })
else
bufmodified = vim.api.nvim_buf_get_option(bufnr, "modified") ---@diagnostic disable-line: deprecated
ft = vim.api.nvim_buf_get_option(bufnr, "ft") ---@diagnostic disable-line: deprecated
end
local should_hijack_unnamed = M.hijack_unnamed_buffer_when_opening and bufname == "" and not bufmodified and ft == "" local should_hijack_unnamed = M.hijack_unnamed_buffer_when_opening and bufname == "" and not bufmodified and ft == ""
local should_hijack_dir = bufname ~= "" and vim.fn.isdirectory(bufname) == 1 and M.hijack_directories.enable local should_hijack_dir = bufname ~= "" and vim.fn.isdirectory(bufname) == 1 and M.hijack_directories.enable
@@ -242,7 +250,16 @@ function M.open(opts)
M.set_target_win() M.set_target_win()
if not core.get_explorer() or opts.path then if not core.get_explorer() or opts.path then
core.init(opts.path or vim.loop.cwd()) if opts.path then
core.init(opts.path)
else
local cwd, err = vim.loop.cwd()
if not cwd then
notify.error(string.format("current working directory unavailable: %s", err))
return
end
core.init(cwd)
end
end end
if should_hijack_current_buf() then if should_hijack_current_buf() then
view.close_this_tab_only() view.close_this_tab_only()

View File

@@ -1,6 +1,7 @@
local view = require "nvim-tree.view" local view = require "nvim-tree.view"
local utils = require "nvim-tree.utils" local utils = require "nvim-tree.utils"
local Iterator = require "nvim-tree.iterators.node-iterator" local Iterator = require "nvim-tree.iterators.node-iterator"
local filters = require "nvim-tree.explorer.filters"
local M = { local M = {
filter = nil, filter = nil,
@@ -26,8 +27,8 @@ local function reset_filter(node_)
:iterate() :iterate()
end end
local overlay_bufnr = nil local overlay_bufnr = 0
local overlay_winnr = nil local overlay_winnr = 0
local function remove_overlay() local function remove_overlay()
if view.View.float.enable and view.View.float.quit_on_focus_loss then if view.View.float.enable and view.View.float.quit_on_focus_loss then
@@ -45,8 +46,8 @@ local function remove_overlay()
vim.api.nvim_win_close(overlay_winnr, true) vim.api.nvim_win_close(overlay_winnr, true)
vim.api.nvim_buf_delete(overlay_bufnr, { force = true }) vim.api.nvim_buf_delete(overlay_bufnr, { force = true })
overlay_bufnr = nil overlay_bufnr = 0
overlay_winnr = nil overlay_winnr = 0
if M.filter == "" then if M.filter == "" then
M.clear_filter() M.clear_filter()
@@ -56,6 +57,10 @@ end
---@param node Node ---@param node Node
---@return boolean ---@return boolean
local function matches(node) local function matches(node)
if not filters.config.enable then
return true
end
local path = node.absolute_path local path = node.absolute_path
local name = vim.fn.fnamemodify(path, ":t") local name = vim.fn.fnamemodify(path, ":t")
return vim.regex(M.filter):match_str(name) ~= nil return vim.regex(M.filter):match_str(name) ~= nil
@@ -145,7 +150,13 @@ local function create_overlay()
border = "none", border = "none",
style = "minimal", style = "minimal",
}) })
vim.api.nvim_buf_set_option(overlay_bufnr, "modifiable", true)
if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("modifiable", true, { buf = overlay_bufnr })
else
vim.api.nvim_buf_set_option(overlay_bufnr, "modifiable", true) ---@diagnostic disable-line: deprecated
end
vim.api.nvim_buf_set_lines(overlay_bufnr, 0, -1, false, { M.filter }) vim.api.nvim_buf_set_lines(overlay_bufnr, 0, -1, false, { M.filter })
vim.cmd "startinsert" vim.cmd "startinsert"
vim.api.nvim_win_set_cursor(overlay_winnr, { 1, #M.filter + 1 }) vim.api.nvim_win_set_cursor(overlay_winnr, { 1, #M.filter + 1 })

View File

@@ -3,6 +3,7 @@ local core = require "nvim-tree.core"
local utils = require "nvim-tree.utils" local utils = require "nvim-tree.utils"
local rename_file = require "nvim-tree.actions.fs.rename-file" local rename_file = require "nvim-tree.actions.fs.rename-file"
local notify = require "nvim-tree.notify" local notify = require "nvim-tree.notify"
local lib = require "nvim-tree.lib"
local M = { local M = {
config = {}, config = {},
@@ -14,9 +15,18 @@ function M.bulk_move()
return return
end end
local node_at_cursor = lib.get_node_at_cursor()
local default_path = core.get_cwd()
if node_at_cursor and node_at_cursor.type == "directory" then
default_path = node_at_cursor.absolute_path
elseif node_at_cursor and node_at_cursor.parent then
default_path = node_at_cursor.parent.absolute_path
end
local input_opts = { local input_opts = {
prompt = "Move to: ", prompt = "Move to: ",
default = core.get_cwd(), default = default_path,
completion = "dir", completion = "dir",
} }

View File

@@ -6,7 +6,7 @@
---@class BaseNode ---@class BaseNode
---@field absolute_path string ---@field absolute_path string
---@field executable boolean ---@field executable boolean
---@field fs_stat uv.uv_fs_t ---@field fs_stat uv.fs_stat.result|nil
---@field git_status GitStatus|nil ---@field git_status GitStatus|nil
---@field hidden boolean ---@field hidden boolean
---@field name string ---@field name string

View File

@@ -295,24 +295,16 @@ function Builder:add_highlights(node)
table.insert(name_groups, name) table.insert(name_groups, name)
end end
-- one or many icon groups; <= 0.8 always uses highest due to lack of a practical nvim_get_hl equivalent -- one or many icon groups
if #icon_groups > 1 then if #icon_groups > 1 then
if vim.fn.has "nvim-0.9" == 1 then icon_hl_group = self:create_combined_group(icon_groups)
icon_hl_group = self:create_combined_group(icon_groups)
else
icon_hl_group = icon_groups[#icon_groups]
end
else else
icon_hl_group = icon_groups[1] icon_hl_group = icon_groups[1]
end end
-- one or many name groups; <= 0.8 always uses highest due to lack of a practical nvim_get_hl equivalent -- one or many name groups
if #name_groups > 1 then if #name_groups > 1 then
if vim.fn.has "nvim-0.9" == 1 then name_hl_group = self:create_combined_group(name_groups)
name_hl_group = self:create_combined_group(name_groups)
else
name_hl_group = name_groups[#name_groups]
end
else else
name_hl_group = name_groups[1] name_hl_group = name_groups[1]
end end
@@ -396,11 +388,11 @@ function Builder:format_root_name(root_label)
local label = root_label(self.root_cwd) local label = root_label(self.root_cwd)
if type(label) == "string" then if type(label) == "string" then
return label return label
else
return "???"
end end
elseif type(root_label) == "string" then
return utils.path_remove_trailing(vim.fn.fnamemodify(self.root_cwd, root_label))
end end
return utils.path_remove_trailing(vim.fn.fnamemodify(self.root_cwd, root_label)) return "???"
end end
---@private ---@private
@@ -422,11 +414,21 @@ function Builder:build_header()
end end
end end
---Sanitize lines for rendering.
---Replace newlines with literal \n
---@private
function Builder:sanitize_lines()
self.lines = vim.tbl_map(function(line)
return line and line:gsub("\n", "\\n") or ""
end, self.lines)
end
---Build all lines with highlights and signs ---Build all lines with highlights and signs
---@return Builder ---@return Builder
function Builder:build() function Builder:build()
self:build_header() self:build_header()
self:build_lines() self:build_lines()
self:sanitize_lines()
return self return self
end end

View File

@@ -67,12 +67,19 @@ local function show()
}) })
local ns_id = vim.api.nvim_get_namespaces()["NvimTreeHighlights"] local ns_id = vim.api.nvim_get_namespaces()["NvimTreeHighlights"]
local extmarks = vim.api.nvim_buf_get_extmarks(0, ns_id, { line_nr - 1, 0 }, { line_nr - 1, -1 }, { details = 1 }) local extmarks = vim.api.nvim_buf_get_extmarks(0, ns_id, { line_nr - 1, 0 }, { line_nr - 1, -1 }, { details = true })
vim.api.nvim_win_call(M.popup_win, function() vim.api.nvim_win_call(M.popup_win, function()
vim.api.nvim_buf_set_lines(0, 0, -1, true, { line }) vim.api.nvim_buf_set_lines(0, 0, -1, true, { line })
for _, extmark in ipairs(extmarks) do for _, extmark in ipairs(extmarks) do
local hl = extmark[4] -- nvim 0.10 luadoc is incorrect: vim.api.keyset.get_extmark_item is missing the extmark_id at the start
vim.api.nvim_buf_add_highlight(0, ns_id, hl.hl_group, 0, extmark[3], hl.end_col)
---@cast extmark table
---@type integer
local col = extmark[3]
---@type vim.api.keyset.extmark_details
local details = extmark[4]
vim.api.nvim_buf_add_highlight(0, ns_id, details.hl_group, 0, col, details.end_col)
end end
vim.cmd [[ setlocal nowrap cursorline noswapfile nobuflisted buftype=nofile bufhidden=hide ]] vim.cmd [[ setlocal nowrap cursorline noswapfile nobuflisted buftype=nofile bufhidden=hide ]]
end) end)

View File

@@ -65,7 +65,12 @@ local function get_file_icon_webdev(fname, extension)
-- If there are more extensions to the file, try to grab the icon for them recursively -- If there are more extensions to the file, try to grab the icon for them recursively
return get_file_icon_webdev(fname, string.match(extension, "%.(.*)")) return get_file_icon_webdev(fname, string.match(extension, "%.(.*)"))
else else
return get_file_icon_default() local devicons_default = M.devicons.get_default_icon()
if devicons_default and type(devicons_default.icon) == "string" and type(devicons_default.name) == "string" then
return devicons_default.icon, "DevIcon" .. devicons_default.name
else
return get_file_icon_default()
end
end end
end end

View File

@@ -19,10 +19,21 @@ local namespace_id = vim.api.nvim_create_namespace "NvimTreeHighlights"
---@param hl_args AddHighlightArgs[] ---@param hl_args AddHighlightArgs[]
---@param signs string[] ---@param signs string[]
local function _draw(bufnr, lines, hl_args, signs) local function _draw(bufnr, lines, hl_args, signs)
vim.api.nvim_buf_set_option(bufnr, "modifiable", true) if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("modifiable", true, { buf = bufnr })
else
vim.api.nvim_buf_set_option(bufnr, "modifiable", true) ---@diagnostic disable-line: deprecated
end
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines) vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
M.render_hl(bufnr, hl_args) M.render_hl(bufnr, hl_args)
vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
if vim.fn.has "nvim-0.10" == 1 then
vim.api.nvim_set_option_value("modifiable", false, { buf = bufnr })
else
vim.api.nvim_buf_set_option(bufnr, "modifiable", false) ---@diagnostic disable-line: deprecated
end
vim.fn.sign_unplace(SIGN_GROUP) vim.fn.sign_unplace(SIGN_GROUP)
for i, sign_name in pairs(signs) do for i, sign_name in pairs(signs) do
vim.fn.sign_place(0, SIGN_GROUP, sign_name, bufnr, { lnum = i + 1 }) vim.fn.sign_place(0, SIGN_GROUP, sign_name, bufnr, { lnum = i + 1 })
@@ -51,7 +62,7 @@ function M.draw()
local profile = log.profile_start "draw" local profile = log.profile_start "draw"
local cursor = vim.api.nvim_win_get_cursor(view.get_winnr()) local cursor = vim.api.nvim_win_get_cursor(view.get_winnr() or 0)
icon_component.reset_config() icon_component.reset_config()
local builder = Builder:new():build() local builder = Builder:new():build()
@@ -59,7 +70,7 @@ function M.draw()
_draw(bufnr, builder.lines, builder.hl_args, builder.signs) _draw(bufnr, builder.lines, builder.hl_args, builder.signs)
if cursor and #builder.lines >= cursor[1] then if cursor and #builder.lines >= cursor[1] then
vim.api.nvim_win_set_cursor(view.get_winnr(), cursor) vim.api.nvim_win_set_cursor(view.get_winnr() or 0, cursor)
end end
view.grow_from_content() view.grow_from_content()

View File

@@ -226,7 +226,14 @@ function M.rename_loaded_buffers(old_path, new_path)
vim.api.nvim_buf_set_name(buf, new_path .. buf_name:sub(#old_path + 1)) vim.api.nvim_buf_set_name(buf, new_path .. buf_name:sub(#old_path + 1))
-- to avoid the 'overwrite existing file' error message on write for -- to avoid the 'overwrite existing file' error message on write for
-- normal files -- normal files
if vim.api.nvim_buf_get_option(buf, "buftype") == "" then local buftype
if vim.fn.has "nvim-0.10" == 1 then
buftype = vim.api.nvim_get_option_value("buftype", { buf = buf })
else
buftype = vim.api.nvim_buf_get_option(buf, "buftype") ---@diagnostic disable-line: deprecated
end
if buftype == "" then
vim.api.nvim_buf_call(buf, function() vim.api.nvim_buf_call(buf, function()
vim.cmd "silent! write!" vim.cmd "silent! write!"
vim.cmd "edit" vim.cmd "edit"
@@ -406,6 +413,9 @@ function M.debounce(context, timeout, callback)
end end
local timer = vim.loop.new_timer() local timer = vim.loop.new_timer()
if not timer then
return
end
debouncer.timer = timer debouncer.timer = timer
timer:start(timeout, 0, function() timer:start(timeout, 0, function()
timer_stop_close(timer) timer_stop_close(timer)

View File

@@ -108,7 +108,7 @@ local function create_buffer(bufnr)
events._dispatch_tree_attached_post(M.get_bufnr()) events._dispatch_tree_attached_post(M.get_bufnr())
end end
---@param size number|fun():number ---@param size (fun():integer)|integer|string
---@return integer ---@return integer
local function get_size(size) local function get_size(size)
if type(size) == "number" then if type(size) == "number" then
@@ -121,10 +121,13 @@ local function get_size(size)
return math.floor(vim.o.columns * percent_as_decimal) return math.floor(vim.o.columns * percent_as_decimal)
end end
---@param size number|function|nil ---@param size (fun():integer)|integer|nil
local function get_width(size) local function get_width(size)
size = size or M.View.width if size then
return get_size(size) return get_size(size)
else
return get_size(M.View.width)
end
end end
local move_tbl = { local move_tbl = {
@@ -140,7 +143,7 @@ local function setup_tabpage(tabpage)
end end
local function set_window_options_and_buffer() local function set_window_options_and_buffer()
pcall(vim.cmd, "buffer " .. M.get_bufnr()) pcall(vim.api.nvim_command, "buffer " .. M.get_bufnr())
local eventignore = vim.opt.eventignore:get() local eventignore = vim.opt.eventignore:get()
vim.opt.eventignore = "all" vim.opt.eventignore = "all"
for k, v in pairs(M.View.winopts) do for k, v in pairs(M.View.winopts) do
@@ -204,7 +207,7 @@ end
---@param tabnr integer ---@param tabnr integer
local function save_tab_state(tabnr) local function save_tab_state(tabnr)
local tabpage = tabnr or vim.api.nvim_get_current_tabpage() local tabpage = tabnr or vim.api.nvim_get_current_tabpage()
M.View.cursors[tabpage] = vim.api.nvim_win_get_cursor(M.get_winnr(tabpage)) M.View.cursors[tabpage] = vim.api.nvim_win_get_cursor(M.get_winnr(tabpage) or 0)
end end
---@param tabpage integer ---@param tabpage integer
@@ -222,8 +225,8 @@ local function close(tabpage)
if tree_win == current_win and prev_win > 0 then if tree_win == current_win and prev_win > 0 then
vim.api.nvim_set_current_win(vim.fn.win_getid(prev_win)) vim.api.nvim_set_current_win(vim.fn.win_getid(prev_win))
end end
if vim.api.nvim_win_is_valid(tree_win) then if vim.api.nvim_win_is_valid(tree_win or 0) then
vim.api.nvim_win_close(tree_win, true) vim.api.nvim_win_close(tree_win or 0, true)
end end
events._dispatch_on_tree_close() events._dispatch_on_tree_close()
return return
@@ -343,13 +346,9 @@ function M.resize(size)
end end
local new_size = get_width() local new_size = get_width()
vim.api.nvim_win_set_width(M.get_winnr(), new_size) vim.api.nvim_win_set_width(M.get_winnr() or 0, new_size)
-- TODO #1545 remove similar check from setup_autocommands events._dispatch_on_tree_resize(new_size)
-- We let nvim handle sending resize events after 0.9
if vim.fn.has "nvim-0.9" == 0 then
events._dispatch_on_tree_resize(new_size)
end
if not M.View.preserve_window_proportions then if not M.View.preserve_window_proportions then
vim.cmd ":wincmd =" vim.cmd ":wincmd ="
@@ -420,7 +419,7 @@ function M.is_visible(opts)
return false return false
end end
return M.get_winnr() ~= nil and vim.api.nvim_win_is_valid(M.get_winnr()) return M.get_winnr() ~= nil and vim.api.nvim_win_is_valid(M.get_winnr() or 0)
end end
---@param opts table|nil ---@param opts table|nil
@@ -443,7 +442,9 @@ function M.focus(winnr, open_if_closed)
M.open() M.open()
end end
vim.api.nvim_set_current_win(wnr) if wnr then
vim.api.nvim_set_current_win(wnr)
end
end end
--- Retrieve the winid of the open tree. --- Retrieve the winid of the open tree.
@@ -541,7 +542,8 @@ end
-- used on ColorScheme event -- used on ColorScheme event
function M.reset_winhl() function M.reset_winhl()
if M.get_winnr() and vim.api.nvim_win_is_valid(M.get_winnr()) then local winnr = M.get_winnr()
if winnr and vim.api.nvim_win_is_valid(winnr) then
vim.wo[M.get_winnr()].winhl = M.View.winopts.winhl vim.wo[M.get_winnr()].winhl = M.View.winopts.winhl
end end
end end

View File

@@ -21,6 +21,39 @@ sed -e "s/^ / /" /tmp/DEFAULT_OPTS.2.lua > /tmp/DEFAULT_OPTS.6.lua
sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/DEFAULT_OPTS.6.lua
}; /${end}/p; d; }" doc/nvim-tree-lua.txt }; /${end}/p; d; }" doc/nvim-tree-lua.txt
#
# opts index
#
begin="nvim-tree-index-opts\*"
end="====================="
printf '\n' > /tmp/index-opts.txt
sed -E "
/^ *\*(nvim-tree\..*)\*$/! d ;
s/^.*\*(.*)\*/|\1|/g
" doc/nvim-tree-lua.txt | sort -d >> /tmp/index-opts.txt
printf '\n' >> /tmp/index-opts.txt
sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/index-opts.txt
}; /${end}/p; d; }" doc/nvim-tree-lua.txt
#
# api index
#
begin="nvim-tree-index-api\*"
end="====================="
printf '\n' > /tmp/index-api.txt
sed -E "
/\*(nvim-tree-api.*\(\))\*/! d ;
s/^.*\*(.*)\*/|\1|/g
" doc/nvim-tree-lua.txt | sort -d >> /tmp/index-api.txt
printf '\n' >> /tmp/index-api.txt
sed -i -e "/${begin}/,/${end}/{ /${begin}/{p; r /tmp/index-api.txt
}; /${end}/p; d; }" doc/nvim-tree-lua.txt
# #
# DEFAULT_ON_ATTACH # DEFAULT_ON_ATTACH
# #

View File

@@ -29,15 +29,11 @@ fi
# any output is a fail # any output is a fail
case "${OUT}" in case "${OUT}" in
*Diagnosis\ complete*) *Diagnosis\ completed,\ no\ problems\ found*)
if [ -f "${DIR_OUT}/check.json" ]; then exit 0
cat "${DIR_OUT}/check.json"
exit 1
else
exit 0
fi
;; ;;
*) *)
cat "${DIR_OUT}/check.json"
exit 1 exit 1
;; ;;
esac esac