Compare commits
25 Commits
chore-poc-
...
nvim-tree-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b5b366596 | ||
|
|
ae595611fb | ||
|
|
05d8172ebf | ||
|
|
1c733e8c19 | ||
|
|
ebcaccda1c | ||
|
|
cbc3165e08 | ||
|
|
bd54d1d33c | ||
|
|
25d16aab7d | ||
|
|
e4cd856ebf | ||
|
|
e7d1b7dadc | ||
|
|
ea5097a1e2 | ||
|
|
582ae48c9e | ||
|
|
be5b788f2d | ||
|
|
64bb47f868 | ||
|
|
c24c0470d9 | ||
|
|
3a63717d3d | ||
|
|
5bea2b3752 | ||
|
|
c3c1935942 | ||
|
|
44d9b58f11 | ||
|
|
c09ff35de5 | ||
|
|
6709463b2d | ||
|
|
b69914325a | ||
|
|
3281f331f7 | ||
|
|
80523101f0 | ||
|
|
70825f23db |
@@ -7,6 +7,9 @@ end_of_line = lf
|
|||||||
[nvim-tree-lua.txt]
|
[nvim-tree-lua.txt]
|
||||||
max_line_length = 78
|
max_line_length = 78
|
||||||
|
|
||||||
|
# keep these in sync with .luarc.json
|
||||||
|
# .editorconfig is used within nvim, overriding .luarc.json
|
||||||
|
# .luarc.json is used by style check
|
||||||
[*.lua]
|
[*.lua]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
max_line_length = 140
|
max_line_length = 140
|
||||||
|
|||||||
63
.github/workflows/ci.yml
vendored
63
.github/workflows/ci.yml
vendored
@@ -20,45 +20,25 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
lua_version: [ 5.1 ]
|
lua_version: [ 5.1 ]
|
||||||
|
luacheck_version: [ 1.2.0 ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- name: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: leafo/gh-actions-lua@v10
|
- name: install lua ${{ matrix.lua_version }}
|
||||||
|
uses: leafo/gh-actions-lua@v11
|
||||||
with:
|
with:
|
||||||
luaVersion: ${{ matrix.lua_version }}
|
luaVersion: ${{ matrix.lua_version }}
|
||||||
|
|
||||||
- uses: leafo/gh-actions-luarocks@v4
|
- name: install luarocks
|
||||||
|
uses: leafo/gh-actions-luarocks@v5
|
||||||
|
|
||||||
- run: luarocks install luacheck 1.1.1
|
- name: install luacheck ${{ matrix.luacheck_version }}
|
||||||
|
run: luarocks install luacheck ${{ matrix.luacheck_version }}
|
||||||
|
|
||||||
- run: make lint
|
- run: make lint
|
||||||
|
|
||||||
style:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ matrix.emmy_lua_code_style_version }}-${{ github.head_ref || github.ref_name }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
emmy_lua_code_style_version: [ 1.5.6 ]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: install emmy_lua_code_style
|
|
||||||
run: |
|
|
||||||
mkdir -p CodeFormat
|
|
||||||
curl -L "https://github.com/CppCXY/EmmyLuaCodeStyle/releases/download/${{ matrix.emmy_lua_code_style_version }}/linux-x64.tar.gz" | tar zx --directory CodeFormat
|
|
||||||
|
|
||||||
- run: echo "CodeFormat/linux-x64/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- run: make style
|
|
||||||
|
|
||||||
- run: make style-doc
|
|
||||||
|
|
||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
@@ -69,26 +49,31 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
nvim_version: [ stable, nightly ]
|
nvim_version: [ stable, nightly ]
|
||||||
luals_version: [ 3.11.0 ]
|
luals_version: [ 3.13.9 ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
VIMRUNTIME: /home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- name: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: rhysd/action-setup-vim@v1
|
- name: install nvim ${{ matrix.nvim_version }}
|
||||||
|
uses: rhysd/action-setup-vim@v1
|
||||||
with:
|
with:
|
||||||
neovim: true
|
neovim: true
|
||||||
version: ${{ matrix.nvim_version }}
|
version: ${{ matrix.nvim_version }}
|
||||||
|
|
||||||
- name: install luals
|
- name: install lua-language-server ${{ matrix.luals_version }}
|
||||||
run: |
|
run: |
|
||||||
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
|
||||||
|
echo "luals/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
- run: echo "luals/bin" >> "$GITHUB_PATH"
|
- run: make check
|
||||||
|
|
||||||
- name: make check
|
|
||||||
env:
|
|
||||||
VIMRUNTIME: /home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime
|
|
||||||
run: make check
|
|
||||||
|
|
||||||
- run: make help-check
|
- run: make help-check
|
||||||
|
|
||||||
|
- run: make style
|
||||||
|
|
||||||
|
- run: make style-doc
|
||||||
|
|||||||
4
.github/workflows/luarocks-release.yml
vendored
4
.github/workflows/luarocks-release.yml
vendored
@@ -1,9 +1,11 @@
|
|||||||
name: Luarocks Release
|
name: Luarocks Release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- 'v[0-9]+.[0-9]+.[0-9]+'
|
- v*
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
luarocks-upload:
|
luarocks-upload:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
/luals-out/
|
/luals-out/
|
||||||
/luals/
|
/luals/
|
||||||
/plenary.nvim/
|
|
||||||
# backup vim files
|
# backup vim files
|
||||||
*~
|
*~
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
make
|
make
|
||||||
|
|||||||
16
.luarc.json
16
.luarc.json
@@ -1,13 +1,23 @@
|
|||||||
{
|
{
|
||||||
"$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.luals-check-only": "Lua 5.1",
|
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"library": [
|
"library": [
|
||||||
"$VIMRUNTIME/lua/vim",
|
"$VIMRUNTIME/lua/vim",
|
||||||
"${3rd}/luv/library",
|
"${3rd}/luv/library"
|
||||||
"plenary.nvim"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"format": {
|
||||||
|
"defaultConfig": {
|
||||||
|
"indent_style": "space",
|
||||||
|
"max_line_length": "140",
|
||||||
|
"indent_size": "2",
|
||||||
|
"continuation_indent": "2",
|
||||||
|
"quote_style": "double",
|
||||||
|
"call_arg_parentheses": "always",
|
||||||
|
"space_before_closure_open_parenthesis": "false",
|
||||||
|
"align_continuous_similar_call_args": "true"
|
||||||
|
}
|
||||||
|
},
|
||||||
"diagnostics": {
|
"diagnostics": {
|
||||||
"libraryFiles": "Disable",
|
"libraryFiles": "Disable",
|
||||||
"globals": [],
|
"globals": [],
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
".": "1.10.0"
|
".": "1.13.0"
|
||||||
}
|
}
|
||||||
|
|||||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -1,5 +1,59 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.13.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.12.0...nvim-tree-v1.13.0) (2025-06-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **#3113:** add renderer.icons.folder_arrow_padding ([#3114](https://github.com/nvim-tree/nvim-tree.lua/issues/3114)) ([ea5097a](https://github.com/nvim-tree/nvim-tree.lua/commit/ea5097a1e2702b4827cb7380e7fa0bd6da87699c))
|
||||||
|
* **#3132:** add api.node.expand and api.node.collapse ([#3133](https://github.com/nvim-tree/nvim-tree.lua/issues/3133)) ([ae59561](https://github.com/nvim-tree/nvim-tree.lua/commit/ae595611fb2225f2041996c042aa4e4b8663b41e))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* "Invalid buffer id" on closing nvim-tree window ([#3129](https://github.com/nvim-tree/nvim-tree.lua/issues/3129)) ([25d16aa](https://github.com/nvim-tree/nvim-tree.lua/commit/25d16aab7d29ca940a9feb92e6bb734697417009))
|
||||||
|
* **#2746:** background and right aligned icons in floating windows ([#3128](https://github.com/nvim-tree/nvim-tree.lua/issues/3128)) ([cbc3165](https://github.com/nvim-tree/nvim-tree.lua/commit/cbc3165e08893bb499da035c6f6f9d1512b57664))
|
||||||
|
* **#3117:** allow changing filename's casing ([bd54d1d](https://github.com/nvim-tree/nvim-tree.lua/commit/bd54d1d33c20d8630703b9842480291588dbad07))
|
||||||
|
* **#3117:** windows: change file/dir case ([#3135](https://github.com/nvim-tree/nvim-tree.lua/issues/3135)) ([bd54d1d](https://github.com/nvim-tree/nvim-tree.lua/commit/bd54d1d33c20d8630703b9842480291588dbad07))
|
||||||
|
* **#3122:** remove redundant vim.validate ([#3123](https://github.com/nvim-tree/nvim-tree.lua/issues/3123)) ([e7d1b7d](https://github.com/nvim-tree/nvim-tree.lua/commit/e7d1b7dadc62fe2eccc17d814354b0a5688621ce))
|
||||||
|
* **#3124:** fix icon padding for "right_align" placements, notably for dotfiles ([#3125](https://github.com/nvim-tree/nvim-tree.lua/issues/3125)) ([e4cd856](https://github.com/nvim-tree/nvim-tree.lua/commit/e4cd856ebf4fec51db10c69d63e43224b701cbce))
|
||||||
|
* **#3124:** prevent empty icons_right_align response from breaking padding ([e4cd856](https://github.com/nvim-tree/nvim-tree.lua/commit/e4cd856ebf4fec51db10c69d63e43224b701cbce))
|
||||||
|
* **#3134:** setting one glyph to "" no longer disables others ([#3136](https://github.com/nvim-tree/nvim-tree.lua/issues/3136)) ([ebcaccd](https://github.com/nvim-tree/nvim-tree.lua/commit/ebcaccda1c575fa19a8087445276e6671e2b9b37))
|
||||||
|
* **#3143:** actions.open_file.window_picker.exclude applies when not using window picker ([#3144](https://github.com/nvim-tree/nvim-tree.lua/issues/3144)) ([05d8172](https://github.com/nvim-tree/nvim-tree.lua/commit/05d8172ebf9cdb2d140cf25b75625374fbc3df7f))
|
||||||
|
* fixes [#3134](https://github.com/nvim-tree/nvim-tree.lua/issues/3134) ([ebcaccd](https://github.com/nvim-tree/nvim-tree.lua/commit/ebcaccda1c575fa19a8087445276e6671e2b9b37))
|
||||||
|
* invalid buffer issue ([25d16aa](https://github.com/nvim-tree/nvim-tree.lua/commit/25d16aab7d29ca940a9feb92e6bb734697417009))
|
||||||
|
|
||||||
|
## [1.12.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.11.0...nvim-tree-v1.12.0) (2025-04-20)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add TreePreOpen event ([#3105](https://github.com/nvim-tree/nvim-tree.lua/issues/3105)) ([c24c047](https://github.com/nvim-tree/nvim-tree.lua/commit/c24c0470d9de277fbebecd718f33561ed7c90298))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **#3101:** when renderer.highlight_opened_files = "none" do not reload on BufUnload and BufReadPost ([#3102](https://github.com/nvim-tree/nvim-tree.lua/issues/3102)) ([5bea2b3](https://github.com/nvim-tree/nvim-tree.lua/commit/5bea2b37523a31288e0fcab42f3be5c1bd4516bb))
|
||||||
|
* explicitly set `border` to `"none"` in full name float ([#3094](https://github.com/nvim-tree/nvim-tree.lua/issues/3094)) ([c3c1935](https://github.com/nvim-tree/nvim-tree.lua/commit/c3c193594213c5e2f89ec5d7729cad805f76b256))
|
||||||
|
* reliably dispatch exactly one TreeOpen and TreeClose events ([#3107](https://github.com/nvim-tree/nvim-tree.lua/issues/3107)) ([3a63717](https://github.com/nvim-tree/nvim-tree.lua/commit/3a63717d3d332d8f39aaf65be7a0e4c2265af021))
|
||||||
|
|
||||||
|
## [1.11.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.10.0...nvim-tree-v1.11.0) (2025-02-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **#1984:** add quit_on_open and focus opts to various api.node.open functions ([#3054](https://github.com/nvim-tree/nvim-tree.lua/issues/3054)) ([3281f33](https://github.com/nvim-tree/nvim-tree.lua/commit/3281f331f7f0bef13eb00fb2d5a9d28b2f6155a2))
|
||||||
|
* **#3037:** add API node.buffer.delete, node.buffer.wipe ([#3040](https://github.com/nvim-tree/nvim-tree.lua/issues/3040)) ([fee1da8](https://github.com/nvim-tree/nvim-tree.lua/commit/fee1da88972f5972a8296813f6c00d7598325ebd))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **#3045:** wipe scratch buffers for full name and show info popups ([#3050](https://github.com/nvim-tree/nvim-tree.lua/issues/3050)) ([fca0b67](https://github.com/nvim-tree/nvim-tree.lua/commit/fca0b67c0b5a31727fb33addc4d9c100736a2894))
|
||||||
|
* **#3059:** test for presence of new 0.11 API vim.hl.range ([#3060](https://github.com/nvim-tree/nvim-tree.lua/issues/3060)) ([70825f2](https://github.com/nvim-tree/nvim-tree.lua/commit/70825f23db61ecd900c4cfea169bffe931926a9d))
|
||||||
|
* arithmetic on nil value error on first git project open ([#3064](https://github.com/nvim-tree/nvim-tree.lua/issues/3064)) ([8052310](https://github.com/nvim-tree/nvim-tree.lua/commit/80523101f0ae48b7f1990e907b685a3d79776c01))
|
||||||
|
* stl and stlnc fillchars are hidden in window picker ([b699143](https://github.com/nvim-tree/nvim-tree.lua/commit/b69914325a945ee5157f0d21047210b42af5776e))
|
||||||
|
* window picker: hide fillchars: stl and stlnc ([#3066](https://github.com/nvim-tree/nvim-tree.lua/issues/3066)) ([b699143](https://github.com/nvim-tree/nvim-tree.lua/commit/b69914325a945ee5157f0d21047210b42af5776e))
|
||||||
|
|
||||||
## [1.10.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.9.0...nvim-tree-v1.10.0) (2025-01-13)
|
## [1.10.0](https://github.com/nvim-tree/nvim-tree.lua/compare/nvim-tree-v1.9.0...nvim-tree-v1.10.0) (2025-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ Language server: [luals](https://luals.github.io)
|
|||||||
|
|
||||||
Lint: [luacheck](https://github.com/lunarmodules/luacheck/)
|
Lint: [luacheck](https://github.com/lunarmodules/luacheck/)
|
||||||
|
|
||||||
Style: [EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle): `CodeCheck`
|
Style Fixing: [EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle): `CodeCheck`
|
||||||
|
|
||||||
nvim-tree.lua migrated from stylua to EmmyLuaCodeStyle ~2024/10. `vim.lsp.buf.format()` may be used as it is the default formatter for luals
|
nvim-tree.lua migrated from stylua to EmmyLuaCodeStyle ~2024/10. `vim.lsp.buf.format()` may be used as it is the default formatter for luals, using an embedded [EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle)
|
||||||
|
|
||||||
You can install them via you OS package manager e.g. `pacman`, `brew` or other via other package managers such as `cargo` or `luarocks`
|
You can install them via you OS package manager e.g. `pacman`, `brew` or other via other package managers such as `cargo` or `luarocks`
|
||||||
|
|
||||||
@@ -36,14 +36,14 @@ make lint
|
|||||||
|
|
||||||
## style
|
## style
|
||||||
|
|
||||||
1. Runs CodeCheck using `.editorconfig` settings
|
1. Runs lua language server `codestyle-check` only, using `.luarc.json` settings
|
||||||
1. Runs `scripts/doc-comments.sh` to validate annotated documentation
|
1. Runs `scripts/doc-comments.sh` to validate annotated documentation
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make style
|
make style
|
||||||
```
|
```
|
||||||
|
|
||||||
You can automatically fix `CodeCheck` issues via:
|
You can automatically fix style issues using `CodeCheck`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make style-fix
|
make style-fix
|
||||||
|
|||||||
15
Makefile
15
Makefile
@@ -17,7 +17,7 @@ luacheck:
|
|||||||
|
|
||||||
# --diagnosis-as-error does not function for workspace, hence we post-process the output
|
# --diagnosis-as-error does not function for workspace, hence we post-process the output
|
||||||
style-check:
|
style-check:
|
||||||
CodeFormat check --config .editorconfig --diagnosis-as-error --workspace lua
|
@scripts/luals-check.sh codestyle-check
|
||||||
|
|
||||||
style-doc:
|
style-doc:
|
||||||
scripts/doc-comments.sh
|
scripts/doc-comments.sh
|
||||||
@@ -43,19 +43,6 @@ help-update:
|
|||||||
help-check: help-update
|
help-check: help-update
|
||||||
git diff --exit-code doc/nvim-tree-lua.txt
|
git diff --exit-code doc/nvim-tree-lua.txt
|
||||||
|
|
||||||
#
|
|
||||||
# test
|
|
||||||
#
|
|
||||||
test: plenary.nvim
|
|
||||||
scripts/test.sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Dependencies
|
|
||||||
#
|
|
||||||
# no plenary tags or releases available
|
|
||||||
plenary.nvim:
|
|
||||||
git clone git@github.com:nvim-lua/plenary.nvim.git
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all lint style check luacheck style-check style-doc luals style-fix help-update help-check
|
.PHONY: all lint style check luacheck style-check style-doc luals style-fix help-update help-check
|
||||||
|
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ Show the mappings: `g?`
|
|||||||
`S` Search |nvim-tree-api.tree.search_node()|
|
`S` Search |nvim-tree-api.tree.search_node()|
|
||||||
`u` Rename: Full Path |nvim-tree-api.fs.rename_full()|
|
`u` Rename: Full Path |nvim-tree-api.fs.rename_full()|
|
||||||
`U` Toggle Filter: Hidden |nvim-tree-api.tree.toggle_custom_filter()|
|
`U` Toggle Filter: Hidden |nvim-tree-api.tree.toggle_custom_filter()|
|
||||||
`W` Collapse |nvim-tree-api.tree.collapse_all()|
|
`W` Collapse All |nvim-tree-api.tree.collapse_all()|
|
||||||
`x` Cut |nvim-tree-api.fs.cut()|
|
`x` Cut |nvim-tree-api.fs.cut()|
|
||||||
`y` Copy Name |nvim-tree-api.fs.copy.filename()|
|
`y` Copy Name |nvim-tree-api.fs.copy.filename()|
|
||||||
`Y` Copy Relative Path |nvim-tree-api.fs.copy.relative_path()|
|
`Y` Copy Relative Path |nvim-tree-api.fs.copy.relative_path()|
|
||||||
@@ -341,7 +341,7 @@ See |nvim-tree-highlight| for details.
|
|||||||
|
|
||||||
See |nvim-tree-api.tree.collapse_all()|
|
See |nvim-tree-api.tree.collapse_all()|
|
||||||
|
|
||||||
Calls: `api.tree.collapse_all(false)`
|
Calls: `api.tree.collapse_all({ keep_buffers = false })`
|
||||||
|
|
||||||
*:NvimTreeCollapseKeepBuffers*
|
*:NvimTreeCollapseKeepBuffers*
|
||||||
|
|
||||||
@@ -350,7 +350,7 @@ See |nvim-tree-highlight| for details.
|
|||||||
|
|
||||||
See |nvim-tree-api.tree.collapse_all()|
|
See |nvim-tree-api.tree.collapse_all()|
|
||||||
|
|
||||||
Calls: `api.tree.collapse_all(true)`
|
Calls: `api.tree.collapse_all({ keep_buffers = true })`
|
||||||
|
|
||||||
*:NvimTreeHiTest*
|
*:NvimTreeHiTest*
|
||||||
|
|
||||||
@@ -462,7 +462,10 @@ Following is the default configuration. See |nvim-tree-opts| for details. >lua
|
|||||||
hidden_placement = "after",
|
hidden_placement = "after",
|
||||||
diagnostics_placement = "signcolumn",
|
diagnostics_placement = "signcolumn",
|
||||||
bookmarks_placement = "signcolumn",
|
bookmarks_placement = "signcolumn",
|
||||||
padding = " ",
|
padding = {
|
||||||
|
icon = " ",
|
||||||
|
folder_arrow = " ",
|
||||||
|
},
|
||||||
symlink_arrow = " ➛ ",
|
symlink_arrow = " ➛ ",
|
||||||
show = {
|
show = {
|
||||||
file = true,
|
file = true,
|
||||||
@@ -1065,10 +1068,14 @@ Configuration options for icons.
|
|||||||
Bookmark icon placement.
|
Bookmark icon placement.
|
||||||
Type: `string`, Default: `signcolumn`
|
Type: `string`, Default: `signcolumn`
|
||||||
|
|
||||||
*nvim-tree.renderer.icons.padding*
|
*nvim-tree.renderer.icons.padding.icon*
|
||||||
Inserted between icon and filename.
|
Inserted between icon and filename.
|
||||||
Type: `string`, Default: `" "`
|
Type: `string`, Default: `" "`
|
||||||
|
|
||||||
|
*nvim-tree.renderer.icons.padding.folder_arrow*
|
||||||
|
Inserted between folder arrow icon and file/folder icon.
|
||||||
|
Type: `string`, Default: `" "`
|
||||||
|
|
||||||
*nvim-tree.renderer.icons.symlink_arrow*
|
*nvim-tree.renderer.icons.symlink_arrow*
|
||||||
Used as a separator between symlinks' source and target.
|
Used as a separator between symlinks' source and target.
|
||||||
Type: `string`, Default: `" ➛ "`
|
Type: `string`, Default: `" ➛ "`
|
||||||
@@ -1463,7 +1470,8 @@ vim |current-directory| behaviour.
|
|||||||
Type: `boolean`, Default: `false`
|
Type: `boolean`, Default: `false`
|
||||||
|
|
||||||
*nvim-tree.actions.expand_all*
|
*nvim-tree.actions.expand_all*
|
||||||
Configuration for expand_all behaviour.
|
Configuration for |nvim-tree-api.tree.expand_all()| and
|
||||||
|
|nvim-tree-api.node.expand()|
|
||||||
|
|
||||||
*nvim-tree.actions.expand_all.max_folder_discovery*
|
*nvim-tree.actions.expand_all.max_folder_discovery*
|
||||||
Limit the number of folders being explored when expanding every folders.
|
Limit the number of folders being explored when expanding every folders.
|
||||||
@@ -1516,7 +1524,8 @@ Configuration options for opening a file from nvim-tree.
|
|||||||
|
|
||||||
*nvim-tree.actions.open_file.window_picker.enable*
|
*nvim-tree.actions.open_file.window_picker.enable*
|
||||||
Enable the feature. If the feature is not enabled, files will open in
|
Enable the feature. If the feature is not enabled, files will open in
|
||||||
window from which you last opened the tree.
|
window from which you last opened the tree, obeying
|
||||||
|
|nvim-tree.actions.open_file.window_picker.exclude|
|
||||||
Type: `boolean`, Default: `true`
|
Type: `boolean`, Default: `true`
|
||||||
|
|
||||||
*nvim-tree.actions.open_file.window_picker.picker*
|
*nvim-tree.actions.open_file.window_picker.picker*
|
||||||
@@ -1535,9 +1544,10 @@ Configuration options for opening a file from nvim-tree.
|
|||||||
Type: `string`, Default: `"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"`
|
Type: `string`, Default: `"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"`
|
||||||
|
|
||||||
*nvim-tree.actions.open_file.window_picker.exclude*
|
*nvim-tree.actions.open_file.window_picker.exclude*
|
||||||
Table of buffer option names mapped to a list of option values that
|
Table of buffer option names mapped to a list of option values.
|
||||||
indicates to the picker that the buffer's window should not be
|
Windows containing matching buffers will not be:
|
||||||
selectable.
|
- available when using a window picker
|
||||||
|
- selected when not using a window picker
|
||||||
Type: `table`, Default: >lua
|
Type: `table`, Default: >lua
|
||||||
{
|
{
|
||||||
filetype = {
|
filetype = {
|
||||||
@@ -1822,10 +1832,13 @@ tree.find_file({opts}) *nvim-tree-api.tree.find_file()*
|
|||||||
tree.search_node() *nvim-tree-api.tree.search_node()*
|
tree.search_node() *nvim-tree-api.tree.search_node()*
|
||||||
Open the search dialogue as per the search_node action.
|
Open the search dialogue as per the search_node action.
|
||||||
|
|
||||||
tree.collapse_all({keep_buffers}) *nvim-tree-api.tree.collapse_all()*
|
tree.collapse_all({opts}) *nvim-tree-api.tree.collapse_all()*
|
||||||
Collapse the tree.
|
Collapse the tree.
|
||||||
|
|
||||||
Parameters: ~
|
Parameters: ~
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
|
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
|
||||||
|
|
||||||
tree.expand_all({node}) *nvim-tree-api.tree.expand_all()*
|
tree.expand_all({node}) *nvim-tree-api.tree.expand_all()*
|
||||||
@@ -2007,43 +2020,99 @@ fs.print_clipboard() *nvim-tree-api.fs.print_clipboard()*
|
|||||||
Parameters: ~
|
Parameters: ~
|
||||||
• {node} (Node|nil) file or folder
|
• {node} (Node|nil) file or folder
|
||||||
|
|
||||||
node.open.edit({node}) *nvim-tree-api.node.open.edit()*
|
node.open.edit({node}, {opts}) *nvim-tree-api.node.open.edit()*
|
||||||
File: open as per |nvim-tree.actions.open_file|
|
File: open as per |nvim-tree.actions.open_file|
|
||||||
Folder: expand or collapse
|
Folder: expand or collapse
|
||||||
Root: change directory up
|
Root: change directory up
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.replace_tree_buffer()*
|
*nvim-tree-api.node.open.replace_tree_buffer()*
|
||||||
node.open.replace_tree_buffer({node})
|
node.open.replace_tree_buffer({node})
|
||||||
|nvim-tree-api.node.edit()|, file will be opened in place: in the
|
|nvim-tree-api.node.edit()|, file will be opened in place: in the
|
||||||
nvim-tree window.
|
nvim-tree window.
|
||||||
|
|
||||||
*nvim-tree-api.node.open.no_window_picker()*
|
*nvim-tree-api.node.open.no_window_picker()*
|
||||||
node.open.no_window_picker({node})
|
node.open.no_window_picker({node}, {opts})
|
||||||
|nvim-tree-api.node.edit()|, window picker will never be used as per
|
|nvim-tree-api.node.edit()|, window picker will never be used as per
|
||||||
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
||||||
|
|
||||||
node.open.vertical({node}) *nvim-tree-api.node.open.vertical()*
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
|
node.open.vertical({node}, {opts}) *nvim-tree-api.node.open.vertical()*
|
||||||
|nvim-tree-api.node.edit()|, file will be opened in a new vertical split.
|
|nvim-tree-api.node.edit()|, file will be opened in a new vertical split.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.vertical_no_picker()*
|
*nvim-tree-api.node.open.vertical_no_picker()*
|
||||||
node.open.vertical_no_picker({node})
|
node.open.vertical_no_picker({node}, {opts})
|
||||||
|nvim-tree-api.node.vertical()|, window picker will never be used as per
|
|nvim-tree-api.node.vertical()|, window picker will never be used as per
|
||||||
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
||||||
|
|
||||||
node.open.horizontal({node}) *nvim-tree-api.node.open.horizontal()*
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
|
node.open.horizontal({node}, {opts}) *nvim-tree-api.node.open.horizontal()*
|
||||||
|nvim-tree-api.node.edit()|, file will be opened in a new horizontal split.
|
|nvim-tree-api.node.edit()|, file will be opened in a new horizontal split.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.horizontal_no_picker()*
|
*nvim-tree-api.node.open.horizontal_no_picker()*
|
||||||
node.open.horizontal_no_picker({node})
|
node.open.horizontal_no_picker({node}, {opts})
|
||||||
|nvim-tree-api.node.horizontal()|, window picker will never be used as per
|
|nvim-tree-api.node.horizontal()|, window picker will never be used as per
|
||||||
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.toggle_group_empty()*
|
*nvim-tree-api.node.open.toggle_group_empty()*
|
||||||
node.open.toggle_group_empty({node})
|
node.open.toggle_group_empty({node}, {opts})
|
||||||
Toggle |nvim-tree.renderer.group_empty| for a specific folder.
|
Toggle |nvim-tree.renderer.group_empty| for a specific folder.
|
||||||
Does nothing on files.
|
Does nothing on files.
|
||||||
Needs |nvim-tree.renderer.group_empty| set.
|
Needs |nvim-tree.renderer.group_empty| set.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
node.open.drop({node}) *nvim-tree-api.node.open.drop()*
|
node.open.drop({node}) *nvim-tree-api.node.open.drop()*
|
||||||
Switch to window with selected file if it exists.
|
Switch to window with selected file if it exists.
|
||||||
Open file otherwise.
|
Open file otherwise.
|
||||||
@@ -2053,9 +2122,17 @@ node.open.drop({node}) *nvim-tree-api.node.open.drop()*
|
|||||||
Folder: expand or collapse
|
Folder: expand or collapse
|
||||||
Root: change directory up
|
Root: change directory up
|
||||||
|
|
||||||
node.open.tab({node}) *nvim-tree-api.node.open.tab()*
|
node.open.tab({node}, {opts}) *nvim-tree-api.node.open.tab()*
|
||||||
|nvim-tree-api.node.edit()|, file will be opened in a new tab.
|
|nvim-tree-api.node.edit()|, file will be opened in a new tab.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.tab_drop()*
|
*nvim-tree-api.node.open.tab_drop()*
|
||||||
node.open.tab_drop({node})
|
node.open.tab_drop({node})
|
||||||
Switch to tab containing window with selected file if it exists.
|
Switch to tab containing window with selected file if it exists.
|
||||||
@@ -2065,15 +2142,31 @@ node.open.tab_drop({node})
|
|||||||
Folder: expand or collapse
|
Folder: expand or collapse
|
||||||
Root: change directory up
|
Root: change directory up
|
||||||
|
|
||||||
node.open.preview({node}) *nvim-tree-api.node.open.preview()*
|
node.open.preview({node}, {opts}) *nvim-tree-api.node.open.preview()*
|
||||||
|nvim-tree-api.node.edit()|, file buffer will have |bufhidden| set to `delete`.
|
|nvim-tree-api.node.edit()|, file buffer will have |bufhidden| set to `delete`.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
*nvim-tree-api.node.open.preview_no_picker()*
|
*nvim-tree-api.node.open.preview_no_picker()*
|
||||||
node.open.preview_no_picker({node})
|
node.open.preview_no_picker({node}, {opts})
|
||||||
|nvim-tree-api.node.edit()|, file buffer will have |bufhidden| set to `delete`.
|
|nvim-tree-api.node.edit()|, file buffer will have |bufhidden| set to `delete`.
|
||||||
window picker will never be used as per
|
window picker will never be used as per
|
||||||
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
|nvim-tree.actions.open_file.window_picker.enable| `false`
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {quit_on_open} (boolean) quits the tree when opening the file
|
||||||
|
• {focus} (boolean) keep focus in the tree when opening the file
|
||||||
|
|
||||||
node.navigate.git.next({node}) *nvim-tree-api.node.navigate.git.next()*
|
node.navigate.git.next({node}) *nvim-tree-api.node.navigate.git.next()*
|
||||||
Navigate to the next item showing git status.
|
Navigate to the next item showing git status.
|
||||||
|
|
||||||
@@ -2186,6 +2279,23 @@ node.buffer.wipe({node}, {opts}) *nvim-tree-api.node.buffer.wipe()*
|
|||||||
Options: ~
|
Options: ~
|
||||||
• {force} (boolean) wipe even if buffer is modified, default false
|
• {force} (boolean) wipe even if buffer is modified, default false
|
||||||
|
|
||||||
|
node.expand({node}) *nvim-tree-api.node.expand()*
|
||||||
|
Recursively expand all nodes under a directory or a file's parent
|
||||||
|
directory.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
|
||||||
|
node.collapse({node}, {opts}) *nvim-tree-api.node.collapse()*
|
||||||
|
Collapse the tree under a directory or a file's parent directory.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {node} (Node|nil) file or folder
|
||||||
|
• {opts} (table) optional parameters
|
||||||
|
|
||||||
|
Options: ~
|
||||||
|
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
6.4 API GIT *nvim-tree-api.git*
|
6.4 API GIT *nvim-tree-api.git*
|
||||||
|
|
||||||
@@ -2440,7 +2550,7 @@ You are encouraged to copy these to your own |nvim-tree.on_attach| function. >lu
|
|||||||
vim.keymap.set("n", "S", api.tree.search_node, opts("Search"))
|
vim.keymap.set("n", "S", api.tree.search_node, opts("Search"))
|
||||||
vim.keymap.set("n", "u", api.fs.rename_full, opts("Rename: Full Path"))
|
vim.keymap.set("n", "u", api.fs.rename_full, opts("Rename: Full Path"))
|
||||||
vim.keymap.set("n", "U", api.tree.toggle_custom_filter, opts("Toggle Filter: Hidden"))
|
vim.keymap.set("n", "U", api.tree.toggle_custom_filter, opts("Toggle Filter: Hidden"))
|
||||||
vim.keymap.set("n", "W", api.tree.collapse_all, opts("Collapse"))
|
vim.keymap.set("n", "W", api.tree.collapse_all, opts("Collapse All"))
|
||||||
vim.keymap.set("n", "x", api.fs.cut, opts("Cut"))
|
vim.keymap.set("n", "x", api.fs.cut, opts("Cut"))
|
||||||
vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name"))
|
vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name"))
|
||||||
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
||||||
@@ -2689,13 +2799,21 @@ e.g. handler for node renamed: >lua
|
|||||||
|nvim_tree_events_kind|
|
|nvim_tree_events_kind|
|
||||||
|
|
||||||
- Event.Ready
|
- Event.Ready
|
||||||
When NvimTree has been initialized
|
When NvimTree has been initialized.
|
||||||
|
• Note: Handler takes no parameter.
|
||||||
|
|
||||||
|
- Event.TreePreOpen
|
||||||
|
Invoked before the window and buffer for NvimTree are created
|
||||||
|
or opened. Before |Event.TreeOpen| event.
|
||||||
• Note: Handler takes no parameter.
|
• Note: Handler takes no parameter.
|
||||||
|
|
||||||
- Event.TreeOpen
|
- Event.TreeOpen
|
||||||
|
Invoked after the NvimTree is opened.
|
||||||
• Note: Handler takes no parameter.
|
• Note: Handler takes no parameter.
|
||||||
|
|
||||||
- Event.TreeClose
|
- Event.TreeClose
|
||||||
|
Invoked after the NvimTree is closed, but before the window is
|
||||||
|
closed. Dispatched on |WinClosed| event for NvimTree window.
|
||||||
• Note: Handler takes no parameter.
|
• Note: Handler takes no parameter.
|
||||||
|
|
||||||
- Event.Resize - When NvimTree is resized.
|
- Event.Resize - When NvimTree is resized.
|
||||||
@@ -2939,6 +3057,7 @@ needed.
|
|||||||
`sort_by` |nvim-tree.sort.sorter|
|
`sort_by` |nvim-tree.sort.sorter|
|
||||||
`git.ignore` |nvim-tree.filters.git_ignored|
|
`git.ignore` |nvim-tree.filters.git_ignored|
|
||||||
`renderer.icons.webdev_colors` |nvim-tree.renderer.icons.web_devicons.file.color|
|
`renderer.icons.webdev_colors` |nvim-tree.renderer.icons.web_devicons.file.color|
|
||||||
|
`renderer.icons.padding` |nvim-tree.renderer.icons.padding.icon|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
14.2 LEGACY: HIGHLIGHT *nvim-tree-legacy-highlight*
|
14.2 LEGACY: HIGHLIGHT *nvim-tree-legacy-highlight*
|
||||||
@@ -3095,7 +3214,8 @@ highlight group is not, hard linking as follows: >
|
|||||||
|nvim-tree.renderer.icons.glyphs.symlink|
|
|nvim-tree.renderer.icons.glyphs.symlink|
|
||||||
|nvim-tree.renderer.icons.hidden_placement|
|
|nvim-tree.renderer.icons.hidden_placement|
|
||||||
|nvim-tree.renderer.icons.modified_placement|
|
|nvim-tree.renderer.icons.modified_placement|
|
||||||
|nvim-tree.renderer.icons.padding|
|
|nvim-tree.renderer.icons.padding.folder_arrow|
|
||||||
|
|nvim-tree.renderer.icons.padding.icon|
|
||||||
|nvim-tree.renderer.icons.show|
|
|nvim-tree.renderer.icons.show|
|
||||||
|nvim-tree.renderer.icons.show.bookmarks|
|
|nvim-tree.renderer.icons.show.bookmarks|
|
||||||
|nvim-tree.renderer.icons.show.diagnostics|
|
|nvim-tree.renderer.icons.show.diagnostics|
|
||||||
@@ -3202,6 +3322,8 @@ highlight group is not, hard linking as follows: >
|
|||||||
|nvim-tree-api.marks.toggle()|
|
|nvim-tree-api.marks.toggle()|
|
||||||
|nvim-tree-api.node.buffer.delete()|
|
|nvim-tree-api.node.buffer.delete()|
|
||||||
|nvim-tree-api.node.buffer.wipe()|
|
|nvim-tree-api.node.buffer.wipe()|
|
||||||
|
|nvim-tree-api.node.collapse()|
|
||||||
|
|nvim-tree-api.node.expand()|
|
||||||
|nvim-tree-api.node.navigate.diagnostics.next()|
|
|nvim-tree-api.node.navigate.diagnostics.next()|
|
||||||
|nvim-tree-api.node.navigate.diagnostics.next_recursive()|
|
|nvim-tree-api.node.navigate.diagnostics.next_recursive()|
|
||||||
|nvim-tree-api.node.navigate.diagnostics.prev()|
|
|nvim-tree-api.node.navigate.diagnostics.prev()|
|
||||||
|
|||||||
@@ -236,6 +236,20 @@ local function setup_autocommands(opts)
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Handles event dispatch when tree is closed by `:q`
|
||||||
|
create_nvim_tree_autocmd("WinClosed", {
|
||||||
|
pattern = "*",
|
||||||
|
---@param ev vim.api.keyset.create_autocmd.callback_args
|
||||||
|
callback = function(ev)
|
||||||
|
if not vim.api.nvim_buf_is_valid(ev.buf) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if vim.api.nvim_get_option_value("filetype", { buf = ev.buf }) == "NvimTree" then
|
||||||
|
require("nvim-tree.events")._dispatch_on_tree_close()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
|
local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
|
||||||
@@ -323,7 +337,10 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
|
|||||||
hidden_placement = "after",
|
hidden_placement = "after",
|
||||||
diagnostics_placement = "signcolumn",
|
diagnostics_placement = "signcolumn",
|
||||||
bookmarks_placement = "signcolumn",
|
bookmarks_placement = "signcolumn",
|
||||||
padding = " ",
|
padding = {
|
||||||
|
icon = " ",
|
||||||
|
folder_arrow = " ",
|
||||||
|
},
|
||||||
symlink_arrow = " ➛ ",
|
symlink_arrow = " ➛ ",
|
||||||
show = {
|
show = {
|
||||||
file = true,
|
file = true,
|
||||||
|
|||||||
@@ -43,17 +43,6 @@ local function usable_win_ids()
|
|||||||
end, win_ids)
|
end, win_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
---Find the first window in the tab that is not NvimTree.
|
|
||||||
---@return integer -1 if none available
|
|
||||||
local function first_win_id()
|
|
||||||
local selectable = usable_win_ids()
|
|
||||||
if #selectable > 0 then
|
|
||||||
return selectable[1]
|
|
||||||
else
|
|
||||||
return -1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
---Get user to pick a window in the tab that is not NvimTree.
|
---Get user to pick a window in the tab that is not NvimTree.
|
||||||
---@return integer|nil -- If a valid window was picked, return its id. If an
|
---@return integer|nil -- If a valid window was picked, return its id. If an
|
||||||
--- invalid window was picked / user canceled, return nil. If there are
|
--- invalid window was picked / user canceled, return nil. If there are
|
||||||
@@ -80,6 +69,14 @@ local function pick_win_id()
|
|||||||
local win_map = {}
|
local win_map = {}
|
||||||
local laststatus = vim.o.laststatus
|
local laststatus = vim.o.laststatus
|
||||||
vim.o.laststatus = 2
|
vim.o.laststatus = 2
|
||||||
|
local fillchars = vim.opt.fillchars:get()
|
||||||
|
local stl = fillchars.stl
|
||||||
|
local stlnc = fillchars.stlnc
|
||||||
|
fillchars.stl = nil
|
||||||
|
fillchars.stlnc = nil
|
||||||
|
vim.opt.fillchars = fillchars
|
||||||
|
fillchars.stl = stl
|
||||||
|
fillchars.stlnc = stlnc
|
||||||
|
|
||||||
local tabpage = vim.api.nvim_get_current_tabpage()
|
local tabpage = vim.api.nvim_get_current_tabpage()
|
||||||
local win_ids = vim.api.nvim_tabpage_list_wins(tabpage)
|
local win_ids = vim.api.nvim_tabpage_list_wins(tabpage)
|
||||||
@@ -179,6 +176,7 @@ local function pick_win_id()
|
|||||||
end
|
end
|
||||||
|
|
||||||
vim.o.laststatus = laststatus
|
vim.o.laststatus = laststatus
|
||||||
|
vim.opt.fillchars = fillchars
|
||||||
|
|
||||||
if not vim.tbl_contains(vim.split(M.window_picker.chars, ""), resp) then
|
if not vim.tbl_contains(vim.split(M.window_picker.chars, ""), resp) then
|
||||||
return
|
return
|
||||||
@@ -237,9 +235,14 @@ local function get_target_winid(mode)
|
|||||||
local target_winid
|
local target_winid
|
||||||
if not M.window_picker.enable or string.find(mode, "no_picker") then
|
if not M.window_picker.enable or string.find(mode, "no_picker") then
|
||||||
target_winid = lib.target_winid
|
target_winid = lib.target_winid
|
||||||
-- first available window
|
local usable_wins = usable_win_ids()
|
||||||
if not vim.tbl_contains(vim.api.nvim_tabpage_list_wins(0), target_winid) then
|
-- first available usable window
|
||||||
target_winid = first_win_id()
|
if not vim.tbl_contains(usable_wins, target_winid) then
|
||||||
|
if #usable_wins > 0 then
|
||||||
|
target_winid = usable_wins[1]
|
||||||
|
else
|
||||||
|
target_winid = -1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- pick a window
|
-- pick a window
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ local utils = require("nvim-tree.utils")
|
|||||||
local core = require("nvim-tree.core")
|
local core = require("nvim-tree.core")
|
||||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||||
|
|
||||||
|
local FileNode = require("nvim-tree.node.file")
|
||||||
local DirectoryNode = require("nvim-tree.node.directory")
|
local DirectoryNode = require("nvim-tree.node.directory")
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
@@ -23,26 +24,30 @@ local function buf_match()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param keep_buffers boolean
|
---Collapse a node, root if nil
|
||||||
function M.fn(keep_buffers)
|
---@param node Node?
|
||||||
|
---@param opts ApiCollapseOpts
|
||||||
|
local function collapse(node, opts)
|
||||||
local explorer = core.get_explorer()
|
local explorer = core.get_explorer()
|
||||||
if not explorer then
|
if not explorer then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local node = explorer:get_node_at_cursor()
|
node = node or explorer
|
||||||
if not node then
|
|
||||||
|
local node_at_cursor = explorer:get_node_at_cursor()
|
||||||
|
if not node_at_cursor then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local matches = buf_match()
|
local matches = buf_match()
|
||||||
|
|
||||||
Iterator.builder(explorer.nodes)
|
Iterator.builder({ node:is(FileNode) and node.parent or node:as(DirectoryNode) })
|
||||||
:hidden()
|
:hidden()
|
||||||
:applier(function(n)
|
:applier(function(n)
|
||||||
local dir = n:as(DirectoryNode)
|
local dir = n:as(DirectoryNode)
|
||||||
if dir then
|
if dir then
|
||||||
dir.open = keep_buffers and matches(dir.absolute_path)
|
dir.open = opts.keep_buffers == true and matches(dir.absolute_path)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
:recursor(function(n)
|
:recursor(function(n)
|
||||||
@@ -51,7 +56,26 @@ function M.fn(keep_buffers)
|
|||||||
:iterate()
|
:iterate()
|
||||||
|
|
||||||
explorer.renderer:draw()
|
explorer.renderer:draw()
|
||||||
utils.focus_node_or_parent(node)
|
utils.focus_node_or_parent(node_at_cursor)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
---@param opts ApiCollapseOpts|boolean|nil legacy -> opts.keep_buffers
|
||||||
|
function M.all(opts)
|
||||||
|
-- legacy arguments
|
||||||
|
if type(opts) == "boolean" then
|
||||||
|
opts = {
|
||||||
|
keep_buffers = opts,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
collapse(nil, opts or {})
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param node Node
|
||||||
|
---@param opts ApiCollapseOpts?
|
||||||
|
function M.node(node, opts)
|
||||||
|
collapse(node, opts or {})
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
@@ -2,6 +2,7 @@ local core = require("nvim-tree.core")
|
|||||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||||
local notify = require("nvim-tree.notify")
|
local notify = require("nvim-tree.notify")
|
||||||
|
|
||||||
|
local FileNode = require("nvim-tree.node.file")
|
||||||
local DirectoryNode = require("nvim-tree.node.directory")
|
local DirectoryNode = require("nvim-tree.node.directory")
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
@@ -70,23 +71,38 @@ local function gen_iterator()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---Expand the directory node or the root
|
---@param node Node?
|
||||||
---@param node Node
|
local function expand_node(node)
|
||||||
function M.fn(node)
|
if not node then
|
||||||
local explorer = core.get_explorer()
|
|
||||||
local parent = node:as(DirectoryNode) or explorer
|
|
||||||
if not parent then
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if gen_iterator()(parent) then
|
if gen_iterator()(node) then
|
||||||
notify.warn("expansion iteration was halted after " .. M.MAX_FOLDER_DISCOVERY .. " discovered folders")
|
notify.warn("expansion iteration was halted after " .. M.MAX_FOLDER_DISCOVERY .. " discovered folders")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local explorer = core.get_explorer()
|
||||||
if explorer then
|
if explorer then
|
||||||
explorer.renderer:draw()
|
explorer.renderer:draw()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---Expand the directory node or the root
|
||||||
|
---@param node Node
|
||||||
|
function M.all(node)
|
||||||
|
expand_node(node and node:as(DirectoryNode) or core.get_explorer())
|
||||||
|
end
|
||||||
|
|
||||||
|
---Expand the directory node or parent node
|
||||||
|
---@param node Node
|
||||||
|
function M.node(node)
|
||||||
|
if not node then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
expand_node(node:is(FileNode) and node.parent or node:as(DirectoryNode))
|
||||||
|
end
|
||||||
|
|
||||||
function M.setup(opts)
|
function M.setup(opts)
|
||||||
M.MAX_FOLDER_DISCOVERY = opts.actions.expand_all.max_folder_discovery
|
M.MAX_FOLDER_DISCOVERY = opts.actions.expand_all.max_folder_discovery
|
||||||
M.EXCLUDE = to_lookup_table(opts.actions.expand_all.exclude)
|
M.EXCLUDE = to_lookup_table(opts.actions.expand_all.exclude)
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
M.collapse_all = require("nvim-tree.actions.tree.modifiers.collapse-all")
|
M.collapse = require("nvim-tree.actions.tree.modifiers.collapse")
|
||||||
M.expand_all = require("nvim-tree.actions.tree.modifiers.expand-all")
|
M.expand = require("nvim-tree.actions.tree.modifiers.expand")
|
||||||
|
|
||||||
function M.setup(opts)
|
function M.setup(opts)
|
||||||
M.expand_all.setup(opts)
|
M.expand.setup(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|||||||
@@ -182,8 +182,12 @@ Api.tree.get_nodes = wrap_explorer("get_nodes")
|
|||||||
|
|
||||||
Api.tree.find_file = wrap(actions.tree.find_file.fn)
|
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.expand_all = wrap_node(actions.tree.modifiers.expand_all.fn)
|
---@class ApiCollapseOpts
|
||||||
|
---@field keep_buffers boolean|nil default false
|
||||||
|
|
||||||
|
Api.tree.collapse_all = wrap(actions.tree.modifiers.collapse.all)
|
||||||
|
Api.tree.expand_all = wrap_node(actions.tree.modifiers.expand.all)
|
||||||
Api.tree.toggle_enable_filters = wrap_explorer_member("filters", "toggle")
|
Api.tree.toggle_enable_filters = wrap_explorer_member("filters", "toggle")
|
||||||
Api.tree.toggle_gitignore_filter = wrap_explorer_member_args("filters", "toggle", "git_ignored")
|
Api.tree.toggle_gitignore_filter = wrap_explorer_member_args("filters", "toggle", "git_ignored")
|
||||||
Api.tree.toggle_git_clean_filter = wrap_explorer_member_args("filters", "toggle", "git_clean")
|
Api.tree.toggle_git_clean_filter = wrap_explorer_member_args("filters", "toggle", "git_clean")
|
||||||
@@ -222,21 +226,46 @@ Api.fs.copy.absolute_path = wrap_node(wrap_explorer_member("clipboard", "copy_ab
|
|||||||
Api.fs.copy.filename = wrap_node(wrap_explorer_member("clipboard", "copy_filename"))
|
Api.fs.copy.filename = wrap_node(wrap_explorer_member("clipboard", "copy_filename"))
|
||||||
Api.fs.copy.basename = wrap_node(wrap_explorer_member("clipboard", "copy_basename"))
|
Api.fs.copy.basename = wrap_node(wrap_explorer_member("clipboard", "copy_basename"))
|
||||||
Api.fs.copy.relative_path = wrap_node(wrap_explorer_member("clipboard", "copy_path"))
|
Api.fs.copy.relative_path = wrap_node(wrap_explorer_member("clipboard", "copy_path"))
|
||||||
|
---
|
||||||
|
---@class NodeEditOpts
|
||||||
|
---@field quit_on_open boolean|nil default false
|
||||||
|
---@field focus boolean|nil default true
|
||||||
|
|
||||||
---@param mode string
|
---@param mode string
|
||||||
---@param node Node
|
---@param node Node
|
||||||
local function edit(mode, node)
|
---@param edit_opts NodeEditOpts?
|
||||||
|
local function edit(mode, node, edit_opts)
|
||||||
local file_link = node:as(FileLinkNode)
|
local file_link = node:as(FileLinkNode)
|
||||||
local path = file_link and file_link.link_to or node.absolute_path
|
local path = file_link and file_link.link_to or node.absolute_path
|
||||||
|
local cur_tabpage = vim.api.nvim_get_current_tabpage()
|
||||||
|
|
||||||
actions.node.open_file.fn(mode, path)
|
actions.node.open_file.fn(mode, path)
|
||||||
|
|
||||||
|
edit_opts = edit_opts or {}
|
||||||
|
|
||||||
|
local mode_unsupported_quit_on_open = mode == "drop" or mode == "tab_drop" or mode == "edit_in_place"
|
||||||
|
if not mode_unsupported_quit_on_open and edit_opts.quit_on_open then
|
||||||
|
view.close(cur_tabpage)
|
||||||
|
end
|
||||||
|
|
||||||
|
local mode_unsupported_focus = mode == "drop" or mode == "tab_drop" or mode == "edit_in_place"
|
||||||
|
local focus = edit_opts.focus == nil or edit_opts.focus == true
|
||||||
|
if not mode_unsupported_focus and not focus then
|
||||||
|
-- if mode == "tabnew" a new tab will be opened and we need to focus back to the previous tab
|
||||||
|
if mode == "tabnew" then
|
||||||
|
vim.cmd(":tabprev")
|
||||||
|
end
|
||||||
|
view.focus()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param mode string
|
---@param mode string
|
||||||
---@param toggle_group boolean?
|
---@param toggle_group boolean?
|
||||||
---@return fun(node: Node)
|
---@return fun(node: Node, edit_opts: NodeEditOpts?)
|
||||||
local function open_or_expand_or_dir_up(mode, toggle_group)
|
local function open_or_expand_or_dir_up(mode, toggle_group)
|
||||||
---@param node Node
|
---@param node Node
|
||||||
return function(node)
|
---@param edit_opts NodeEditOpts?
|
||||||
|
return function(node, edit_opts)
|
||||||
local root = node:as(RootNode)
|
local root = node:as(RootNode)
|
||||||
local dir = node:as(DirectoryNode)
|
local dir = node:as(DirectoryNode)
|
||||||
|
|
||||||
@@ -245,7 +274,7 @@ local function open_or_expand_or_dir_up(mode, toggle_group)
|
|||||||
elseif dir then
|
elseif dir then
|
||||||
dir:expand_or_collapse(toggle_group)
|
dir:expand_or_collapse(toggle_group)
|
||||||
elseif not toggle_group then
|
elseif not toggle_group then
|
||||||
edit(mode, node)
|
edit(mode, node, edit_opts)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -287,6 +316,9 @@ Api.node.navigate.diagnostics.prev_recursive = wrap_node(actions.moves.item.fn({
|
|||||||
Api.node.navigate.opened.next = wrap_node(actions.moves.item.fn({ where = "next", what = "opened" }))
|
Api.node.navigate.opened.next = wrap_node(actions.moves.item.fn({ where = "next", what = "opened" }))
|
||||||
Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev", what = "opened" }))
|
Api.node.navigate.opened.prev = wrap_node(actions.moves.item.fn({ where = "prev", what = "opened" }))
|
||||||
|
|
||||||
|
Api.node.expand = wrap_node(actions.tree.modifiers.expand.node)
|
||||||
|
Api.node.collapse = wrap_node(actions.tree.modifiers.collapse.node)
|
||||||
|
|
||||||
---@class ApiNodeDeleteWipeBufferOpts
|
---@class ApiNodeDeleteWipeBufferOpts
|
||||||
---@field force boolean|nil default false
|
---@field force boolean|nil default false
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ function HighlightDisplay:render(bufnr, fmt, l)
|
|||||||
|
|
||||||
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { text })
|
vim.api.nvim_buf_set_lines(bufnr, l, -1, true, { text })
|
||||||
|
|
||||||
if vim.fn.has("nvim-0.11") == 1 then
|
if vim.fn.has("nvim-0.11") == 1 and vim.hl and vim.hl.range then
|
||||||
vim.hl.range(bufnr, namespace_hi_test_id, self.group, { l, 0 }, { l, #self.group, }, {})
|
vim.hl.range(bufnr, namespace_hi_test_id, self.group, { l, 0 }, { l, #self.group, }, {})
|
||||||
else
|
else
|
||||||
vim.api.nvim_buf_add_highlight(bufnr, -1, self.group, l, 0, #self.group) ---@diagnostic disable-line: deprecated
|
vim.api.nvim_buf_add_highlight(bufnr, -1, self.group, l, 0, #self.group) ---@diagnostic disable-line: deprecated
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ M.Event = {
|
|||||||
Ready = "Ready",
|
Ready = "Ready",
|
||||||
WillRenameNode = "WillRenameNode",
|
WillRenameNode = "WillRenameNode",
|
||||||
NodeRenamed = "NodeRenamed",
|
NodeRenamed = "NodeRenamed",
|
||||||
|
TreePreOpen = "TreePreOpen",
|
||||||
TreeOpen = "TreeOpen",
|
TreeOpen = "TreeOpen",
|
||||||
TreeClose = "TreeClose",
|
TreeClose = "TreeClose",
|
||||||
WillCreateFile = "WillCreateFile",
|
WillCreateFile = "WillCreateFile",
|
||||||
@@ -91,6 +92,11 @@ function M._dispatch_folder_removed(folder_name)
|
|||||||
dispatch(M.Event.FolderRemoved, { folder_name = folder_name })
|
dispatch(M.Event.FolderRemoved, { folder_name = folder_name })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--@private
|
||||||
|
function M._dispatch_on_tree_pre_open()
|
||||||
|
dispatch(M.Event.TreePreOpen, nil)
|
||||||
|
end
|
||||||
|
|
||||||
--@private
|
--@private
|
||||||
function M._dispatch_on_tree_open()
|
function M._dispatch_on_tree_open()
|
||||||
dispatch(M.Event.TreeOpen, nil)
|
dispatch(M.Event.TreeOpen, nil)
|
||||||
|
|||||||
@@ -101,10 +101,19 @@ function Explorer:create_autocmds()
|
|||||||
vim.api.nvim_create_autocmd("BufReadPost", {
|
vim.api.nvim_create_autocmd("BufReadPost", {
|
||||||
group = self.augroup_id,
|
group = self.augroup_id,
|
||||||
callback = function(data)
|
callback = function(data)
|
||||||
if (self.filters.state.no_buffer or self.opts.highlight_opened_files ~= "none") and vim.bo[data.buf].buftype == "" then
|
-- only handle normal files
|
||||||
|
if vim.bo[data.buf].buftype ~= "" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.filters.state.no_buffer then
|
||||||
|
-- full reload is required to update the filter state
|
||||||
utils.debounce("Buf:filter_buffer_" .. self.uid_explorer, self.opts.view.debounce_delay, function()
|
utils.debounce("Buf:filter_buffer_" .. self.uid_explorer, self.opts.view.debounce_delay, function()
|
||||||
self:reload_explorer()
|
self:reload_explorer()
|
||||||
end)
|
end)
|
||||||
|
elseif self.opts.renderer.highlight_opened_files ~= "none" then
|
||||||
|
-- draw to update opened highlight
|
||||||
|
self.renderer:draw()
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@@ -113,10 +122,21 @@ function Explorer:create_autocmds()
|
|||||||
vim.api.nvim_create_autocmd("BufUnload", {
|
vim.api.nvim_create_autocmd("BufUnload", {
|
||||||
group = self.augroup_id,
|
group = self.augroup_id,
|
||||||
callback = function(data)
|
callback = function(data)
|
||||||
if (self.filters.state.no_buffer or self.opts.highlight_opened_files ~= "none") and vim.bo[data.buf].buftype == "" then
|
-- only handle normal files
|
||||||
|
if vim.bo[data.buf].buftype ~= "" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.filters.state.no_buffer then
|
||||||
|
-- full reload is required to update the filter state
|
||||||
utils.debounce("Buf:filter_buffer_" .. self.uid_explorer, self.opts.view.debounce_delay, function()
|
utils.debounce("Buf:filter_buffer_" .. self.uid_explorer, self.opts.view.debounce_delay, function()
|
||||||
self:reload_explorer()
|
self:reload_explorer()
|
||||||
end)
|
end)
|
||||||
|
elseif self.opts.renderer.highlight_opened_files ~= "none" then
|
||||||
|
-- draw to update opened highlight; must be delayed as the buffer is still loaded during BufUnload
|
||||||
|
vim.schedule(function()
|
||||||
|
self.renderer:draw()
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@@ -214,8 +234,9 @@ function Explorer:reload(node, project)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local abs = utils.path_join({ cwd, name })
|
local abs = utils.path_join({ cwd, name })
|
||||||
---@type uv.fs_stat.result|nil
|
|
||||||
local stat = vim.loop.fs_lstat(abs)
|
-- path incorrectly specified as an integer
|
||||||
|
local stat = vim.loop.fs_lstat(abs) ---@diagnostic disable-line param-type-mismatch
|
||||||
|
|
||||||
local filter_reason = self.filters:should_filter_as_reason(abs, stat, filter_status)
|
local filter_reason = self.filters:should_filter_as_reason(abs, stat, filter_status)
|
||||||
if filter_reason == FILTER_REASON.none then
|
if filter_reason == FILTER_REASON.none then
|
||||||
@@ -373,8 +394,9 @@ function Explorer:populate_children(handle, cwd, node, project, parent)
|
|||||||
if Watcher.is_fs_event_capable(abs) then
|
if Watcher.is_fs_event_capable(abs) then
|
||||||
local profile = log.profile_start("populate_children %s", abs)
|
local profile = log.profile_start("populate_children %s", abs)
|
||||||
|
|
||||||
---@type uv.fs_stat.result|nil
|
-- path incorrectly specified as an integer
|
||||||
local stat = vim.loop.fs_lstat(abs)
|
local stat = vim.loop.fs_lstat(abs) ---@diagnostic disable-line param-type-mismatch
|
||||||
|
|
||||||
local filter_reason = parent.filters:should_filter_as_reason(abs, stat, filter_status)
|
local filter_reason = parent.filters:should_filter_as_reason(abs, stat, filter_status)
|
||||||
if filter_reason == FILTER_REASON.none and not nodes_by_path[abs] then
|
if filter_reason == FILTER_REASON.none and not nodes_by_path[abs] then
|
||||||
local child = node_factory.create({
|
local child = node_factory.create({
|
||||||
@@ -389,9 +411,9 @@ function Explorer:populate_children(handle, cwd, node, project, parent)
|
|||||||
nodes_by_path[child.absolute_path] = true
|
nodes_by_path[child.absolute_path] = true
|
||||||
child:update_git_status(node_ignored, project)
|
child:update_git_status(node_ignored, project)
|
||||||
end
|
end
|
||||||
else
|
elseif node.hidden_stats then
|
||||||
for reason, value in pairs(FILTER_REASON) do
|
for reason, value in pairs(FILTER_REASON) do
|
||||||
if filter_reason == value then
|
if filter_reason == value and type(node.hidden_stats[reason]) == "number" then
|
||||||
node.hidden_stats[reason] = node.hidden_stats[reason] + 1
|
node.hidden_stats[reason] = node.hidden_stats[reason] + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ local function open()
|
|||||||
|
|
||||||
-- highlight it
|
-- highlight it
|
||||||
for _, args in ipairs(hl_range_args) do
|
for _, args in ipairs(hl_range_args) do
|
||||||
if vim.fn.has("nvim-0.11") == 1 then
|
if vim.fn.has("nvim-0.11") == 1 and vim.hl and vim.hl.range then
|
||||||
vim.hl.range(M.bufnr, namespace_help_id, args.higroup, args.start, args.finish, {})
|
vim.hl.range(M.bufnr, namespace_help_id, args.higroup, args.start, args.finish, {})
|
||||||
else
|
else
|
||||||
vim.api.nvim_buf_add_highlight(M.bufnr, -1, args.higroup, args.start[1], args.start[2], args.finish[2]) ---@diagnostic disable-line: deprecated
|
vim.api.nvim_buf_add_highlight(M.bufnr, -1, args.higroup, args.start[1], args.start[2], args.finish[2]) ---@diagnostic disable-line: deprecated
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ function M.default_on_attach(bufnr)
|
|||||||
vim.keymap.set("n", "S", api.tree.search_node, opts("Search"))
|
vim.keymap.set("n", "S", api.tree.search_node, opts("Search"))
|
||||||
vim.keymap.set("n", "u", api.fs.rename_full, opts("Rename: Full Path"))
|
vim.keymap.set("n", "u", api.fs.rename_full, opts("Rename: Full Path"))
|
||||||
vim.keymap.set("n", "U", api.tree.toggle_custom_filter, opts("Toggle Filter: Hidden"))
|
vim.keymap.set("n", "U", api.tree.toggle_custom_filter, opts("Toggle Filter: Hidden"))
|
||||||
vim.keymap.set("n", "W", api.tree.collapse_all, opts("Collapse"))
|
vim.keymap.set("n", "W", api.tree.collapse_all, opts("Collapse All"))
|
||||||
vim.keymap.set("n", "x", api.fs.cut, opts("Cut"))
|
vim.keymap.set("n", "x", api.fs.cut, opts("Cut"))
|
||||||
vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name"))
|
vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name"))
|
||||||
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
||||||
|
|||||||
@@ -60,6 +60,13 @@ local function refactored(opts)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
utils.move_missing_val(opts, "update_focused_file", "ignore_list", opts, "update_focused_file.update_root", "ignore_list", true)
|
utils.move_missing_val(opts, "update_focused_file", "ignore_list", opts, "update_focused_file.update_root", "ignore_list", true)
|
||||||
|
|
||||||
|
-- 2025/04/30
|
||||||
|
if opts.renderer and opts.renderer.icons and type(opts.renderer.icons.padding) == "string" then
|
||||||
|
local icons_padding = opts.renderer.icons.padding
|
||||||
|
opts.renderer.icons.padding = {}
|
||||||
|
opts.renderer.icons.padding.icon = icons_padding
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function deprecated(opts)
|
local function deprecated(opts)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
local view = require("nvim-tree.view")
|
local view = require("nvim-tree.view")
|
||||||
local core = require("nvim-tree.core")
|
local core = require("nvim-tree.core")
|
||||||
local events = require("nvim-tree.events")
|
|
||||||
local notify = require("nvim-tree.notify")
|
local notify = require("nvim-tree.notify")
|
||||||
|
|
||||||
---@class LibOpenOpts
|
---@class LibOpenOpts
|
||||||
@@ -130,7 +129,6 @@ function M.open(opts)
|
|||||||
open_view_and_draw()
|
open_view_and_draw()
|
||||||
end
|
end
|
||||||
view.restore_tab_state()
|
view.restore_tab_state()
|
||||||
events._dispatch_on_tree_open()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.setup(opts)
|
function M.setup(opts)
|
||||||
|
|||||||
@@ -135,12 +135,12 @@ end
|
|||||||
function Builder:format_line(indent_markers, arrows, icon, name, node)
|
function Builder:format_line(indent_markers, arrows, icon, name, node)
|
||||||
local added_len = 0
|
local added_len = 0
|
||||||
local function add_to_end(t1, t2)
|
local function add_to_end(t1, t2)
|
||||||
if not t2 then
|
if not t2 or vim.tbl_isempty(t2) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
for _, v in ipairs(t2) do
|
for _, v in ipairs(t2) do
|
||||||
if added_len > 0 then
|
if added_len > 0 then
|
||||||
table.insert(t1, { str = self.explorer.opts.renderer.icons.padding })
|
table.insert(t1, { str = self.explorer.opts.renderer.icons.padding.icon })
|
||||||
end
|
end
|
||||||
table.insert(t1, v)
|
table.insert(t1, v)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
local utils = require("nvim-tree.utils")
|
local utils = require("nvim-tree.utils")
|
||||||
|
local view = require("nvim-tree.view")
|
||||||
|
|
||||||
local function hide(win)
|
local function hide(win)
|
||||||
if win then
|
if win then
|
||||||
@@ -32,7 +33,7 @@ local function effective_win_width()
|
|||||||
return win_width - win_info[1].textoff
|
return win_width - win_info[1].textoff
|
||||||
end
|
end
|
||||||
|
|
||||||
local function show()
|
local function show(opts)
|
||||||
local line_nr = vim.api.nvim_win_get_cursor(0)[1]
|
local line_nr = vim.api.nvim_win_get_cursor(0)[1]
|
||||||
if vim.wo.wrap then
|
if vim.wo.wrap then
|
||||||
return
|
return
|
||||||
@@ -52,6 +53,11 @@ local function show()
|
|||||||
local text_width = vim.fn.strdisplaywidth(vim.fn.substitute(line, "[^[:print:]]*$", "", "g"))
|
local text_width = vim.fn.strdisplaywidth(vim.fn.substitute(line, "[^[:print:]]*$", "", "g"))
|
||||||
local win_width = effective_win_width()
|
local win_width = effective_win_width()
|
||||||
|
|
||||||
|
-- windows width reduced by right aligned icons
|
||||||
|
local icon_ns_id = vim.api.nvim_get_namespaces()["NvimTreeExtmarks"]
|
||||||
|
local icon_extmarks = vim.api.nvim_buf_get_extmarks(0, icon_ns_id, { line_nr - 1, 0 }, { line_nr - 1, -1 }, { details = true })
|
||||||
|
win_width = win_width - utils.extmarks_length(icon_extmarks)
|
||||||
|
|
||||||
if text_width < win_width then
|
if text_width < win_width then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -64,7 +70,9 @@ local function show()
|
|||||||
height = 1,
|
height = 1,
|
||||||
noautocmd = true,
|
noautocmd = true,
|
||||||
style = "minimal",
|
style = "minimal",
|
||||||
|
border = "none"
|
||||||
})
|
})
|
||||||
|
vim.wo[M.popup_win].winhl = view.View.winopts.winhl
|
||||||
|
|
||||||
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 = true })
|
local extmarks = vim.api.nvim_buf_get_extmarks(0, ns_id, { line_nr - 1, 0 }, { line_nr - 1, -1 }, { details = true })
|
||||||
@@ -80,14 +88,17 @@ local function show()
|
|||||||
local details = extmark[4]
|
local details = extmark[4]
|
||||||
|
|
||||||
if type(details) == "table" then
|
if type(details) == "table" then
|
||||||
if vim.fn.has("nvim-0.12") == 1 then
|
if vim.fn.has("nvim-0.11") == 1 and vim.hl and vim.hl.range then
|
||||||
vim.hl.range(0, ns_id, details.hl_group, { 0, col }, { 0, details.end_col, }, {})
|
vim.hl.range(0, ns_id, details.hl_group, { 0, col }, { 0, details.end_col, }, {})
|
||||||
else
|
else
|
||||||
vim.api.nvim_buf_add_highlight(0, ns_id, details.hl_group, 0, col, details.end_col) ---@diagnostic disable-line: deprecated
|
vim.api.nvim_buf_add_highlight(0, ns_id, details.hl_group, 0, col, details.end_col) ---@diagnostic disable-line: deprecated
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
vim.cmd([[ setlocal nowrap cursorline noswapfile nobuflisted buftype=nofile bufhidden=wipe ]])
|
vim.cmd([[ setlocal nowrap noswapfile nobuflisted buftype=nofile bufhidden=wipe ]])
|
||||||
|
if opts.view.cursorline then
|
||||||
|
vim.cmd([[ setlocal cursorline cursorlineopt=both ]])
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -113,7 +124,7 @@ M.setup = function(opts)
|
|||||||
pattern = { "NvimTree_*" },
|
pattern = { "NvimTree_*" },
|
||||||
callback = function()
|
callback = function()
|
||||||
if utils.is_nvim_tree_buf(0) then
|
if utils.is_nvim_tree_buf(0) then
|
||||||
show()
|
show(opts)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -95,15 +95,15 @@ function M.get_arrows(node)
|
|||||||
local dir = node:as(DirectoryNode)
|
local dir = node:as(DirectoryNode)
|
||||||
if dir then
|
if dir then
|
||||||
if dir.open then
|
if dir.open then
|
||||||
str = M.config.icons.glyphs.folder["arrow_open"] .. " "
|
str = M.config.icons.glyphs.folder["arrow_open"] .. M.config.icons.padding.folder_arrow
|
||||||
hl = "NvimTreeFolderArrowOpen"
|
hl = "NvimTreeFolderArrowOpen"
|
||||||
else
|
else
|
||||||
str = M.config.icons.glyphs.folder["arrow_closed"] .. " "
|
str = M.config.icons.glyphs.folder["arrow_closed"] .. M.config.icons.padding.folder_arrow
|
||||||
end
|
end
|
||||||
elseif M.config.indent_markers.enable then
|
elseif M.config.indent_markers.enable then
|
||||||
str = ""
|
str = ""
|
||||||
else
|
else
|
||||||
str = " "
|
str = " " .. string.rep(" ", #M.config.icons.padding.folder_arrow)
|
||||||
end
|
end
|
||||||
|
|
||||||
return { str = str, hl = { hl } }
|
return { str = str, hl = { hl } }
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ function GitDecorator:build_icons_by_status(glyphs)
|
|||||||
self.icons_by_status.ignored = { str = glyphs.ignored, hl = { "NvimTreeGitIgnoredIcon" }, ord = 7 }
|
self.icons_by_status.ignored = { str = glyphs.ignored, hl = { "NvimTreeGitIgnoredIcon" }, ord = 7 }
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param icons GitIconsByXY
|
---@param icons GitIconsByStatus
|
||||||
function GitDecorator:build_icons_by_xy(icons)
|
function GitDecorator:build_icons_by_xy(icons)
|
||||||
self.icons_by_xy = {
|
self.icons_by_xy = {
|
||||||
["M "] = { icons.staged },
|
["M "] = { icons.staged },
|
||||||
|
|||||||
@@ -112,9 +112,8 @@ function Decorator:define_sign(icon)
|
|||||||
vim.fn.sign_undefine(name)
|
vim.fn.sign_undefine(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- don't use sign if not defined
|
-- don't render sign if empty
|
||||||
if #icon.str < 1 then
|
if #icon.str < 1 then
|
||||||
self.icon_placement = "none"
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ function Renderer:render_hl(bufnr, hl_range_args)
|
|||||||
end
|
end
|
||||||
vim.api.nvim_buf_clear_namespace(bufnr, namespace_highlights_id, 0, -1)
|
vim.api.nvim_buf_clear_namespace(bufnr, namespace_highlights_id, 0, -1)
|
||||||
for _, args in ipairs(hl_range_args) do
|
for _, args in ipairs(hl_range_args) do
|
||||||
if vim.fn.has("nvim-0.11") == 1 then
|
if vim.fn.has("nvim-0.11") == 1 and vim.hl and vim.hl.range then
|
||||||
vim.hl.range(bufnr, namespace_highlights_id, args.higroup, args.start, args.finish, {})
|
vim.hl.range(bufnr, namespace_highlights_id, args.higroup, args.start, args.finish, {})
|
||||||
else
|
else
|
||||||
vim.api.nvim_buf_add_highlight(bufnr, namespace_highlights_id, args.higroup, args.start[1], args.start[2], args.finish[2]) ---@diagnostic disable-line: deprecated
|
vim.api.nvim_buf_add_highlight(bufnr, namespace_highlights_id, args.higroup, args.start[1], args.start[2], args.finish[2]) ---@diagnostic disable-line: deprecated
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||||
local notify = require("nvim-tree.notify")
|
|
||||||
|
|
||||||
local M = {
|
local M = {
|
||||||
debouncers = {},
|
debouncers = {},
|
||||||
@@ -11,10 +10,6 @@ M.is_wsl = vim.fn.has("wsl") == 1
|
|||||||
-- false for WSL
|
-- false for WSL
|
||||||
M.is_windows = vim.fn.has("win32") == 1 or vim.fn.has("win32unix") == 1
|
M.is_windows = vim.fn.has("win32") == 1 or vim.fn.has("win32unix") == 1
|
||||||
|
|
||||||
function M._is_windows()
|
|
||||||
return vim.fn.has("win32") == 1 or vim.fn.has("win32unix") == 1
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param haystack string
|
---@param haystack string
|
||||||
---@param needle string
|
---@param needle string
|
||||||
---@return boolean
|
---@return boolean
|
||||||
@@ -177,6 +172,21 @@ function M.find_node_line(node)
|
|||||||
return -1
|
return -1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param extmarks vim.api.keyset.get_extmark_item[] as per vim.api.nvim_buf_get_extmarks
|
||||||
|
---@return number
|
||||||
|
function M.extmarks_length(extmarks)
|
||||||
|
local length = 0
|
||||||
|
for _, extmark in ipairs(extmarks) do
|
||||||
|
local details = extmark[4]
|
||||||
|
if details and details.virt_text then
|
||||||
|
for _, text in ipairs(details.virt_text) do
|
||||||
|
length = length + vim.fn.strchars(text[1])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return length
|
||||||
|
end
|
||||||
|
|
||||||
-- get the node in the tree state depending on the absolute path of the node
|
-- get the node in the tree state depending on the absolute path of the node
|
||||||
-- (grouped or hidden too)
|
-- (grouped or hidden too)
|
||||||
---@param path string
|
---@param path string
|
||||||
@@ -293,17 +303,57 @@ function M.rename_loaded_buffers(old_path, new_path)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local is_windows_drive = function(path)
|
||||||
|
return (M.is_windows) and (path:match("^%a:\\$") ~= nil)
|
||||||
|
end
|
||||||
|
|
||||||
---@param path string path to file or directory
|
---@param path string path to file or directory
|
||||||
---@return boolean
|
---@return boolean
|
||||||
function M.file_exists(path)
|
function M.file_exists(path)
|
||||||
|
if not (M.is_windows or M.is_wsl) then
|
||||||
local _, error = vim.loop.fs_stat(path)
|
local _, error = vim.loop.fs_stat(path)
|
||||||
return error == nil
|
return error == nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Windows is case-insensetive, but case-preserving
|
||||||
|
-- If a file's name is being changed into itself
|
||||||
|
-- with different casing, windows will falsely
|
||||||
|
-- report that file is already existing, so a hand-rolled
|
||||||
|
-- implementation of checking for existance is needed.
|
||||||
|
-- Same holds for WSL, since it can sometimes
|
||||||
|
-- access Windows files directly.
|
||||||
|
-- For more details see (#3117).
|
||||||
|
|
||||||
|
if is_windows_drive(path) then
|
||||||
|
return vim.fn.isdirectory(path) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
local parent = vim.fn.fnamemodify(path, ":h")
|
||||||
|
local filename = vim.fn.fnamemodify(path, ":t")
|
||||||
|
|
||||||
|
local handle = vim.loop.fs_scandir(parent)
|
||||||
|
if not handle then
|
||||||
|
-- File can not exist if its parent directory does not exist
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local name, _ = vim.loop.fs_scandir_next(handle)
|
||||||
|
if not name then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if name == filename then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param path string
|
---@param path string
|
||||||
---@return string
|
---@return string
|
||||||
function M.canonical_path(path)
|
function M.canonical_path(path)
|
||||||
if M._is_windows() and path:match("^%a:") then
|
if M.is_windows and path:match("^%a:") then
|
||||||
return path:sub(1, 1):upper() .. path:sub(2)
|
return path:sub(1, 1):upper() .. path:sub(2)
|
||||||
end
|
end
|
||||||
return path
|
return path
|
||||||
@@ -353,20 +403,6 @@ end
|
|||||||
---@param dst_pos string value pos
|
---@param dst_pos string value pos
|
||||||
---@param remove boolean
|
---@param remove boolean
|
||||||
function M.move_missing_val(src, src_path, src_pos, dst, dst_path, dst_pos, remove)
|
function M.move_missing_val(src, src_path, src_pos, dst, dst_path, dst_pos, remove)
|
||||||
local ok, err = pcall(vim.validate, {
|
|
||||||
src = { src, "table" },
|
|
||||||
src_path = { src_path, "string" },
|
|
||||||
src_pos = { src_pos, "string" },
|
|
||||||
dst = { dst, "table" },
|
|
||||||
dst_path = { dst_path, "string" },
|
|
||||||
dst_pos = { dst_pos, "string" },
|
|
||||||
remove = { remove, "boolean" },
|
|
||||||
})
|
|
||||||
if not ok then
|
|
||||||
notify.warn("move_missing_val: " .. (err or "invalid arguments"))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
for pos in string.gmatch(src_path, "([^%.]+)%.*") do
|
for pos in string.gmatch(src_path, "([^%.]+)%.*") do
|
||||||
if src[pos] and type(src[pos]) == "table" then
|
if src[pos] and type(src[pos]) == "table" then
|
||||||
src = src[pos]
|
src = src[pos]
|
||||||
|
|||||||
@@ -254,7 +254,6 @@ local function close(tabpage)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
events._dispatch_on_tree_close()
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -270,9 +269,12 @@ function M.close_all_tabs()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.close()
|
---@param tabpage integer|nil
|
||||||
|
function M.close(tabpage)
|
||||||
if M.View.tab.sync.close then
|
if M.View.tab.sync.close then
|
||||||
M.close_all_tabs()
|
M.close_all_tabs()
|
||||||
|
elseif tabpage then
|
||||||
|
close(tabpage)
|
||||||
else
|
else
|
||||||
M.close_this_tab_only()
|
M.close_this_tab_only()
|
||||||
end
|
end
|
||||||
@@ -286,6 +288,7 @@ function M.open(options)
|
|||||||
|
|
||||||
local profile = log.profile_start("view open")
|
local profile = log.profile_start("view open")
|
||||||
|
|
||||||
|
events._dispatch_on_tree_pre_open()
|
||||||
create_buffer()
|
create_buffer()
|
||||||
open_window()
|
open_window()
|
||||||
M.resize()
|
M.resize()
|
||||||
@@ -326,14 +329,7 @@ local function grow()
|
|||||||
local count = vim.fn.strchars(l)
|
local count = vim.fn.strchars(l)
|
||||||
-- also add space for right-aligned icons
|
-- also add space for right-aligned icons
|
||||||
local extmarks = vim.api.nvim_buf_get_extmarks(M.get_bufnr(), ns_id, { line_nr, 0 }, { line_nr, -1 }, { details = true })
|
local extmarks = vim.api.nvim_buf_get_extmarks(M.get_bufnr(), ns_id, { line_nr, 0 }, { line_nr, -1 }, { details = true })
|
||||||
for _, extmark in ipairs(extmarks) do
|
count = count + utils.extmarks_length(extmarks)
|
||||||
local virt_texts = extmark[4].virt_text
|
|
||||||
if virt_texts then
|
|
||||||
for _, virt_text in ipairs(virt_texts) do
|
|
||||||
count = count + vim.fn.strchars(virt_text[1])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if resizing_width < count then
|
if resizing_width < count then
|
||||||
resizing_width = count
|
resizing_width = count
|
||||||
end
|
end
|
||||||
@@ -411,6 +407,7 @@ end
|
|||||||
---@param opts OpenInWinOpts|nil
|
---@param opts OpenInWinOpts|nil
|
||||||
function M.open_in_win(opts)
|
function M.open_in_win(opts)
|
||||||
opts = opts or { hijack_current_buf = true, resize = true }
|
opts = opts or { hijack_current_buf = true, resize = true }
|
||||||
|
events._dispatch_on_tree_pre_open()
|
||||||
if opts.winid and vim.api.nvim_win_is_valid(opts.winid) then
|
if opts.winid and vim.api.nvim_win_is_valid(opts.winid) then
|
||||||
vim.api.nvim_set_current_win(opts.winid)
|
vim.api.nvim_set_current_win(opts.winid)
|
||||||
end
|
end
|
||||||
@@ -422,6 +419,7 @@ function M.open_in_win(opts)
|
|||||||
M.reposition_window()
|
M.reposition_window()
|
||||||
M.resize()
|
M.resize()
|
||||||
end
|
end
|
||||||
|
events._dispatch_on_tree_open()
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.abandon_current_window()
|
function M.abandon_current_window()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
out=$(grep -nr "^--- @" lua)
|
out=$(grep -nr "^--- @" lua)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# run after changing nvim-tree.lua DEFAULT_OPTS or keymap.lua M.default_on_attach
|
# run after changing nvim-tree.lua DEFAULT_OPTS or keymap.lua M.default_on_attach
|
||||||
# scrapes and updates nvim-tree-lua.txt
|
# scrapes and updates nvim-tree-lua.txt
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# Performs a lua-language-server check on all files.
|
# Performs a lua-language-server check on all files.
|
||||||
# luals-out/check.json will be produced on any issues, returning 1.
|
# luals-out/check.json will be produced on any issues, returning 1.
|
||||||
# Outputs only check.json to stdout, all other messages to stderr, to allow jq etc.
|
# Outputs only check.json to stdout, all other messages to stderr, to allow jq etc.
|
||||||
# $VIMRUNTIME specifies neovim runtime path, defaults to "/usr/share/nvim/runtime" if unset.
|
# $VIMRUNTIME specifies neovim runtime path, defaults to "/usr/share/nvim/runtime" if unset.
|
||||||
|
#
|
||||||
|
# Call with codestyle-check param to enable only codestyle-check
|
||||||
|
|
||||||
if [ -z "${VIMRUNTIME}" ]; then
|
if [ -z "${VIMRUNTIME}" ]; then
|
||||||
export VIMRUNTIME="/usr/share/nvim/runtime"
|
export VIMRUNTIME="/usr/share/nvim/runtime"
|
||||||
@@ -17,11 +19,24 @@ FILE_LUARC="${DIR_OUT}/luarc.json"
|
|||||||
rm -rf "${DIR_OUT}"
|
rm -rf "${DIR_OUT}"
|
||||||
mkdir "${DIR_OUT}"
|
mkdir "${DIR_OUT}"
|
||||||
|
|
||||||
# Uncomment runtime.version for strict neovim baseline 5.1
|
case "${1}" in
|
||||||
# It is not set normally, to prevent luals loading 5.1 and 5.x, resulting in both versions being chosen on vim.lsp.buf.definition()
|
"codestyle-check")
|
||||||
cat "${PWD}/.luarc.json" | sed -E 's/.luals-check-only//g' > "${FILE_LUARC}"
|
jq \
|
||||||
|
'.diagnostics.neededFileStatus[] = "None" | .diagnostics.neededFileStatus."codestyle-check" = "Any"' \
|
||||||
|
"${PWD}/.luarc.json" > "${FILE_LUARC}"
|
||||||
|
|
||||||
# execute inside lua to prevent luals itself from being checked
|
;;
|
||||||
|
*)
|
||||||
|
# Add runtime.version for strict neovim baseline 5.1
|
||||||
|
# It is not set normally, to prevent luals loading 5.1 and 5.x, resulting in both versions being chosen on vim.lsp.buf.definition
|
||||||
|
jq \
|
||||||
|
'."runtime.version" = "Lua 5.1"' \
|
||||||
|
"${PWD}/.luarc.json" > "${FILE_LUARC}"
|
||||||
|
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# execute inside lua directory to prevent luals itself from being checked
|
||||||
OUT=$(lua-language-server --check="${DIR_SRC}" --configpath="${FILE_LUARC}" --checklevel=Information --logpath="${DIR_OUT}" --loglevel=error)
|
OUT=$(lua-language-server --check="${DIR_SRC}" --configpath="${FILE_LUARC}" --checklevel=Information --logpath="${DIR_OUT}" --loglevel=error)
|
||||||
RC=$?
|
RC=$?
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
DIR_REPO="$(git rev-parse --show-toplevel)"
|
|
||||||
export DIR_REPO
|
|
||||||
|
|
||||||
DIR_PLENARY="${DIR_REPO}/plenary.nvim"
|
|
||||||
export DIR_PLENARY
|
|
||||||
|
|
||||||
if [ "${#}" -eq 1 ]; then
|
|
||||||
TEST_NAME="${1}"
|
|
||||||
elif [ -z "${TEST_NAME}" ]; then
|
|
||||||
TEST_NAME="tests"
|
|
||||||
fi
|
|
||||||
export TEST_NAME
|
|
||||||
|
|
||||||
echo "testing: ${TEST_NAME}"
|
|
||||||
|
|
||||||
nvim --headless \
|
|
||||||
--clean \
|
|
||||||
-u "${DIR_REPO}/tests/minimal_init.lua" \
|
|
||||||
-l "${DIR_REPO}/tests/test_init.lua" \
|
|
||||||
-c "qa!"
|
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-- Prepend these as plenary appends a "." and plenary directory
|
|
||||||
-- The spawned processes don't specify --clean so contain the full ~/.local runtime path
|
|
||||||
vim.o.runtimepath = string.format(
|
|
||||||
"%s,%s,%s",
|
|
||||||
vim.env.DIR_REPO,
|
|
||||||
vim.env.DIR_PLENARY,
|
|
||||||
vim.o.runtimepath
|
|
||||||
)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
local test_harness = require("plenary.test_harness")
|
|
||||||
|
|
||||||
test_harness.test_directory(
|
|
||||||
vim.env.TEST_NAME,
|
|
||||||
{
|
|
||||||
minimal_init = vim.env.DIR_REPO .. "/tests/minimal_init.lua",
|
|
||||||
sequential = true,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
---@type Luassert
|
|
||||||
local assert = require("luassert")
|
|
||||||
local stub = require("luassert.stub")
|
|
||||||
|
|
||||||
local utils = require("nvim-tree.utils")
|
|
||||||
|
|
||||||
describe("utils.path_add_trailing", function()
|
|
||||||
it("trailing added", function()
|
|
||||||
assert.equals("foo/", utils.path_add_trailing("foo"))
|
|
||||||
end)
|
|
||||||
|
|
||||||
it("trailing already present", function()
|
|
||||||
assert.equals("foo/", utils.path_add_trailing("foo/"))
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
describe("utils.canonical_path", function()
|
|
||||||
before_each(function()
|
|
||||||
stub(vim.fn, "has")
|
|
||||||
end)
|
|
||||||
|
|
||||||
it("is windows", function()
|
|
||||||
vim.fn.has.on_call_with("win32unix").returns(1)
|
|
||||||
assert.equals("C:\\foo\\bar", utils.canonical_path("c:\\foo\\bar"), "should be uppercase drive")
|
|
||||||
end)
|
|
||||||
|
|
||||||
it("not windows", function()
|
|
||||||
assert.equals("c:\\foo\\bar", utils.canonical_path("c:\\foo\\bar"))
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
Reference in New Issue
Block a user