nerdtree

A tree explorer plugin for vim.
Index Commits Files Refs
commit 80e184df5615b9f4181abec289437b7fc07b8b5d
parent 3fb3fe347733b5a587f6aaa60c288af0fa74aa07
Author: Vincent Tsang <Vincent.Tsang@macquarie.com>
Date:   Mon, 11 May 2015 11:56:08 +0800

Refactor code to use getSortKey() and replace regular expression with
simple string comparison in tree_dir_node.vim

Diffstat:
Mautoload/nerdtree.vim | 8++++----
Mlib/nerdtree/path.vim | 21+++++++++++++++++++++
Mlib/nerdtree/tree_dir_node.vim | 35++++++++++++++---------------------
3 files changed, 39 insertions(+), 25 deletions(-)
diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim
@@ -34,11 +34,11 @@ 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
+"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.sorting_token > a:n2.sorting_token
+    elseif a:n1.path.getSortKey() > a:n2.path.getSortKey()
         return 1
     else
         return 0
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,13 @@ 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 !~# '\/\.\/\?$'
+"
+        " 20150511
+        " 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 +410,13 @@ 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 !~# '\/\.\/\?$'
 
+            " 20150511
+            " 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,24 +514,7 @@ endfunction
 "directory priority.
 "
 function! s:TreeDirNode.sortChildren()
-    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
-
+    let CompareFunc = function("nerdtree#compareNodesBySortKey")
     call sort(self.children, CompareFunc)
 endfunction