Compare commits

...

15 Commits

Author SHA1 Message Date
Martin Grenfell
090791407e switch to version 2.14.2 2008-10-29 20:14:08 +13:00
Martin Grenfell
cea02c6d98 update changelog and credits 2008-10-29 20:04:49 +13:00
Martin Grenfell
00ab690758 bugfix for doing :qa when a nerd tree is open in another tab 2008-10-28 21:03:39 +13:00
Martin Grenfell
d4b4d69469 when opening a file (with o), dont split unless there is no choice 2008-10-27 23:21:39 +13:00
Martin Grenfell
283559bd97 fix a bug where directories starting with + couldnt be opened 2008-10-19 23:06:32 +13:00
Martin Grenfell
38442b06d4 refactor code to find tree indent level 2008-10-19 23:06:09 +13:00
Martin Grenfell
ae0d744357 fix a backwards compatibility bug with maps
Do an unlet <old key> when over riding a method on a prototype object.
Some older versions of vim spaz out otherwise.

Note: i was using these unlets up until a few versions ago when the were
refactored out
2008-10-16 22:55:44 +13:00
Martin Grenfell
094074d8c6 correct version in changelog 2008-10-16 22:34:48 +13:00
Martin Grenfell
9b192b4be4 bump the version 2008-10-12 10:31:00 +13:00
Martin Grenfell
5fcdd03f12 refactor the help page slightly
put all the option help tags in single quotes
2008-10-01 23:17:34 +13:00
Martin Grenfell
d89dbd354a dont clobber &cpo 2008-10-01 23:17:33 +13:00
Martin Grenfell
ed273e108d minor refactor to Bookmark#toRoot() 2008-09-29 11:33:58 +13:00
Martin Grenfell
03dec4cde4 rename TreeFileNode#findOpenDirSiblingWithChildren
to TreeFileNode#findOpenDirSiblingWithVisibleChildren
2008-09-24 12:42:42 +12:00
Martin Grenfell
171c3825fa bug fix for TreeDirNode#hasVisibleChildren() 2008-09-24 12:42:15 +12:00
Martin Grenfell
be2e602efa make path.bookmarkNames private 2008-09-11 12:01:54 +12:00
2 changed files with 195 additions and 132 deletions

View File

