From 703e1ef4fe8350afbc61ce8271f72cef2d5c363a Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Sun, 1 Jul 2018 19:55:26 -0400 Subject: [PATCH 1/5] Correctly check the type of the sort key's value. Fixes #842. --- autoload/nerdtree.vim | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index b138c21..bdf3deb 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -61,7 +61,6 @@ endfunction function! nerdtree#compareNodesBySortKey(n1, n2) let sortKey1 = a:n1.path.getSortKey() let sortKey2 = a:n2.path.getSortKey() - let i = 0 while i < min([len(sortKey1), len(sortKey2)]) " Compare chunks upto common length. @@ -73,9 +72,9 @@ function! nerdtree#compareNodesBySortKey(n1, n2) elseif sortKey1[i] ># sortKey2[i] return 1 endif - elseif sortKey1[i] == type(0) + elseif type(sortKey1[i]) == v:t_number return -1 - elseif sortKey2[i] == type(0) + elseif type(sortKey2[i]) == v:t_number return 1 endif let i = i + 1 From a053925279b2b7a060a7714a7d98a8c5576878bf Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Sun, 1 Jul 2018 19:57:02 -0400 Subject: [PATCH 2/5] Recalculate the node's sortkey every time. The cached _sortkey wasn't being recalculated after changing the NERDTreeSortOrder, resulting in incorrect sort orders. --- lib/nerdtree/path.vim | 9 ++------- lib/nerdtree/tree_dir_node.vim | 1 + plugin/NERD_tree.vim | 14 ++++++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 2d8de23..2af280f 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -7,10 +7,6 @@ " ============================================================================ -" This constant is used throughout this script for sorting purposes. -let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') -lockvar s:NERDTreeSortStarIndex - let s:Path = {} let g:NERDTreePath = s:Path @@ -374,7 +370,8 @@ function! s:Path.getSortOrderIndex() endif let i = i + 1 endwhile - return s:NERDTreeSortStarIndex + + return index(g:NERDTreeSortOrder, '*') endfunction " FUNCTION: Path._splitChunks(path) {{{1 @@ -395,7 +392,6 @@ endfunction " FUNCTION: Path.getSortKey() {{{1 " returns a key used in compare function for sorting function! s:Path.getSortKey() - if !exists("self._sortKey") let path = self.getLastPathComponent(1) if !g:NERDTreeSortHiddenFirst let path = substitute(path, '^[._]', '', '') @@ -408,7 +404,6 @@ function! s:Path.getSortKey() else let self._sortKey = [self.getSortOrderIndex()] + self._splitChunks(path) endif - endif return self._sortKey endfunction diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 03c3545..17d9c7f 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -607,6 +607,7 @@ endfunction " FUNCTION: TreeDirNode.sortChildren() {{{1 " Sort "self.children" by alphabetical order and directory priority. function! s:TreeDirNode.sortChildren() + call AddDefaultGroupToSortOrder() let CompareFunc = function("nerdtree#compareNodesBySortKey") call sort(self.children, CompareFunc) endfunction diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 35b47c3..eb02eaa 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -24,6 +24,15 @@ let loaded_nerd_tree = 1 let s:old_cpo = &cpo set cpo&vim +"Function: AddDefaultGroupToSortOrder() function {{{2 +"This function adds the default grouping '*' to the sort sequence if it's not +"already in the list. +function! AddDefaultGroupToSortOrder() + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif +endfunction + "Function: s:initVariable() function {{{2 "This function is used to initialise a given variable to a given value. The "variable is only initialised if it does not exist prior @@ -82,10 +91,7 @@ call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] else - "if there isnt a * in the sort sequence then add one - if count(g:NERDTreeSortOrder, '*') < 1 - call add(g:NERDTreeSortOrder, '*') - endif + call AddDefaultGroupToSortOrder() endif call s:initVariable("g:NERDTreeGlyphReadOnly", "RO") From 6ef3213cd008d260b8c6b24f6ed26e95493d8ab2 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Mon, 2 Jul 2018 08:55:32 -0400 Subject: [PATCH 3/5] Fix indentation. --- lib/nerdtree/path.vim | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 2af280f..71be5f5 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -392,18 +392,18 @@ endfunction " FUNCTION: Path.getSortKey() {{{1 " returns a key used in compare function for sorting function! s:Path.getSortKey() - let path = self.getLastPathComponent(1) - if !g:NERDTreeSortHiddenFirst - let path = substitute(path, '^[._]', '', '') - endif - if !g:NERDTreeCaseSensitiveSort - let path = tolower(path) - endif - if !g:NERDTreeNaturalSort - let self._sortKey = [self.getSortOrderIndex(), path] - else - let self._sortKey = [self.getSortOrderIndex()] + self._splitChunks(path) - endif + let path = self.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + if !g:NERDTreeNaturalSort + let self._sortKey = [self.getSortOrderIndex(), path] + else + let self._sortKey = [self.getSortOrderIndex()] + self._splitChunks(path) + endif return self._sortKey endfunction From 1e2b7ef98d87955f7b9e6d1cfcad49df7e47cd5b Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Mon, 2 Jul 2018 09:06:09 -0400 Subject: [PATCH 4/5] Remove AddDefaultGroupToSortOrder check from startup. The call to AddDefaultGroupToSortOrder in NERD_tree.vim is redundant because it's also done every time sortChildren is called. And since the check is done only once, there's no need for a function either. sortChildren now just contains the needed if statement. --- lib/nerdtree/tree_dir_node.vim | 4 +++- plugin/NERD_tree.vim | 11 ----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 17d9c7f..2f62ec3 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -607,7 +607,9 @@ endfunction " FUNCTION: TreeDirNode.sortChildren() {{{1 " Sort "self.children" by alphabetical order and directory priority. function! s:TreeDirNode.sortChildren() - call AddDefaultGroupToSortOrder() + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif let CompareFunc = function("nerdtree#compareNodesBySortKey") call sort(self.children, CompareFunc) endfunction diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index eb02eaa..a8af089 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -24,15 +24,6 @@ let loaded_nerd_tree = 1 let s:old_cpo = &cpo set cpo&vim -"Function: AddDefaultGroupToSortOrder() function {{{2 -"This function adds the default grouping '*' to the sort sequence if it's not -"already in the list. -function! AddDefaultGroupToSortOrder() - if count(g:NERDTreeSortOrder, '*') < 1 - call add(g:NERDTreeSortOrder, '*') - endif -endfunction - "Function: s:initVariable() function {{{2 "This function is used to initialise a given variable to a given value. The "variable is only initialised if it does not exist prior @@ -90,8 +81,6 @@ call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] -else - call AddDefaultGroupToSortOrder() endif call s:initVariable("g:NERDTreeGlyphReadOnly", "RO") From e99a7a03139314997b1a83bea181bb6b36639514 Mon Sep 17 00:00:00 2001 From: "Phil Runninger (mac)" Date: Fri, 27 Jul 2018 08:46:50 -0400 Subject: [PATCH 5/5] Restore the cached _sortKey for faster processing. Also add a new global variable to track when the g:NERDTreeSortOrder changes. If it has been changed, or when the cached _sortKey value is uninitialized, then calculate the sort key. This improves processing speed over the previous commit, and allows on-the-fly changes to the sort order, (without required vim to be restarted.) --- lib/nerdtree/path.vim | 24 +++++++++++++----------- lib/nerdtree/tree_dir_node.vim | 1 + plugin/NERD_tree.vim | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 71be5f5..0aa592e 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -392,17 +392,19 @@ endfunction " FUNCTION: Path.getSortKey() {{{1 " returns a key used in compare function for sorting function! s:Path.getSortKey() - let path = self.getLastPathComponent(1) - if !g:NERDTreeSortHiddenFirst - let path = substitute(path, '^[._]', '', '') - endif - if !g:NERDTreeCaseSensitiveSort - let path = tolower(path) - endif - if !g:NERDTreeNaturalSort - let self._sortKey = [self.getSortOrderIndex(), path] - else - let self._sortKey = [self.getSortOrderIndex()] + self._splitChunks(path) + if !exists("self._sortKey") || g:NERDTreeSortOrder !=# g:NERDTreeOldSortOrder + let path = self.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + if !g:NERDTreeNaturalSort + let self._sortKey = [self.getSortOrderIndex(), path] + else + let self._sortKey = [self.getSortOrderIndex()] + self._splitChunks(path) + endif endif return self._sortKey diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 2f62ec3..30db853 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -612,6 +612,7 @@ function! s:TreeDirNode.sortChildren() endif let CompareFunc = function("nerdtree#compareNodesBySortKey") call sort(self.children, CompareFunc) + let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder endfunction " FUNCTION: TreeDirNode.toggleOpen([options]) {{{1 diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index a8af089..71d719a 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -82,6 +82,7 @@ call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] endif +let g:NERDTreeOldSortOrder = [] call s:initVariable("g:NERDTreeGlyphReadOnly", "RO")