commit 008b62f71c85d17ad563f31e88139b2f64fa7c51
parent 6018af36bf376a2b881e2b3a035adf9898406b2e
Author: Martin Grenfell <martin.grenfell@gmail.com>
Date: Wed, 13 May 2015 20:27:06 +0100
Merge pull request #450 from vtsang/master
Optimized NERDTree when opening a large directory
Diffstat:
3 files changed, 44 insertions(+), 4 deletions(-)
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#compareNodesBySortKey(n1, n2) {{{2
+function! nerdtree#compareNodesBySortKey(n1, n2)
+ if a:n1.path.getSortKey() < a:n2.path.getSortKey()
+ return -1
+ elseif a:n1.path.getSortKey() > a:n2.path.getSortKey()
+ 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/path.vim b/lib/nerdtree/path.vim
@@ -1,6 +1,9 @@
"we need to use this number many times for sorting... so we calculate it only
"once here
let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
+" used in formating sortKey, e.g. '%04d'
+let s:format = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d"
+
"CLASS: Path
"============================================================
@@ -361,6 +364,24 @@ function! s:Path.getSortOrderIndex()
return s:NERDTreeSortStarIndex
endfunction
+"FUNCTION: Path.getSortKey() {{{1
+"returns a string 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, '^[._]', '', '')
+ endif
+ if !g:NERDTreeCaseSensitiveSort
+ let path = tolower(path)
+ endif
+ let self.sortKey = printf(s:format, self.getSortOrderIndex()) . path
+ endif
+
+ return self.sortKey
+endfunction
+
+
"FUNCTION: Path.isUnixHiddenFile() {{{1
"check for unix hidden files
function! s:Path.isUnixHiddenFile()
diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim
@@ -246,8 +246,12 @@ function! s:TreeDirNode._initChildren(silent)
"filter out the .. and . directories
"Note: we must match .. AND ../ cos sometimes the globpath returns
"../ for path with strange chars (eg $)
- if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
-
+" if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
+"
+ " Regular expression is too expensive. Use simply string comparison
+ " instead
+ if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." &&
+ \ i[len(i)-2:1] != "." && i[len(i)-1] != "."
"put the next file in a new node and attach it
try
let path = g:NERDTreePath.New(i)
@@ -405,8 +409,12 @@ function! s:TreeDirNode.refresh()
"filter out the .. and . directories
"Note: we must match .. AND ../ cos sometimes the globpath returns
"../ for path with strange chars (eg $)
- if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
+ "if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
+ " Regular expression is too expensive. Use simply string comparison
+ " instead
+ if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." &&
+ \ i[len(i)-2:1] != "." && i[len(i)-1] != "."
try
"create a new path and see if it exists in this nodes children
let path = g:NERDTreePath.New(i)
@@ -504,7 +512,7 @@ endfunction
"directory priority.
"
function! s:TreeDirNode.sortChildren()
- let CompareFunc = function("nerdtree#compareNodes")
+ let CompareFunc = function("nerdtree#compareNodesBySortKey")
call sort(self.children, CompareFunc)
endfunction