@@ -122,7 +122,7 @@ For example, you could use bookmarks to tag all of your project directories.
2.2.1. The Bookmark Table *NERDTreeBookmarkTable* 2.2.1. The Bookmark Table *NERDTreeBookmarkTable*
If the bookmark table is active (see |NERDTree-B| and If the bookmark table is active (see |NERDTree-B| and
|NERDTreeShowBookmarks|), it will be rendered above the tree. You can double |'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double
click bookmarks or use the |NERDTree-o| mapping to activate them. See also, click bookmarks or use the |NERDTree-o| mapping to activate them. See also,
|NERDTree-t| and |NERDTree-T| |NERDTree-t| and |NERDTree-T|
@@ -160,7 +160,7 @@ Note that the following commands are only available in the NERD tree buffer.
Remove all bookmarks. Remove all bookmarks.
:ReadBookmarks :ReadBookmarks
Re-read the bookmarks in the |NERDTreeBookmarksFile|. Re-read the bookmarks in the |'NERDTreeBookmarksFile'|.
See also |:NERDTree| and |:NERDTreeFromBookmark|. See also |:NERDTree| and |:NERDTreeFromBookmark|.
@@ -171,7 +171,7 @@ If invalid bookmarks are detected, the script will issue an error message and
the invalid bookmarks will become unavailable for use. the invalid bookmarks will become unavailable for use.
These bookmarks will still be stored in the bookmarks file (see These bookmarks will still be stored in the bookmarks file (see
|NERDTreeBookmarksFile|), down the bottom. There will always be a blank line |'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line
after the valid bookmarks but before the invalid ones. after the valid bookmarks but before the invalid ones.
Each line in the bookmarks file represents one bookmark. The proper format is: Each line in the bookmarks file represents one bookmark. The proper format is:
@@ -314,8 +314,8 @@ Applies to: directories.
Recursively opens the selelected directory. Recursively opens the selelected directory.
All files and directories are cached, but if a directory would not be All files and directories are cached, but if a directory would not be
displayed due to file filters (see |NERDTreeIgnore| |NERDTree-f|) or the displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the
hidden file filter (see |NERDTreeShowHidden|) then its contents are not hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not
cached. This is handy, especially if you have .svn directories. cached. This is handy, especially if you have .svn directories.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@@ -477,7 +477,7 @@ Default key: f
Map option: NERDTreeMapToggleFilters Map option: NERDTreeMapToggleFilters
Applies to: no restrictions. Applies to: no restrictions.
Toggles whether file filters are used. See |NERDTreeIgnore| for details. Toggles whether file filters are used. See |'NERDTreeIgnore'| for details.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTree-F* *NERDTree-F*
@@ -561,53 +561,53 @@ then id be grateful if you'd email me.
The script provides the following options that can customise the behaviour the The script provides the following options that can customise the behaviour the
NERD tree. These options should be set in your vimrc. NERD tree. These options should be set in your vimrc.
|loaded_nerd_tree| Turns off the script. |'loaded_nerd_tree'| Turns off the script.
|NERDChristmasTree| Tells the NERD tree to make itself colourful |'NERDChristmasTree'| Tells the NERD tree to make itself colourful
and pretty. and pretty.
|NERDTreeAutoCenter| Controls whether the NERD tree window centers |'NERDTreeAutoCenter'| Controls whether the NERD tree window centers
when the cursor moves within a specified when the cursor moves within a specified
distance to the top/bottom of the window. distance to the top/bottom of the window.
|NERDTreeAutoCenterThreshold| Controls the sensitivity of autocentering. |'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering.
|NERDTreeCaseSensitiveSort| Tells the NERD tree whether to be case |'NERDTreeCaseSensitiveSort'| Tells the NERD tree whether to be case
sensitive or not when sorting nodes. sensitive or not when sorting nodes.
|NERDTreeChDirMode| Tells the NERD tree if/when it should change |'NERDTreeChDirMode'| Tells the NERD tree if/when it should change
vim's current working directory. vim's current working directory.
|NERDTreeHighlightCursorline| Tell the NERD tree whether to highlight the |'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the
current cursor line. current cursor line.
|NERDTreeIgnore| Tells the NERD tree which files to ignore. |'NERDTreeIgnore'| Tells the NERD tree which files to ignore.
|NERDTreeBookmarksFile| Where the bookmarks are stored. |'NERDTreeBookmarksFile'| Where the bookmarks are stored.
|NERDTreeMouseMode| Tells the NERD tree how to handle mouse |'NERDTreeMouseMode'| Tells the NERD tree how to handle mouse
clicks. clicks.
|NERDTreeQuitOnOpen| Closes the tree window after opening a file. |'NERDTreeQuitOnOpen'| Closes the tree window after opening a file.
|NERDTreeShowBookmarks| Tells the NERD tree whether to display the |'NERDTreeShowBookmarks'| Tells the NERD tree whether to display the
bookmarks table on startup. bookmarks table on startup.
|NERDTreeShowFiles| Tells the NERD tree whether to display files |'NERDTreeShowFiles'| Tells the NERD tree whether to display files
in the tree on startup. in the tree on startup.
|NERDTreeShowHidden| Tells the NERD tree whether to display hidden |'NERDTreeShowHidden'| Tells the NERD tree whether to display hidden
files on startup. files on startup.
|NERDTreeShowLineNumbers| Tells the NERD tree whether to display line |'NERDTreeShowLineNumbers'| Tells the NERD tree whether to display line
numbers in the tree window. numbers in the tree window.
|NERDTreeSortOrder| Tell the NERD tree how to sort the nodes in |'NERDTreeSortOrder'| Tell the NERD tree how to sort the nodes in
the tree. the tree.
|NERDTreeWinPos| Tells the script where to put the NERD tree |'NERDTreeWinPos'| Tells the script where to put the NERD tree
window. window.
|NERDTreeWinSize| Sets the window size when the NERD tree is |'NERDTreeWinSize'| Sets the window size when the NERD tree is
opened. opened.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@@ -616,13 +616,13 @@ NERD tree. These options should be set in your vimrc.
To enable any of the below options you should put the given line in your To enable any of the below options you should put the given line in your
~/.vimrc ~/.vimrc
*loaded_nerd_tree* *'loaded_nerd_tree'*
If this plugin is making you feel homicidal, it may be a good idea to turn it If this plugin is making you feel homicidal, it may be a good idea to turn it
off with this line in your vimrc: > off with this line in your vimrc: >
let loaded_nerd_tree=1 let loaded_nerd_tree=1
< <
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDChristmasTree* *'NERDChristmasTree'*
Values: 0 or 1. Values: 0 or 1.
Default: 1. Default: 1.
@@ -632,12 +632,12 @@ added to the nerd tree to make it more colourful.
Set it to 0 for a more vanilla looking tree. Set it to 0 for a more vanilla looking tree.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeAutoCenter* *'NERDTreeAutoCenter'*
Values: 0 or 1. Values: 0 or 1.
Default: 1 Default: 1
If set to 1, the NERD tree window will center around the cursor if it moves to If set to 1, the NERD tree window will center around the cursor if it moves to
within |NERDTreeAutoCenterThreshold| lines of the top/bottom of the window. within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window.
This is ONLY done in response to tree navigation mappings, This is ONLY done in response to tree navigation mappings,
i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-c-K| |NERDTree-p| i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-c-K| |NERDTree-p|
@@ -646,15 +646,15 @@ i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-c-K| |NERDTree-p|
The centering is done with a |zz| operation. The centering is done with a |zz| operation.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeAutoCenterThreshold* *'NERDTreeAutoCenterThreshold'*
Values: Any natural number. Values: Any natural number.
Default: 3 Default: 3
This option controls the "sensitivity" of the NERD tree auto centering. See This option controls the "sensitivity" of the NERD tree auto centering. See
|NERDTreeAutoCenter| for details. |'NERDTreeAutoCenter'| for details.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeCaseSensitiveSort* *'NERDTreeCaseSensitiveSort'*
Values: 0 or 1. Values: 0 or 1.
Default: 0. Default: 0.
@@ -675,7 +675,7 @@ account. The above nodes would then be sorted like this: >
boner.c boner.c
< <
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeChDirMode* *'NERDTreeChDirMode'*
Values: 0, 1 or 2. Values: 0, 1 or 2.
Default: 0. Default: 0.
@@ -698,7 +698,7 @@ is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new
root then the CWD will become /home/marty/foobar/baz. root then the CWD will become /home/marty/foobar/baz.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeHighlightCursorline* *'NERDTreeHighlightCursorline'*
Values: 0 or 1. Values: 0 or 1.
Default: 1. Default: 1.
@@ -706,13 +706,14 @@ If set to 1, the current cursor line in the NERD tree buffer will be
highlighted. This is done using the |cursorline| option. highlighted. This is done using the |cursorline| option.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeIgnore* *'NERDTreeIgnore'*
Values: a list of regular expressions. Values: a list of regular expressions.
Default: ['\~$']. Default: ['\~$'].
This option is used to specify which files the NERD tree should ignore. It This option is used to specify which files the NERD tree should ignore. It
must be a list of regular expressions. When the NERD tree is rendered, any must be a list of regular expressions. When the NERD tree is rendered, any
files/dirs that match any of the regex's in NERDTreeIgnore wont be displayed. files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be
displayed.
For example if you put the following line in your vimrc: > For example if you put the following line in your vimrc: >
let NERDTreeIgnore=['\.vim$', '\~$'] let NERDTreeIgnore=['\.vim$', '\~$']
@@ -728,14 +729,14 @@ The file filters can be turned on and off dynamically with the |NERDTree-f|
mapping. mapping.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeBookmarksFile* *'NERDTreeBookmarksFile'*
Values: a path Values: a path
Default: $HOME/.NERDTreeBookmarks Default: $HOME/.NERDTreeBookmarks
This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. This is where bookmarks are saved. See |NERDTreeBookmarkCommands|.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeMouseMode* *'NERDTreeMouseMode'*
Values: 1, 2 or 3. Values: 1, 2 or 3.
Default: 1. Default: 1.
@@ -753,7 +754,7 @@ then (to single click activate it) you must click somewhere in
'application.rb'. 'application.rb'.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeQuitOnOpen* *'NERDTreeQuitOnOpen'*
Values: 0 or 1. Values: 0 or 1.
Default: 0 Default: 0
@@ -762,16 +763,17 @@ If set to 1, the NERD tree window will close after opening a file with the
|NERDTree-o| or |NERDTree-tab| mappings. |NERDTree-o| or |NERDTree-tab| mappings.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeShowBookmarks* *'NERDTreeShowBookmarks'*
Values: 0 or 1. Values: 0 or 1.
Default: 0. Default: 0.
If this option is set to 1 then the bookmarks table will be displayed. If this option is set to 1 then the bookmarks table will be displayed.
This option can be toggled dynamically, per tree, with the |NERDTree-B| mapping. This option can be toggled dynamically, per tree, with the |NERDTree-B|
mapping.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeShowFiles* *'NERDTreeShowFiles'*
Values: 0 or 1. Values: 0 or 1.
Default: 1. Default: 1.
@@ -783,7 +785,7 @@ mapping and is useful for drastically shrinking the tree when you are
navigating to a different part of the tree. navigating to a different part of the tree.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeShowHidden* *'NERDTreeShowHidden'*
Values: 0 or 1. Values: 0 or 1.
Default: 0. Default: 0.
@@ -795,7 +797,7 @@ of the follow lines to set this option: >
< <
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeShowLineNumbers* *'NERDTreeShowLineNumbers'*
Values: 0 or 1. Values: 0 or 1.
Default: 0. Default: 0.
@@ -806,7 +808,7 @@ window. Use one of the follow lines to set this option: >
< <
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeSortOrder* *'NERDTreeSortOrder'*
Values: a list of regular expressions. Values: a list of regular expressions.
Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$']
@@ -821,8 +823,8 @@ all .h files. All files containing the string 'foobar' will be placed at the
end. The star is a special flag: it tells the script that every node that end. The star is a special flag: it tells the script that every node that
doesnt match any of the other regexps should be placed here. doesnt match any of the other regexps should be placed here.
If no star is present in NERDTreeSortOrder then one is automatically appended If no star is present in 'NERDTreeSortOrder' then one is automatically
to the array. appended to the array.
The regex '\/$' should be used to match directory nodes. The regex '\/$' should be used to match directory nodes.
@@ -839,7 +841,7 @@ Other examples: >
backup files will appear last with everything else preceding them. backup files will appear last with everything else preceding them.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeWinPos* *'NERDTreeWinPos'*
Values: "left", "right", "top" or "bottom" Values: "left", "right", "top" or "bottom"
Default: "left". Default: "left".
@@ -854,7 +856,7 @@ plugins simultaneously. For example, you could have the taglist plugin on the
left of the window and the NERD tree on the right. left of the window and the NERD tree on the right.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*NERDTreeWinSize* *'NERDTreeWinSize'*
Values: a positive integer. Values: a positive integer.
Default: 31. Default: 31.
@@ -899,6 +901,21 @@ fridge for later ;)
============================================================================== ==============================================================================
7. Changelog *NERDTreeChangelog* 7. Changelog *NERDTreeChangelog*
2.14.2
- when opening a file (with 'o' or double click) dont split the window
unless we absolutely have to. This should make the script work better
with other explorer plugins. Thanks to Ryan Penn, Simon Peter Nicholls
and Michael
- fix a bug where directories starting with a '+' char could not be opened.
Thanks to Tomasz Chomiuk.
- fix a bug where closing vim with :qa with a tree open in another tab
would break, thanks to Denis Pokataev.
- compatibility bugfix for older versions of vim, thanks to knekk for
helping me track it down and to Sean Chou.
2.14.1
- dont clobber &cpo. Thanks to godlygeek for the bug report.
2.14.0 2.14.0
- fix a bug where the <c-w>o mapping would cause the tree window to be - fix a bug where the <c-w>o mapping would cause the tree window to be
incorrectly sized when reopened. incorrectly sized when reopened.
@@ -938,8 +955,8 @@ fridge for later ;)
- applied a patch from Matan Nassau to add the NERDTreeQuitOnOpen option - applied a patch from Matan Nassau to add the NERDTreeQuitOnOpen option
which closes the tree window after opening a file. See :help which closes the tree window after opening a file. See :help
NERDTreeQuitOnOpen. NERDTreeQuitOnOpen.
- optimised the nerd tree rendering. Now it takes just over 1/3 of the time - optimised the nerd tree rendering. Now it takes just over 1/3 of the
it previously took to render. time it previously took to render.
- now the tree filter mappings toggle the filters "per tree" rather than - now the tree filter mappings toggle the filters "per tree" rather than
globally. The global filter variables are used to set the initial filter globally. The global filter variables are used to set the initial filter
settings for each new NERD tree. settings for each new NERD tree.
@@ -1015,9 +1032,9 @@ fridge for later ;)
and you use <c-j/k> the cursor will jump to its PARENTS next/previous and you use <c-j/k> the cursor will jump to its PARENTS next/previous
sibling. Go :help NERDTree-c-j and :help NERDTree-c-k for info. sibling. Go :help NERDTree-c-j and :help NERDTree-c-k for info.
- Extended the behaviour of the J/K mappings. Now if the cursor is on the - Extended the behaviour of the J/K mappings. Now if the cursor is on the
last child of a node and you push J/K it will jump down to the last child last child of a node and you push J/K it will jump down to the last
of the next/prev of its parents siblings that is open and has children. child of the next/prev of its parents siblings that is open and has
Go :help NERDTree-J and :help NERDTree-K for info. children. Go :help NERDTree-J and :help NERDTree-K for info.
- The goal of these changes is to make tree navigation faster. - The goal of these changes is to make tree navigation faster.
- Reorganised the help page a bit. - Reorganised the help page a bit.
- Removed the E mapping. - Removed the E mapping.
@@ -1057,8 +1074,8 @@ fridge for later ;)
- Tree navigation changes: - Tree navigation changes:
- Added J and K mappings to jump to last/first child of the current dir. - Added J and K mappings to jump to last/first child of the current dir.
Options to customise these mappings have also been added. Options to customise these mappings have also been added.
- Remapped the jump to next/prev sibling commands to be <C-j> and <C-k> by - Remapped the jump to next/prev sibling commands to be <C-j> and <C-k>
default. by default.
These changes should hopefully make tree navigation mappings easier to These changes should hopefully make tree navigation mappings easier to
remember and use as the j and k keys are simply reused 3 times (twice remember and use as the j and k keys are simply reused 3 times (twice
with modifier keys). with modifier keys).
@@ -1220,6 +1237,23 @@ NERDTreeQuitOnOpen was set.
Thanks to Charlton Wang for reporting bugs with the 'o' mapping and with Thanks to Charlton Wang for reporting bugs with the 'o' mapping and with
handling named pipes. handling named pipes.
Chur to godlygeek for reporting a bug where &cpo was getting clobbered.
Cheers to knekk for helping me track down a bug when overwriting dictionary
keys that only occurred in some versions of vim.
Thanks also to Sean Chou for the bug report about the above bug.
Thanks to Ryan Penn, Simon Peter Nicholls and Michael for pointing out an issue
where the script was splitting constantly when using the 'o' mapping while
other explorers were open.
Thanks to Tomasz Chomiuk for the bug report about the script failing when dir
names began with a +.
Thanks to Denis Pokataev for the bug report about the script failing when
closing vim with :qa with a tree open in another tab.
============================================================================== ==============================================================================
9. License *NERDTreeLicense* 9. License *NERDTreeLicense*

