commit 57d5bd773101a86c7983b5b0755cd3720ea8be0c
parent a87b1bf3c566c3f80090996a2a2a1201318478a8
Author: Vincent Tsang <vincenttsf@yahoo.com.hk>
Date: Sat, 9 May 2015 22:38:16 +0800
Speed up sortChildren() by using sorting token
This improves the sorting functions from 12 seconds to 0.66 seconds for
~4000 objects
Diffstat:
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim
@@ -34,6 +34,17 @@ function! nerdtree#compareNodes(n1, n2)
return a:n1.path.compareTo(a:n2.path)
endfunction
+"FUNCTION: nerdtree#compareNodesBySortingToken(n1, n2) {{{2
+function! nerdtree#compareNodesBySortingToken(n1, n2)
+ if a:n1.sorting_token < a:n2.sorting_token
+ return -1
+ elseif a:n1.sorting_token > a:n2.sorting_token
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2
" Issue a deprecation warning for a:func. If a second arg is given, use this
" as the deprecation message
diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim
@@ -504,7 +504,24 @@ endfunction
"directory priority.
"
function! s:TreeDirNode.sortChildren()
- let CompareFunc = function("nerdtree#compareNodes")
+ let CompareFunc = function("nerdtree#compareNodesBySortingToken")
+ " To optimize sorting, let's generate the sorting token for comparison
+
+ " calculate how large number is needed to represent " order index
+ let digit = ceil(log10(len(g:NERDTreeSortOrder)))
+ let format = "%0" . float2nr(digit) . "d" " e.g. '%04d'
+
+ for child in self.children
+ let path = child.path.getLastPathComponent(1)
+ if !g:NERDTreeSortHiddenFirst
+ let path = substitute(path, '^[._]', '', '')
+ endif
+ if !g:NERDTreeCaseSensitiveSort
+ let path = tolower(path)
+ endif
+ let child.sorting_token = printf(format, child.path.getSortOrderIndex()) . path
+ endfor
+
call sort(self.children, CompareFunc)
endfunction