nerdtree

A tree explorer plugin for vim.
Index Commits Files Refs
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:
Mautoload/nerdtree.vim | 11+++++++++++
Mlib/nerdtree/tree_dir_node.vim | 19++++++++++++++++++-
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