View File

@@ -2,7 +2,7 @@
" File: NERD_tree.vim " File: NERD_tree.vim
" Description: vim global plugin that provides a nice tree explorer " Description: vim global plugin that provides a nice tree explorer
" Maintainer: Martin Grenfell <martin_grenfell at msn dot com> " Maintainer: Martin Grenfell <martin_grenfell at msn dot com>
" Last Change: 20 July, 2008 " Last Change: 29 October, 2008
" License: This program is free software. It comes without any warranty, " License: This program is free software. It comes without any warranty,
" to the extent permitted by applicable law. You can redistribute " to the extent permitted by applicable law. You can redistribute
" it and/or modify it under the terms of the Do What The Fuck You " it and/or modify it under the terms of the Do What The Fuck You
@@ -10,7 +10,7 @@
" See http://sam.zoy.org/wtfpl/COPYING for more details. " See http://sam.zoy.org/wtfpl/COPYING for more details.
" "
" ============================================================================ " ============================================================================
let s:NERD_tree_version = '2.14.0' let s:NERD_tree_version = '2.14.2'
" SECTION: Script init stuff {{{1 " SECTION: Script init stuff {{{1
"============================================================ "============================================================
@@ -22,6 +22,11 @@ if v:version < 700
finish finish
endif endif
let loaded_nerd_tree = 1 let loaded_nerd_tree = 1
"for line continuation - i.e dont want C in &cpo
let s:old_cpo = &cpo
set cpo&vim
"Function: s:initVariable() function {{{2 "Function: s:initVariable() function {{{2
"This function is used to initialise a given variable to a given value. The "This function is used to initialise a given variable to a given value. The
"variable is only initialised if it does not exist prior "variable is only initialised if it does not exist prior
@@ -127,8 +132,7 @@ let s:escape_chars = " \\`\|\"#%&,?()\*^<>"
let s:NERDTreeWinName = '_NERD_tree_' let s:NERDTreeWinName = '_NERD_tree_'
let s:tree_wid = 2 let s:tree_wid = 2
let s:tree_markup_reg = '[ \-+~`|]' let s:tree_markup_reg = '^[ `|]*[\-+~]'
let s:tree_markup_reg_neg = '[^ \-+~`|]'
let s:tree_up_dir_line = '.. (up a dir)' let s:tree_up_dir_line = '.. (up a dir)'
let s:os_slash = '/' let s:os_slash = '/'
@@ -136,7 +140,6 @@ if s:running_windows
let s:os_slash = '\' let s:os_slash = '\'
endif endif
" SECTION: Commands {{{1 " SECTION: Commands {{{1
"============================================================ "============================================================
"init the command that users start the nerd tree with "init the command that users start the nerd tree with
@@ -355,7 +358,7 @@ endfunction
function! s:Bookmark.toRoot() function! s:Bookmark.toRoot()
if self.validate() if self.validate()
try try
let targetNode = s:Bookmark.GetNodeForName(self.name, 1) let targetNode = self.getNode(1)
catch /NERDTree.BookmarkedNodeNotFound/ catch /NERDTree.BookmarkedNodeNotFound/
let targetNode = s:TreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path) let targetNode = s:TreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path)
endtry endtry
@@ -495,7 +498,7 @@ function! s:TreeFileNode.findNode(path)
endif endif
return {} return {}
endfunction endfunction
"FUNCTION: TreeFileNode.findOpenDirSiblingWithChildren(direction) {{{3 "FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{3
" "
"Finds the next sibling for this node in the indicated direction. This sibling "Finds the next sibling for this node in the indicated direction. This sibling
"must be a directory and may/may not have children as specified. "must be a directory and may/may not have children as specified.
@@ -505,7 +508,7 @@ endfunction
" "
"Return: "Return:
"a treenode object or {} if no appropriate sibling could be found "a treenode object or {} if no appropriate sibling could be found
function! s:TreeFileNode.findOpenDirSiblingWithChildren(direction) function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction)
"if we have no parent then we can have no siblings "if we have no parent then we can have no siblings
if self.parent != {} if self.parent != {}
let nextSibling = self.findSibling(a:direction) let nextSibling = self.findSibling(a:direction)
@@ -708,6 +711,7 @@ endfunction
" "
"Args: "Args:
"path: a path object "path: a path object
unlet s:TreeDirNode.findNode
function! s:TreeDirNode.findNode(path) function! s:TreeDirNode.findNode(path)
if a:path.equals(self.path) if a:path.equals(self.path)
return self return self
@@ -726,7 +730,6 @@ function! s:TreeDirNode.findNode(path)
endif endif
return {} return {}
endfunction endfunction
"FUNCTION: TreeDirNode.getChildCount() {{{3 "FUNCTION: TreeDirNode.getChildCount() {{{3
"Returns the number of children this node has "Returns the number of children this node has
function! s:TreeDirNode.getChildCount() function! s:TreeDirNode.getChildCount()
@@ -824,7 +827,7 @@ endfunction
"FUNCTION: TreeDirNode.hasVisibleChildren() {{{3 "FUNCTION: TreeDirNode.hasVisibleChildren() {{{3
"returns 1 if this node has any childre, 0 otherwise.. "returns 1 if this node has any childre, 0 otherwise..
function! s:TreeDirNode.hasVisibleChildren() function! s:TreeDirNode.hasVisibleChildren()
return self.getChildCount() != 0 return self.getVisibleChildCount() != 0
endfunction endfunction
"FUNCTION: TreeDirNode._initChildren() {{{3 "FUNCTION: TreeDirNode._initChildren() {{{3
@@ -882,6 +885,7 @@ endfunction
" "
"Args: "Args:
"path: a path object representing the full filesystem path to the file/dir that the node represents "path: a path object representing the full filesystem path to the file/dir that the node represents
unlet s:TreeDirNode.New
function! s:TreeDirNode.New(path) function! s:TreeDirNode.New(path)
if a:path.isDirectory != 1 if a:path.isDirectory != 1
throw "NERDTree.TreeDirNode.InvalidArguments exception. A TreeDirNode object must be instantiated with a directory Path object." throw "NERDTree.TreeDirNode.InvalidArguments exception. A TreeDirNode object must be instantiated with a directory Path object."
@@ -943,6 +947,7 @@ function! s:TreeDirNode._openRecursively2(forceOpen)
endfunction endfunction
"FUNCTION: TreeDirNode.refresh() {{{3 "FUNCTION: TreeDirNode.refresh() {{{3
unlet s:TreeDirNode.refresh
function! s:TreeDirNode.refresh() function! s:TreeDirNode.refresh()
call self.path.refresh() call self.path.refresh()
@@ -1050,10 +1055,10 @@ endfunction
let s:Path = {} let s:Path = {}
"FUNCTION: Path.bookmarkNames() {{{3 "FUNCTION: Path.bookmarkNames() {{{3
function! s:Path.bookmarkNames() function! s:Path.bookmarkNames()
if !exists("self.bookmarkNames") if !exists("self._bookmarkNames")
call self.cacheDisplayString() call self.cacheDisplayString()
endif endif
return self.bookmarkNames return self._bookmarkNames
endfunction endfunction
"FUNCTION: Path.cacheDisplayString() {{{3 "FUNCTION: Path.cacheDisplayString() {{{3
function! s:Path.cacheDisplayString() function! s:Path.cacheDisplayString()
@@ -1063,14 +1068,14 @@ function! s:Path.cacheDisplayString()
let self.cachedDisplayString = self.cachedDisplayString . '*' let self.cachedDisplayString = self.cachedDisplayString . '*'
endif endif
let self.bookmarkNames = [] let self._bookmarkNames = []
for i in s:Bookmark.Bookmarks() for i in s:Bookmark.Bookmarks()
if i.path.equals(self) if i.path.equals(self)
call add(self.bookmarkNames, i.name) call add(self._bookmarkNames, i.name)
endif endif
endfor endfor
if !empty(self.bookmarkNames) if !empty(self._bookmarkNames)
let self.cachedDisplayString .= ' {' . join(self.bookmarkNames) . '}' let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}'
endif endif
if self.isSymLink if self.isSymLink
@@ -1828,9 +1833,6 @@ function! s:createTreeWin()
endif endif
" for line continuation
let cpo_save1 = &cpo
set cpo&vim
call s:bindMappings() call s:bindMappings()
setfiletype nerdtree setfiletype nerdtree
@@ -2059,7 +2061,7 @@ function! s:findNodeLineNumber(treenode)
let curLine = getline(lnum) let curLine = getline(lnum)
let indent = match(curLine,s:tree_markup_reg_neg) / s:tree_wid let indent = s:indentLevelFor(curLine)
if indent == curPathComponent if indent == curPathComponent
let curLine = s:stripMarkupFromLine(curLine, 1) let curLine = s:stripMarkupFromLine(curLine, 1)
@@ -2090,6 +2092,21 @@ function! s:findRootNodeLineNumber()
return rootLine return rootLine
endfunction endfunction
"FUNCTION: s:firstNormalWindow(){{{2
"find the window number of the first normal window
function! s:firstNormalWindow()
let i = 1
while i <= winnr("$")
let bnum = winbufnr(i)
if bnum != -1 && getbufvar(bnum, '&buftype') == ''
\ && !getwinvar(i, '&previewwindow')
return i
endif
let i += 1
endwhile
return -1
endfunction
"FUNCTION: s:getPath(ln) {{{2 "FUNCTION: s:getPath(ln) {{{2
"Gets the full path to the node that is rendered on the given line number "Gets the full path to the node that is rendered on the given line number
" "
@@ -2117,9 +2134,7 @@ function! s:getPath(ln)
return t:NERDTreeRoot.path.getParent() return t:NERDTreeRoot.path.getParent()
endif endif
"get the indent level for the file (i.e. how deep in the tree it is) let indent = s:indentLevelFor(line)
let indent = match(line, s:tree_markup_reg_neg) / s:tree_wid
"remove the tree parts and the leading space "remove the tree parts and the leading space
let curFile = s:stripMarkupFromLine(line, 0) let curFile = s:stripMarkupFromLine(line, 0)
@@ -2144,7 +2159,7 @@ function! s:getPath(ln)
break break
endif endif
if curLineStripped =~ '/$' if curLineStripped =~ '/$'
let lpindent = match(curLine,s:tree_markup_reg_neg) / s:tree_wid let lpindent = s:indentLevelFor(curLine)
if lpindent < indent if lpindent < indent
let indent = indent - 1 let indent = indent - 1
@@ -2207,12 +2222,14 @@ function! s:getTreeWinNum()
return -1 return -1
endif endif
endfunction endfunction
"FUNCTION: s:indentLevelFor(line) {{{2
function! s:indentLevelFor(line)
return match(a:line, '[^ \-+~`|]') / s:tree_wid
endfunction
"FUNCTION: s:isTreeOpen() {{{2 "FUNCTION: s:isTreeOpen() {{{2
function! s:isTreeOpen() function! s:isTreeOpen()
return s:getTreeWinNum() != -1 return s:getTreeWinNum() != -1
endfunction endfunction
" FUNCTION: s:jumpToChild(direction) {{{2 " FUNCTION: s:jumpToChild(direction) {{{2
" Args: " Args:
" direction: 0 if going to first child, 1 if going to last " direction: 0 if going to first child, 1 if going to last
@@ -2231,7 +2248,7 @@ function! s:jumpToChild(direction)
endif endif
if targetNode.equals(currentNode) if targetNode.equals(currentNode)
let siblingDir = currentNode.parent.findOpenDirSiblingWithChildren(a:direction) let siblingDir = currentNode.parent.findOpenDirSiblingWithVisibleChildren(a:direction)
if siblingDir != {} if siblingDir != {}
let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0 let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0
let targetNode = siblingDir.getChildByIndex(indx, 1) let targetNode = siblingDir.getChildByIndex(indx, 1)
@@ -2282,11 +2299,16 @@ function! s:openFileNode(treenode)
if winnr != -1 if winnr != -1
exec winnr . "wincmd w" exec winnr . "wincmd w"
elseif s:shouldSplitToOpen(winnr("#")) else
if s:windowIsUsable(winnr("#")) && s:firstNormalWindow() == -1
call s:openFileNodeSplit(a:treenode) call s:openFileNodeSplit(a:treenode)
else else
try try
if s:windowIsUsable(winnr("#"))
exec s:firstNormalWindow() . "wincmd w"
else
wincmd p wincmd p
endif
exec ("edit " . a:treenode.path.strForEditCmd()) exec ("edit " . a:treenode.path.strForEditCmd())
catch /^Vim\%((\a\+)\)\=:E37/ catch /^Vim\%((\a\+)\)\=:E37/
call s:putCursorInTreeWin() call s:putCursorInTreeWin()
@@ -2295,6 +2317,7 @@ function! s:openFileNode(treenode)
echo v:exception echo v:exception
endtry endtry
endif endif
endif
endfunction endfunction
"FUNCTION: s:openFileNodeSplit(treenode) {{{2 "FUNCTION: s:openFileNodeSplit(treenode) {{{2
@@ -2580,11 +2603,14 @@ endfunction
"scroll position "scroll position
function! s:saveScreenState() function! s:saveScreenState()
let win = winnr() let win = winnr()
try
call s:putCursorInTreeWin() call s:putCursorInTreeWin()
let t:NERDTreeOldPos = getpos(".") let t:NERDTreeOldPos = getpos(".")
let t:NERDTreeOldTopLine = line("w0") let t:NERDTreeOldTopLine = line("w0")
let t:NERDTreeOldWindowSize = s:shouldSplitVertically() ? winwidth("") : winheight("") let t:NERDTreeOldWindowSize = s:shouldSplitVertically() ? winwidth("") : winheight("")
exec win . "wincmd w" exec win . "wincmd w"
catch /NERDTree.view.InvalidOperation/
endtry
endfunction endfunction
"FUNCTION: s:setupSyntaxHighlighting() {{{2 "FUNCTION: s:setupSyntaxHighlighting() {{{2
@@ -2678,37 +2704,6 @@ function! s:setupSyntaxHighlighting()
hi def link NERDTreeCurrentNode Search hi def link NERDTreeCurrentNode Search
endfunction endfunction
"FUNCTION: s:shouldSplitToOpen() {{{2
"Returns 1 if opening a file from the tree in the given window requires it to
"be split
"
"Args:
"winnumber: the number of the window in question
function! s:shouldSplitToOpen(winnumber)
"gotta split if theres only one window (i.e. the NERD tree)
if winnr("$") == 1
return 1
endif
let oldwinnr = winnr()
exec a:winnumber . "wincmd p"
let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
let modified = &modified
exec oldwinnr . "wincmd p"
"if its a special window e.g. quickfix or another explorer plugin then we
"have to split
if specialWindow
return 1
endif
if &hidden
return 0
endif
return modified && s:bufInWindows(winbufnr(a:winnumber)) < 2
endfunction
" Function: s:shouldSplitVertically() {{{2 " Function: s:shouldSplitVertically() {{{2
" Returns 1 if g:NERDTreeWinPos is 'left' or 'right' " Returns 1 if g:NERDTreeWinPos is 'left' or 'right'
function! s:shouldSplitVertically() function! s:shouldSplitVertically()
@@ -2724,7 +2719,7 @@ endfunction
function! s:stripMarkupFromLine(line, removeLeadingSpaces) function! s:stripMarkupFromLine(line, removeLeadingSpaces)
let line = a:line let line = a:line
"remove the tree parts and the leading space "remove the tree parts and the leading space
let line = substitute (line,"^" . s:tree_markup_reg . "*","","") let line = substitute (line, s:tree_markup_reg,"","")
"strip off any read only flag "strip off any read only flag
let line = substitute (line, ' \[RO\]', "","") let line = substitute (line, ' \[RO\]', "","")
@@ -2772,6 +2767,37 @@ function! s:toggle(dir)
call s:initNerdTree(a:dir) call s:initNerdTree(a:dir)
endif endif
endfunction endfunction
"FUNCTION: s:windowIsUsable() {{{2
"Returns 1 if opening a file from the tree in the given window requires it to
"be split
"
"Args:
"winnumber: the number of the window in question
function! s:windowIsUsable(winnumber)
"gotta split if theres only one window (i.e. the NERD tree)
if winnr("$") == 1
return 1
endif
let oldwinnr = winnr()
exec a:winnumber . "wincmd p"
let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
let modified = &modified
exec oldwinnr . "wincmd p"
"if its a special window e.g. quickfix or another explorer plugin then we
"have to split
if specialWindow
return 1
endif
if &hidden
return 0
endif
return modified && s:bufInWindows(winbufnr(a:winnumber)) < 2
endfunction
"SECTION: Interface bindings {{{1 "SECTION: Interface bindings {{{1
"============================================================ "============================================================
"FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2 "FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2
@@ -2903,8 +2929,7 @@ function! s:checkForActivate()
"if they clicked a dir, check if they clicked on the + or ~ sign "if they clicked a dir, check if they clicked on the + or ~ sign
"beside it "beside it
if currentNode.path.isDirectory if currentNode.path.isDirectory
let reg = '^' . s:tree_markup_reg .'*[~+]$' if startToCur =~ s:tree_markup_reg . '$' && char =~ '[+~]'
if startToCur =~ reg
call s:activateNode(0) call s:activateNode(0)
return return
endif endif
@@ -3527,4 +3552,8 @@ function! s:upDir(keepState)
endif endif
endfunction endfunction
"reset &cpo back to users setting
let &cpo = s:old_cpo
" vim: set sw=4 sts=4 et fdm=marker: " vim: set sw=4 sts=4 et fdm=marker: