Compare commits
20 Commits
nvim-tree-
...
v1.13
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b5b366596 | ||
|
|
ae595611fb | ||
|
|
05d8172ebf | ||
|
|
1c733e8c19 | ||
|
|
ebcaccda1c | ||
|
|
cbc3165e08 | ||
|
|
bd54d1d33c | ||
|
|
25d16aab7d | ||
|
|
e4cd856ebf | ||
|
|
e7d1b7dadc | ||
|
|
ea5097a1e2 | ||
|
|
582ae48c9e | ||
|
|
be5b788f2d | ||
|
|
64bb47f868 | ||
|
|
c24c0470d9 | ||
|
|
3a63717d3d | ||
|
|
5bea2b3752 | ||
|
|
c3c1935942 | ||
|
|
44d9b58f11 | ||
|
|
c09ff35de5 |
@@ -7,6 +7,9 @@ end_of_line = lf
|
||||
[nvim-tree-lua.txt]
|
||||
max_line_length = 78
|
||||
|
||||
# keep these in sync with .luarc.json
|
||||
# .editorconfig is used within nvim, overriding .luarc.json
|
||||
# .luarc.json is used by style check
|
||||
[*.lua]
|
||||
indent_style = space
|
||||
max_line_length = 140
|
||||
|
||||
63
.github/workflows/ci.yml
vendored
63
.github/workflows/ci.yml
vendored
@@ -20,45 +20,25 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
lua_version: [ 5.1 ]
|
||||
luacheck_version: [ 1.2.0 ]
|
||||
|
||||
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:
|
||||
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
|
||||
|
||||
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:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -69,26 +49,31 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
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:
|
||||
- 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:
|
||||
neovim: true
|
||||
version: ${{ matrix.nvim_version }}
|
||||
|
||||
- name: install luals
|
||||
- name: install lua-language-server ${{ matrix.luals_version }}
|
||||
run: |
|
||||
mkdir -p luals
|
||||
curl -L "https://github.com/LuaLS/lua-language-server/releases/download/${{ matrix.luals_version }}/lua-language-server-${{ matrix.luals_version }}-linux-x64.tar.gz" | tar zx --directory luals
|
||||
echo "luals/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- run: echo "luals/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: make check
|
||||
env:
|
||||
VIMRUNTIME: /home/runner/nvim-${{ matrix.nvim_version }}/share/nvim/runtime
|
||||
run: make check
|
||||
- run: make 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
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+'
|
||||
- v*
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
luarocks-upload:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
#!/usr/bin/env sh
|
||||
|
||||
make
|
||||
|
||||
13
.luarc.json
13
.luarc.json
@@ -1,12 +1,23 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json",
|
||||
"runtime.version.luals-check-only": "Lua 5.1",
|
||||
"workspace": {
|
||||
"library": [
|
||||
"$VIMRUNTIME/lua/vim",
|
||||
"${3rd}/luv/library"
|
||||
]
|
||||
},
|
||||
"format": {
|
||||
"defaultConfig": {
|
||||
"indent_style": "space",
|
||||
"max_line_length": "140",
|
||||
"indent_size": "2",
|
||||
"continuation_indent": "2",
|
||||
"quote_style": "double",
|
||||
"call_arg_parentheses": "always",
|
||||
"space_before_closure_open_parenthesis": "false",
|
||||
"align_continuous_similar_call_args": "true"
|
||||
}
|
||||
},
|
||||
"diagnostics": {
|
||||
"libraryFiles": "Disable",
|
||||
"globals": [],
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "1.11.0"
|
||||
".": "1.13.0"
|
||||
}
|
||||
|
||||
37
CHANGELOG.md
37
CHANGELOG.md
@@ -1,5 +1,42 @@
|
||||
# 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)
|
||||
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@ Language server: [luals](https://luals.github.io)
|
||||
|
||||
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`
|
||||
|
||||
@@ -36,14 +36,14 @@ make lint
|
||||
|
||||
## 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
|
||||
|
||||
```sh
|
||||
make style
|
||||
```
|
||||
|
||||
You can automatically fix `CodeCheck` issues via:
|
||||
You can automatically fix style issues using `CodeCheck`:
|
||||
|
||||
```sh
|
||||
make style-fix
|
||||
|
||||
2
Makefile
2
Makefile
@@ -17,7 +17,7 @@ luacheck:
|
||||
|
||||
# --diagnosis-as-error does not function for workspace, hence we post-process the output
|
||||
style-check:
|
||||
CodeFormat check --config .editorconfig --diagnosis-as-error --workspace lua
|
||||
@scripts/luals-check.sh codestyle-check
|
||||
|
||||
style-doc:
|
||||
scripts/doc-comments.sh
|
||||
|
||||
@@ -206,7 +206,7 @@ Show the mappings: `g?`
|
||||
`S` Search |nvim-tree-api.tree.search_node()|
|
||||
`u` Rename: Full Path |nvim-tree-api.fs.rename_full()|
|
||||
`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()|
|
||||
`y` Copy Name |nvim-tree-api.fs.copy.filename()|
|
||||
`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()|
|
||||
|
||||
Calls: `api.tree.collapse_all(false)`
|
||||
Calls: `api.tree.collapse_all({ keep_buffers = false })`
|
||||
|
||||
*:NvimTreeCollapseKeepBuffers*
|
||||
|
||||
@@ -350,7 +350,7 @@ See |nvim-tree-highlight| for details.
|
||||
|
||||
See |nvim-tree-api.tree.collapse_all()|
|
||||
|
||||
Calls: `api.tree.collapse_all(true)`
|
||||
Calls: `api.tree.collapse_all({ keep_buffers = true })`
|
||||
|
||||
*:NvimTreeHiTest*
|
||||
|
||||
@@ -462,7 +462,10 @@ Following is the default configuration. See |nvim-tree-opts| for details. >lua
|
||||
hidden_placement = "after",
|
||||
diagnostics_placement = "signcolumn",
|
||||
bookmarks_placement = "signcolumn",
|
||||
padding = " ",
|
||||
padding = {
|
||||
icon = " ",
|
||||
folder_arrow = " ",
|
||||
},
|
||||
symlink_arrow = " ➛ ",
|
||||
show = {
|
||||
file = true,
|
||||
@@ -1065,10 +1068,14 @@ Configuration options for icons.
|
||||
Bookmark icon placement.
|
||||
Type: `string`, Default: `signcolumn`
|
||||
|
||||
*nvim-tree.renderer.icons.padding*
|
||||
*nvim-tree.renderer.icons.padding.icon*
|
||||
Inserted between icon and filename.
|
||||
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*
|
||||
Used as a separator between symlinks' source and target.
|
||||
Type: `string`, Default: `" ➛ "`
|
||||
@@ -1463,7 +1470,8 @@ vim |current-directory| behaviour.
|
||||
Type: `boolean`, Default: `false`
|
||||
|
||||
*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*
|
||||
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*
|
||||
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`
|
||||
|
||||
*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"`
|
||||
|
||||
*nvim-tree.actions.open_file.window_picker.exclude*
|
||||
Table of buffer option names mapped to a list of option values that
|
||||
indicates to the picker that the buffer's window should not be
|
||||
selectable.
|
||||
Table of buffer option names mapped to a list of option values.
|
||||
Windows containing matching buffers will not be:
|
||||
- available when using a window picker
|
||||
- selected when not using a window picker
|
||||
Type: `table`, Default: >lua
|
||||
{
|
||||
filetype = {
|
||||
@@ -1822,10 +1832,13 @@ tree.find_file({opts}) *nvim-tree-api.tree.find_file()*
|
||||
tree.search_node() *nvim-tree-api.tree.search_node()*
|
||||
Open the search dialogue as per the search_node action.
|
||||
|
||||
tree.collapse_all({keep_buffers}) *nvim-tree-api.tree.collapse_all()*
|
||||
tree.collapse_all({opts}) *nvim-tree-api.tree.collapse_all()*
|
||||
Collapse the tree.
|
||||
|
||||
Parameters: ~
|
||||
• {opts} (table) optional parameters
|
||||
|
||||
Options: ~
|
||||
• {keep_buffers} (boolean) do not collapse nodes with open buffers.
|
||||
|
||||
tree.expand_all({node}) *nvim-tree-api.tree.expand_all()*
|
||||
@@ -2266,6 +2279,23 @@ node.buffer.wipe({node}, {opts}) *nvim-tree-api.node.buffer.wipe()*
|
||||
Options: ~
|
||||
• {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*
|
||||
|
||||
@@ -2520,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", "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", "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", "y", api.fs.copy.filename, opts("Copy Name"))
|
||||
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
||||
@@ -2769,13 +2799,21 @@ e.g. handler for node renamed: >lua
|
||||
|nvim_tree_events_kind|
|
||||
|
||||
- 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.
|
||||
|
||||
- Event.TreeOpen
|
||||
Invoked after the NvimTree is opened.
|
||||
• Note: Handler takes no parameter.
|
||||
|
||||
- Event.TreeClose
|
||||
Invoked after the NvimTree is closed, but before the window is
|
||||
closed. Dispatched on |WinClosed| event for NvimTree window.
|
||||
• Note: Handler takes no parameter.
|
||||
|
||||
- Event.Resize - When NvimTree is resized.
|
||||
@@ -3019,6 +3057,7 @@ needed.
|
||||
`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|
|
||||
`renderer.icons.padding` |nvim-tree.renderer.icons.padding.icon|
|
||||
|
||||
==============================================================================
|
||||
14.2 LEGACY: HIGHLIGHT *nvim-tree-legacy-highlight*
|
||||
@@ -3175,7 +3214,8 @@ highlight group is not, hard linking as follows: >
|
||||
|nvim-tree.renderer.icons.glyphs.symlink|
|
||||
|nvim-tree.renderer.icons.hidden_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.bookmarks|
|
||||
|nvim-tree.renderer.icons.show.diagnostics|
|
||||
@@ -3282,6 +3322,8 @@ highlight group is not, hard linking as follows: >
|
||||
|nvim-tree-api.marks.toggle()|
|
||||
|nvim-tree-api.node.buffer.delete()|
|
||||
|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_recursive()|
|
||||
|nvim-tree-api.node.navigate.diagnostics.prev()|
|
||||
|
||||
@@ -236,6 +236,20 @@ local function setup_autocommands(opts)
|
||||
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
|
||||
|
||||
local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
|
||||
@@ -323,7 +337,10 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
|
||||
hidden_placement = "after",
|
||||
diagnostics_placement = "signcolumn",
|
||||
bookmarks_placement = "signcolumn",
|
||||
padding = " ",
|
||||
padding = {
|
||||
icon = " ",
|
||||
folder_arrow = " ",
|
||||
},
|
||||
symlink_arrow = " ➛ ",
|
||||
show = {
|
||||
file = true,
|
||||
|
||||
@@ -43,17 +43,6 @@ local function usable_win_ids()
|
||||
end, win_ids)
|
||||
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.
|
||||
---@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
|
||||
@@ -246,9 +235,14 @@ local function get_target_winid(mode)
|
||||
local target_winid
|
||||
if not M.window_picker.enable or string.find(mode, "no_picker") then
|
||||
target_winid = lib.target_winid
|
||||
-- first available window
|
||||
if not vim.tbl_contains(vim.api.nvim_tabpage_list_wins(0), target_winid) then
|
||||
target_winid = first_win_id()
|
||||
local usable_wins = usable_win_ids()
|
||||
-- first available usable window
|
||||
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
|
||||
else
|
||||
-- pick a window
|
||||
|
||||
@@ -2,6 +2,7 @@ local utils = require("nvim-tree.utils")
|
||||
local core = require("nvim-tree.core")
|
||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||
|
||||
local FileNode = require("nvim-tree.node.file")
|
||||
local DirectoryNode = require("nvim-tree.node.directory")
|
||||
|
||||
local M = {}
|
||||
@@ -23,26 +24,30 @@ local function buf_match()
|
||||
end
|
||||
end
|
||||
|
||||
---@param keep_buffers boolean
|
||||
function M.fn(keep_buffers)
|
||||
---Collapse a node, root if nil
|
||||
---@param node Node?
|
||||
---@param opts ApiCollapseOpts
|
||||
local function collapse(node, opts)
|
||||
local explorer = core.get_explorer()
|
||||
if not explorer then
|
||||
return
|
||||
end
|
||||
|
||||
local node = explorer:get_node_at_cursor()
|
||||
if not node then
|
||||
node = node or explorer
|
||||
|
||||
local node_at_cursor = explorer:get_node_at_cursor()
|
||||
if not node_at_cursor then
|
||||
return
|
||||
end
|
||||
|
||||
local matches = buf_match()
|
||||
|
||||
Iterator.builder(explorer.nodes)
|
||||
Iterator.builder({ node:is(FileNode) and node.parent or node:as(DirectoryNode) })
|
||||
:hidden()
|
||||
:applier(function(n)
|
||||
local dir = n:as(DirectoryNode)
|
||||
if dir then
|
||||
dir.open = keep_buffers and matches(dir.absolute_path)
|
||||
dir.open = opts.keep_buffers == true and matches(dir.absolute_path)
|
||||
end
|
||||
end)
|
||||
:recursor(function(n)
|
||||
@@ -51,7 +56,26 @@ function M.fn(keep_buffers)
|
||||
:iterate()
|
||||
|
||||
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
|
||||
|
||||
return M
|
||||
@@ -2,6 +2,7 @@ local core = require("nvim-tree.core")
|
||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||
local notify = require("nvim-tree.notify")
|
||||
|
||||
local FileNode = require("nvim-tree.node.file")
|
||||
local DirectoryNode = require("nvim-tree.node.directory")
|
||||
|
||||
local M = {}
|
||||
@@ -70,23 +71,38 @@ local function gen_iterator()
|
||||
end
|
||||
end
|
||||
|
||||
---Expand the directory node or the root
|
||||
---@param node Node
|
||||
function M.fn(node)
|
||||
local explorer = core.get_explorer()
|
||||
local parent = node:as(DirectoryNode) or explorer
|
||||
if not parent then
|
||||
---@param node Node?
|
||||
local function expand_node(node)
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
|
||||
if gen_iterator()(parent) then
|
||||
if gen_iterator()(node) then
|
||||
notify.warn("expansion iteration was halted after " .. M.MAX_FOLDER_DISCOVERY .. " discovered folders")
|
||||
end
|
||||
|
||||
local explorer = core.get_explorer()
|
||||
if explorer then
|
||||
explorer.renderer:draw()
|
||||
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)
|
||||
M.MAX_FOLDER_DISCOVERY = opts.actions.expand_all.max_folder_discovery
|
||||
M.EXCLUDE = to_lookup_table(opts.actions.expand_all.exclude)
|
||||
@@ -1,10 +1,10 @@
|
||||
local M = {}
|
||||
|
||||
M.collapse_all = require("nvim-tree.actions.tree.modifiers.collapse-all")
|
||||
M.expand_all = require("nvim-tree.actions.tree.modifiers.expand-all")
|
||||
M.collapse = require("nvim-tree.actions.tree.modifiers.collapse")
|
||||
M.expand = require("nvim-tree.actions.tree.modifiers.expand")
|
||||
|
||||
function M.setup(opts)
|
||||
M.expand_all.setup(opts)
|
||||
M.expand.setup(opts)
|
||||
end
|
||||
|
||||
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.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_gitignore_filter = wrap_explorer_member_args("filters", "toggle", "git_ignored")
|
||||
Api.tree.toggle_git_clean_filter = wrap_explorer_member_args("filters", "toggle", "git_clean")
|
||||
@@ -312,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.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
|
||||
---@field force boolean|nil default false
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ M.Event = {
|
||||
Ready = "Ready",
|
||||
WillRenameNode = "WillRenameNode",
|
||||
NodeRenamed = "NodeRenamed",
|
||||
TreePreOpen = "TreePreOpen",
|
||||
TreeOpen = "TreeOpen",
|
||||
TreeClose = "TreeClose",
|
||||
WillCreateFile = "WillCreateFile",
|
||||
@@ -91,6 +92,11 @@ function M._dispatch_folder_removed(folder_name)
|
||||
dispatch(M.Event.FolderRemoved, { folder_name = folder_name })
|
||||
end
|
||||
|
||||
--@private
|
||||
function M._dispatch_on_tree_pre_open()
|
||||
dispatch(M.Event.TreePreOpen, nil)
|
||||
end
|
||||
|
||||
--@private
|
||||
function M._dispatch_on_tree_open()
|
||||
dispatch(M.Event.TreeOpen, nil)
|
||||
|
||||
@@ -101,10 +101,19 @@ function Explorer:create_autocmds()
|
||||
vim.api.nvim_create_autocmd("BufReadPost", {
|
||||
group = self.augroup_id,
|
||||
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()
|
||||
self:reload_explorer()
|
||||
end)
|
||||
elseif self.opts.renderer.highlight_opened_files ~= "none" then
|
||||
-- draw to update opened highlight
|
||||
self.renderer:draw()
|
||||
end
|
||||
end,
|
||||
})
|
||||
@@ -113,10 +122,21 @@ function Explorer:create_autocmds()
|
||||
vim.api.nvim_create_autocmd("BufUnload", {
|
||||
group = self.augroup_id,
|
||||
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()
|
||||
self:reload_explorer()
|
||||
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,
|
||||
})
|
||||
@@ -214,8 +234,9 @@ function Explorer:reload(node, project)
|
||||
end
|
||||
|
||||
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)
|
||||
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
|
||||
local profile = log.profile_start("populate_children %s", abs)
|
||||
|
||||
---@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 = parent.filters:should_filter_as_reason(abs, stat, filter_status)
|
||||
if filter_reason == FILTER_REASON.none and not nodes_by_path[abs] then
|
||||
local child = node_factory.create({
|
||||
|
||||
@@ -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", "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", "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", "y", api.fs.copy.filename, opts("Copy Name"))
|
||||
vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path"))
|
||||
|
||||
@@ -60,6 +60,13 @@ local function refactored(opts)
|
||||
end
|
||||
end
|
||||
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
|
||||
|
||||
local function deprecated(opts)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
local view = require("nvim-tree.view")
|
||||
local core = require("nvim-tree.core")
|
||||
local events = require("nvim-tree.events")
|
||||
local notify = require("nvim-tree.notify")
|
||||
|
||||
---@class LibOpenOpts
|
||||
@@ -130,7 +129,6 @@ function M.open(opts)
|
||||
open_view_and_draw()
|
||||
end
|
||||
view.restore_tab_state()
|
||||
events._dispatch_on_tree_open()
|
||||
end
|
||||
|
||||
function M.setup(opts)
|
||||
|
||||
@@ -135,12 +135,12 @@ end
|
||||
function Builder:format_line(indent_markers, arrows, icon, name, node)
|
||||
local added_len = 0
|
||||
local function add_to_end(t1, t2)
|
||||
if not t2 then
|
||||
if not t2 or vim.tbl_isempty(t2) then
|
||||
return
|
||||
end
|
||||
for _, v in ipairs(t2) do
|
||||
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
|
||||
table.insert(t1, v)
|
||||
end
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
local M = {}
|
||||
|
||||
local utils = require("nvim-tree.utils")
|
||||
local view = require("nvim-tree.view")
|
||||
|
||||
local function hide(win)
|
||||
if win then
|
||||
@@ -32,7 +33,7 @@ local function effective_win_width()
|
||||
return win_width - win_info[1].textoff
|
||||
end
|
||||
|
||||
local function show()
|
||||
local function show(opts)
|
||||
local line_nr = vim.api.nvim_win_get_cursor(0)[1]
|
||||
if vim.wo.wrap then
|
||||
return
|
||||
@@ -52,6 +53,11 @@ local function show()
|
||||
local text_width = vim.fn.strdisplaywidth(vim.fn.substitute(line, "[^[:print:]]*$", "", "g"))
|
||||
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
|
||||
return
|
||||
end
|
||||
@@ -64,7 +70,9 @@ local function show()
|
||||
height = 1,
|
||||
noautocmd = true,
|
||||
style = "minimal",
|
||||
border = "none"
|
||||
})
|
||||
vim.wo[M.popup_win].winhl = view.View.winopts.winhl
|
||||
|
||||
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 })
|
||||
@@ -87,7 +95,10 @@ local function show()
|
||||
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
|
||||
|
||||
@@ -113,7 +124,7 @@ M.setup = function(opts)
|
||||
pattern = { "NvimTree_*" },
|
||||
callback = function()
|
||||
if utils.is_nvim_tree_buf(0) then
|
||||
show()
|
||||
show(opts)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
@@ -95,15 +95,15 @@ function M.get_arrows(node)
|
||||
local dir = node:as(DirectoryNode)
|
||||
if dir 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"
|
||||
else
|
||||
str = M.config.icons.glyphs.folder["arrow_closed"] .. " "
|
||||
str = M.config.icons.glyphs.folder["arrow_closed"] .. M.config.icons.padding.folder_arrow
|
||||
end
|
||||
elseif M.config.indent_markers.enable then
|
||||
str = ""
|
||||
else
|
||||
str = " "
|
||||
str = " " .. string.rep(" ", #M.config.icons.padding.folder_arrow)
|
||||
end
|
||||
|
||||
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 }
|
||||
end
|
||||
|
||||
---@param icons GitIconsByXY
|
||||
---@param icons GitIconsByStatus
|
||||
function GitDecorator:build_icons_by_xy(icons)
|
||||
self.icons_by_xy = {
|
||||
["M "] = { icons.staged },
|
||||
|
||||
@@ -112,9 +112,8 @@ function Decorator:define_sign(icon)
|
||||
vim.fn.sign_undefine(name)
|
||||
end
|
||||
|
||||
-- don't use sign if not defined
|
||||
-- don't render sign if empty
|
||||
if #icon.str < 1 then
|
||||
self.icon_placement = "none"
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||
local notify = require("nvim-tree.notify")
|
||||
|
||||
local M = {
|
||||
debouncers = {},
|
||||
@@ -173,6 +172,21 @@ function M.find_node_line(node)
|
||||
return -1
|
||||
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
|
||||
-- (grouped or hidden too)
|
||||
---@param path string
|
||||
@@ -289,11 +303,51 @@ function M.rename_loaded_buffers(old_path, new_path)
|
||||
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
|
||||
---@return boolean
|
||||
function M.file_exists(path)
|
||||
local _, error = vim.loop.fs_stat(path)
|
||||
return error == nil
|
||||
if not (M.is_windows or M.is_wsl) then
|
||||
local _, error = vim.loop.fs_stat(path)
|
||||
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
|
||||
|
||||
---@param path string
|
||||
@@ -349,20 +403,6 @@ end
|
||||
---@param dst_pos string value pos
|
||||
---@param remove boolean
|
||||
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
|
||||
if src[pos] and type(src[pos]) == "table" then
|
||||
src = src[pos]
|
||||
|
||||
@@ -254,7 +254,6 @@ local function close(tabpage)
|
||||
return
|
||||
end
|
||||
end
|
||||
events._dispatch_on_tree_close()
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -289,6 +288,7 @@ function M.open(options)
|
||||
|
||||
local profile = log.profile_start("view open")
|
||||
|
||||
events._dispatch_on_tree_pre_open()
|
||||
create_buffer()
|
||||
open_window()
|
||||
M.resize()
|
||||
@@ -329,14 +329,7 @@ local function grow()
|
||||
local count = vim.fn.strchars(l)
|
||||
-- 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 })
|
||||
for _, extmark in ipairs(extmarks) do
|
||||
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
|
||||
count = count + utils.extmarks_length(extmarks)
|
||||
if resizing_width < count then
|
||||
resizing_width = count
|
||||
end
|
||||
@@ -414,6 +407,7 @@ end
|
||||
---@param opts OpenInWinOpts|nil
|
||||
function M.open_in_win(opts)
|
||||
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
|
||||
vim.api.nvim_set_current_win(opts.winid)
|
||||
end
|
||||
@@ -425,6 +419,7 @@ function M.open_in_win(opts)
|
||||
M.reposition_window()
|
||||
M.resize()
|
||||
end
|
||||
events._dispatch_on_tree_open()
|
||||
end
|
||||
|
||||
function M.abandon_current_window()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
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
|
||||
# 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.
|
||||
# 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.
|
||||
# $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
|
||||
export VIMRUNTIME="/usr/share/nvim/runtime"
|
||||
@@ -17,11 +19,24 @@ FILE_LUARC="${DIR_OUT}/luarc.json"
|
||||
rm -rf "${DIR_OUT}"
|
||||
mkdir "${DIR_OUT}"
|
||||
|
||||
# Uncomment 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()
|
||||
cat "${PWD}/.luarc.json" | sed -E 's/.luals-check-only//g' > "${FILE_LUARC}"
|
||||
case "${1}" in
|
||||
"codestyle-check")
|
||||
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)
|
||||
RC=$?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user