* refactor(#2875): multi instance renderer
* refactor(#2875): multi instance renderer
* refactor(#2875): multi instance renderer
* refactor(#2875): multi instance renderer
* node classes and constructors
* node methods
* refactor(#2875): multi instance renderer
* node classes and constructors
* explorer is a directory node
* extract methods from explore_node
* extract methods from explore_node
* extract methods from explore_node
* extract methods from lib
* use .. name for root node for compatibility
* use node.explorer
* extract node factory, remove unused code
* factories for all nodes, add RootNode
* factories for all nodes, add RootNode
* use factory pattern for decorators
* note regression and commit
* fix dir git status regression
* destroy nodes, not explorer
* add BaseNode:is
* revert changes to create-file, handle in #2924
* extract methods from explorer
* extract methods from explorer
* extract methods from explorer
* use Node everywhere in luadoc
* extract methods from lib
* extract methods from lib
* lint
* remove unused code
* don't call methods on fake root node
* get_node_at_cursor returns explorer (root) node instead of { name = '..' }
* remove unused inject_node
* refactor(#2875): multi instance renderer
* refactor(#2875): multi instance renderer
* refactor(#2875): multi instance renderer
* extract methods from lib
* node factory uses stat only
* temporary DirectoryNode casting until method extraction into child classes
* lua-language-server 3.10.5 -> 3.11.0
* explicitly call Explorer constructor
* normalise explorer RootNode new call, tidy annotations
* refactor: multi instance nvim-tree.explorer.sorters
* fix: linter errors
* fix: style
* fix: according to code review
* chore: removed comment
* fix: missing cfg params in sorters
* tidy following rebase
* tidy following rebase
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
* feat(#2364): add option to show files first
* Refactor `folders_or_files_first` function
* Improve readability
* Remove `fallback` from `folders_or_files_first` function
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
* feat: adds new type of sorting based on the filename's suffix
* chore(syntax): using string colon methods
* fix(regex): use alphanumeric match for extensions
* feat: adds new type of sorting based on the filename's suffix
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
* fix(extension/sorter): fallbacks to C.name when both exts are the same or nil
* fix(nil): files with no extension
* fix(nil): files with no extension
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
* feat: adds new type of sorting based on vim's filetype detection
* fix(ft/sorter): fallbacks to C.name when both ft's are nil or equal
* feat: adds new type of sorting based on vim's filetype detection
---------
Co-authored-by: Alexander Courtis <alex@courtis.org>
* feat: Mixin Sorter (#1565) Self Solved
adding `mixin` sort options for `rust` like package systems
```
package.rs
package/
__inside__
lib.rs
lib/
_inside_
a.rs
b.rs
module.rs
```
* feat: sort_by, after_sort options for more convinient using
```
*nvim-tree.sort_by*
Changes how files within the same directory are sorted.
Can be one of 'name', 'case_sensitive', 'modification_time' or 'extension',
'function'.
>
sort_by = function(a, b)
if not (a and b) then
return true
end
if a.nodes and not b.nodes then
return true
elseif not a.nodes and b.nodes then
return false
end
return a.name:lower() <= b.name:lower()
end
end
Type: `string | function(a, b)`, Default: `"name"`
*nvim-tree.after_sort*
Related to nvim-tree.sort_by, this function runs without mergesort.
Can be defined by your own after-sort works.
Type: `function(table)`, Default: `disable`
>
after_sort = function(t)
local i = 1
while i <= #t do
if t[i] and t[i].nodes then
local j = i + 1
while j <= #t do
if t[j] and not t[j].nodes and t[i].name:lower() == t[j].name:lower():match "(.+)%..+$" then
local change_target = t[j]
table.remove(t, j)
table.insert(t, i, change_target)
break
end
j = j + 1
end
end
i = i + 1
end
end
```
* remove: after_sort ( misunderstood feature )
sort_by parameter can be function.
``` lua
sort_by = function(t)
local sorters = require "nvim-tree.explorer.sorters"
local comparator = sorters.retrieve_comparator("name")
sorters.split_merge(t, 1, #t, comparator) -- run default merge_sort
local i = 1
while i <= #t do
if t[i] and t[i].nodes then
local j = i + 1
while j <= #t do
if t[j] and not t[j].nodes and t[i].name:lower() == t[j].name:lower():match "(.+)%..+$" then
local change_target = t[j]
table.remove(t, j)
table.insert(t, i, change_target)
break
end
j = j + 1
end
end
i = i + 1
end
end,
```
* try-fix: change existing merge_sort function, call user's sort_by
hope.. like it...?
* doc: explain function parameter and return, add more complex example
* fix: reorder with user-comparator exceed memory limit
apply merge_sort
check nil & type for senitize
* fix: user_index based sorting ( create index )
for performance, create index once,
using index to re-ordering
* fix: fence problems
* doc & fix: merge_sort problem fix & nil sorting
add complex example
* fix: sort_by detect and use string and nil
* doc: revert sort_by to simple
* fix: sort_by does not return anything
Co-authored-by: Alexander Courtis <alex@courtis.org>