From 4ec48739d164e1f8174bbbc25adfea60c850990c Mon Sep 17 00:00:00 2001 From: rzvxa Date: Mon, 21 Aug 2023 15:53:19 +0330 Subject: [PATCH 1/4] Added lazy refreshing for directory nodes --- lib/nerdtree/tree_dir_node.vim | 72 ++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index f5f76829..252c8fa0 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -459,6 +459,8 @@ function! s:TreeDirNode.New(path, nerdtree) let newTreeNode.isOpen = 0 let newTreeNode.children = [] + let newTreeNode.lazyRefresh = 0 + let newTreeNode.parent = {} let newTreeNode._nerdtree = a:nerdtree @@ -470,6 +472,13 @@ endfunction " are provided. Return 0 if options were processed. Otherwise, return the " number of new cached nodes. function! s:TreeDirNode.open(...) + echomsg 'open' + if self.lazyRefresh + let self.lazyRefresh = 2 + call nerdtree#echo('Please wait, refreshing a large dir ...') + call self.refresh() + call nerdtree#echo('') + endif let l:options = a:0 ? a:1 : {} " If special options were specified, process them and return. @@ -561,35 +570,40 @@ function! s:TreeDirNode.refresh() "if this node was ever opened, refresh its children if self.isOpen || !empty(self.children) - let files = self._glob('*', 1) + self._glob('.*', 0) - let newChildNodes = [] - let invalidFilesFound = 0 - for i in files - try - "create a new path and see if it exists in this nodes children - let path = g:NERDTreePath.New(i) - let newNode = self.getChild(path) - if newNode !=# {} - call newNode.refresh() - call add(newChildNodes, newNode) - - "the node doesnt exist so create it - else - let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) - let newNode.parent = self - call add(newChildNodes, newNode) - endif - catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ - let invalidFilesFound = 1 - endtry - endfor - - "swap this nodes children out for the children we just read/refreshed - let self.children = newChildNodes - call self.sortChildren() - - if invalidFilesFound - call nerdtree#echoWarning('some files could not be loaded into the NERD tree') + if g:NERDTreeLazyChildrenRefresh && !self.isOpen && self.lazyRefresh != 2 + let self.lazyRefresh = 1 + else + let files = self._glob('*', 1) + self._glob('.*', 0) + let newChildNodes = [] + let invalidFilesFound = 0 + for i in files + try + "create a new path and see if it exists in this nodes children + let path = g:NERDTreePath.New(i) + let newNode = self.getChild(path) + if newNode !=# {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound = 1 + endtry + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call nerdtree#echoWarning('some files could not be loaded into the NERD tree') + endif + let self.lazyRefresh = 0 endif endif endfunction From 377eaef3cfbad740e33d38b7e0aa3839b6181f72 Mon Sep 17 00:00:00 2001 From: rzvxa Date: Mon, 21 Aug 2023 18:26:15 +0330 Subject: [PATCH 2/4] Cleaned up lazy directory refreshing. Added some documentation. --- doc/NERDTree.txt | 14 ++++++ lib/nerdtree/tree_dir_node.vim | 91 ++++++++++++++++++---------------- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/doc/NERDTree.txt b/doc/NERDTree.txt index 55c25cd1..9f191eca 100644 --- a/doc/NERDTree.txt +++ b/doc/NERDTree.txt @@ -774,6 +774,8 @@ the NERDTree. These settings should be set in your vimrc, using `:let`. |NERDTreeCustomOpenArgs| A dictionary with values that control how a node is opened with the |NERDTree-| key. +|NERDTreeLazyDirRefresh| Enables lazy directory refreshing (experimental) + ------------------------------------------------------------------------------ 3.2. Customisation details *NERDTreeSettingsDetails* @@ -1304,6 +1306,18 @@ To open files and directories (creating a new NERDTree) in a new tab, > < To open a file always in the current tab, and expand directories in place, > {'file': {'reuse':'currenttab', 'where':'p', 'keepopen':1, 'stay':1}} +< +------------------------------------------------------------------------------ + *NERDTreeLazyDirRefresh* +Values: 0 or 1 +Default: 0 + +'experimental' + +If set to 1, the NERDTree will use lazy refresh on close directories whenever +a refresh action is performed. Actual refresh happens when it is required. +It happens on directory open and findNode functions. + < ============================================================================== 4. The NERDTree API *NERDTreeAPI* diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 252c8fa0..733d32b0 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -118,6 +118,7 @@ endfunction " path: a path object unlet s:TreeDirNode.findNode function! s:TreeDirNode.findNode(path) + call self.refresh(2) if a:path.equals(self.path) return self endif @@ -472,13 +473,7 @@ endfunction " are provided. Return 0 if options were processed. Otherwise, return the " number of new cached nodes. function! s:TreeDirNode.open(...) - echomsg 'open' - if self.lazyRefresh - let self.lazyRefresh = 2 - call nerdtree#echo('Please wait, refreshing a large dir ...') - call self.refresh() - call nerdtree#echo('') - endif + call self.refresh(2) let l:options = a:0 ? a:1 : {} " If special options were specified, process them and return. @@ -564,47 +559,55 @@ function! s:TreeDirNode.openRecursively() endfor endfunction -" FUNCTION: TreeDirNode.refresh() {{{1 -function! s:TreeDirNode.refresh() +" FUNCTION: TreeDirNode.refresh([options]) {{{1 +" refreshes the node and its children +" +" Args: +" An optional integer selecting refresh mode +" +" 0 == normal (default) +" 1 == force +" 2 == lazyRefresh +" +function! s:TreeDirNode.refresh(...) + let l:mode = a:0 ? a:1 : 0 call self.path.refresh(self.getNerdtree()) "if this node was ever opened, refresh its children - if self.isOpen || !empty(self.children) - if g:NERDTreeLazyChildrenRefresh && !self.isOpen && self.lazyRefresh != 2 - let self.lazyRefresh = 1 - else - let files = self._glob('*', 1) + self._glob('.*', 0) - let newChildNodes = [] - let invalidFilesFound = 0 - for i in files - try - "create a new path and see if it exists in this nodes children - let path = g:NERDTreePath.New(i) - let newNode = self.getChild(path) - if newNode !=# {} - call newNode.refresh() - call add(newChildNodes, newNode) - - "the node doesnt exist so create it - else - let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) - let newNode.parent = self - call add(newChildNodes, newNode) - endif - catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ - let invalidFilesFound = 1 - endtry - endfor - - "swap this nodes children out for the children we just read/refreshed - let self.children = newChildNodes - call self.sortChildren() - - if invalidFilesFound - call nerdtree#echoWarning('some files could not be loaded into the NERD tree') - endif - let self.lazyRefresh = 0 + if l:mode == 1 || self.isOpen || (!empty(self.children) && !g:NERDTreeLazyDirRefresh) || (l:mode == 2 && self.lazyRefresh) + let files = self._glob('*', 1) + self._glob('.*', 0) + let newChildNodes = [] + let invalidFilesFound = 0 + for i in files + try + "create a new path and see if it exists in this nodes children + let path = g:NERDTreePath.New(i) + let newNode = self.getChild(path) + if newNode !=# {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound = 1 + endtry + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call nerdtree#echoWarning('some files could not be loaded into the NERD tree') endif + let self.lazyRefresh = 0 + elseif g:NERDTreeLazyDirRefresh && !empty(self.children) + let self.lazyRefresh = 1 endif endfunction From bf798f7650c8425791f2df435cc73b0fffbb815e Mon Sep 17 00:00:00 2001 From: rzvxa Date: Mon, 21 Aug 2023 19:01:50 +0330 Subject: [PATCH 3/4] Updated documentation and comments --- lib/nerdtree/tree_dir_node.vim | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 733d32b0..83e1aa88 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -567,13 +567,15 @@ endfunction " " 0 == normal (default) " 1 == force -" 2 == lazyRefresh +" 2 == lazyRefresh (refreshes node only if lazyRefresh flag is set) " function! s:TreeDirNode.refresh(...) let l:mode = a:0 ? a:1 : 0 call self.path.refresh(self.getNerdtree()) - "if this node was ever opened, refresh its children + "if refresh is forced, refresh its children + "if this node is open, refresh its children + "if this node is flaged for lazyRefresh and lazyRefresh requested, refresh its children if l:mode == 1 || self.isOpen || (!empty(self.children) && !g:NERDTreeLazyDirRefresh) || (l:mode == 2 && self.lazyRefresh) let files = self._glob('*', 1) + self._glob('.*', 0) let newChildNodes = [] @@ -606,6 +608,7 @@ function! s:TreeDirNode.refresh(...) call nerdtree#echoWarning('some files could not be loaded into the NERD tree') endif let self.lazyRefresh = 0 + " if this node is not empty and NERDTreeLazyDirRefresh is enable flag the node for lazyRefresh elseif g:NERDTreeLazyDirRefresh && !empty(self.children) let self.lazyRefresh = 1 endif From 7f0a137a388cd10c9eadf38c383b2e0363e21190 Mon Sep 17 00:00:00 2001 From: rzvxa Date: Mon, 21 Aug 2023 20:51:56 +0330 Subject: [PATCH 4/4] Added missing global flag for lazy directory refresh --- plugin/NERD_tree.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index ef60cca1..890f412d 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -52,6 +52,7 @@ let g:NERDTreeShowFiles = get(g:, 'NERDTreeShowFiles', 1 let g:NERDTreeShowHidden = get(g:, 'NERDTreeShowHidden', 0) let g:NERDTreeShowLineNumbers = get(g:, 'NERDTreeShowLineNumbers', 0) let g:NERDTreeSortDirs = get(g:, 'NERDTreeSortDirs', 1) +let g:NERDTreeLazyDirRefresh = get(g:, 'NERDTreeLazyDirRefresh', 0) if !nerdtree#runningWindows() && !nerdtree#runningCygwin() let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '▸')