mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-09 11:53:48 -05:00
Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3cb3227d56 | ||
|
|
f183d60b13 | ||
|
|
8c8cd29142 | ||
|
|
83e8c144ed | ||
|
|
06c7c53127 | ||
|
|
ec682b1f9b | ||
|
|
7a15d9879f | ||
|
|
dea37444bc | ||
|
|
f5a20e5379 | ||
|
|
a0573c51b1 | ||
|
|
d0cb14c7ce | ||
|
|
f2b2327c24 | ||
|
|
9d5a940be3 | ||
|
|
38d91b66b0 | ||
|
|
65ebd30334 | ||
|
|
1998cef2b4 | ||
|
|
030cff2eda | ||
|
|
02facac20a | ||
|
|
7789ccb90a | ||
|
|
d497c9ae9c | ||
|
|
cdf1e8d6e9 | ||
|
|
5f4a002787 | ||
|
|
c34968d282 | ||
|
|
f76f983182 | ||
|
|
312ce93bb4 | ||
|
|
06776557cf | ||
|
|
d831cbf17b | ||
|
|
aad2259522 | ||
|
|
e1bd98fc7c | ||
|
|
7ca9b07b68 | ||
|
|
1532bf1922 | ||
|
|
ac544460e4 | ||
|
|
d2989eb3e0 | ||
|
|
73be034d5e | ||
|
|
b5d6736f76 | ||
|
|
1c38ffd30b | ||
|
|
8e4b3565f8 | ||
|
|
31445645f7 | ||
|
|
fc053917d8 | ||
|
|
201df0a782 | ||
|
|
b59a7cd979 | ||
|
|
8f7aed712b | ||
|
|
3e946b1b4f | ||
|
|
2a16431b2d | ||
|
|
6815622d2c | ||
|
|
5c32c2a226 | ||
|
|
b363396a93 | ||
|
|
87382097df |
@@ -22,7 +22,9 @@ CONTENTS *NERDTree-contents*
|
||||
1.Intro...................................|NERDTree|
|
||||
2.Functionality provided..................|NERDTreeFunctionality|
|
||||
2.1 Global commands...................|NERDTreeGlobalCommands|
|
||||
2.2 Bookmark commands.................|NERDTreeBookmarkCommands|
|
||||
2.2 Bookmarks.........................|NERDTreeBookmarks|
|
||||
2.2.1 The bookmark table..........|NERDTreeBookmarkTable|
|
||||
2.2.2 Bookmark commands...........|NERDTreeBookmarkCommands|
|
||||
2.3 NERD tree mappings................|NERDTreeMappings|
|
||||
2.4 The filesystem menu...............|NERDTreeFilesysMenu|
|
||||
3.Options.................................|NERDTreeOptions|
|
||||
@@ -110,18 +112,27 @@ The following features and functionality are provided by the NERD tree:
|
||||
Close the NERD tree in this tab.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
2.2. Bookmark Commands *NERDTreeBookmarkCommands*
|
||||
2.2. Bookmarks *NERDTreeBookmarks*
|
||||
|
||||
Bookmarks in the NERD tree are a way to tag files or directories of interest.
|
||||
For example, you could use bookmarks to tag all of your project directories.
|
||||
See also |:NERDTree| and |:NERDTreeFromBookmark|.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
2.2.1. The Bookmark Table *NERDTreeBookmarkTable*
|
||||
|
||||
If the bookmark table is active (see |NERDTree-B| and
|
||||
|NERDTreeShowBookmarks|), it will be rendered above the tree. You can double
|
||||
click bookmarks or use the |NERDTree-o| mapping to activate them. See also,
|
||||
|NERDTree-t| and |NERDTree-T|
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
2.2.2. Bookmark commands *NERDTreeBookmarkCommands*
|
||||
|
||||
Note that the following commands are only available in the NERD tree buffer.
|
||||
|
||||
:Bookmark <name>
|
||||
Bookmark the current node as <name>. If there is already a <name>
|
||||
bookmark, it is overwritten. <name> must consist of alphanumeric
|
||||
characters and underscores.
|
||||
bookmark, it is overwritten. <name> must not contain spaces.
|
||||
|
||||
:BookmarkToRoot <bookmark>
|
||||
Make the directory corresponding to <bookmark> the new root. If a treenode
|
||||
@@ -147,15 +158,17 @@ Note that the following commands are only available in the NERD tree buffer.
|
||||
:ClearAllBookmarks
|
||||
Remove all bookmarks.
|
||||
|
||||
See also |:NERDTree| and |:NERDTreeFromBookmark|.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
2.3. NERD tree Mappings *NERDTreeMappings*
|
||||
|
||||
Default Description~ help-tag~
|
||||
Key~
|
||||
|
||||
o.......Open selected file, or expand selected dir...............|NERDTree-o|
|
||||
o.......Open files, directories and bookmarks....................|NERDTree-o|
|
||||
go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go|
|
||||
t.......Open selected node in a new tab..........................|NERDTree-t|
|
||||
t.......Open selected node/bookmark in a new tab.................|NERDTree-t|
|
||||
T.......Same as 't' but keep the focus on the current tab........|NERDTree-T|
|
||||
<tab>...Open selected file in a split window.....................|NERDTree-tab|
|
||||
g<tab>..Same as <tab>, but leave the cursor on the NERDTree......|NERDTree-gtab|
|
||||
@@ -187,6 +200,7 @@ cd......Change the CWD to the dir of the selected node...........|NERDTree-cd|
|
||||
H.......Toggle whether hidden files displayed....................|NERDTree-H|
|
||||
f.......Toggle whether the file filters are used.................|NERDTree-f|
|
||||
F.......Toggle whether files are displayed.......................|NERDTree-F|
|
||||
B.......Toggle whether the bookmark table is displayed...........|NERDTree-B|
|
||||
|
||||
q.......Close the NERDTree window................................|NERDTree-q|
|
||||
?.......Toggle the display of the quick help.....................|NERDTree-?|
|
||||
@@ -197,8 +211,16 @@ Default key: o
|
||||
Map option: NERDTreeMapActivateNode
|
||||
Applies to: files and directories.
|
||||
|
||||
If a file node is selected, it is opened in the previous window. If a
|
||||
directory is selected it is opened or closed depending on its current state.
|
||||
If a file node is selected, it is opened in the previous window.
|
||||
|
||||
If a directory is selected it is opened or closed depending on its current
|
||||
state.
|
||||
|
||||
If a bookmark that links to a directory is selected then that directory
|
||||
becomes the new root.
|
||||
|
||||
If a bookmark that links to a file is selected then that file is opened in the
|
||||
previous window.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTree-go*
|
||||
@@ -221,6 +243,10 @@ Applies to: files and directories.
|
||||
Opens the selected file in a new tab. If a directory is selected, a netrw is
|
||||
opened in a new tab.
|
||||
|
||||
If a bookmark which points to a directory is selected, open a NERD tree for
|
||||
that directory in a new tab. If the bookmark points to a file, open that file
|
||||
in a new tab.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTree-T*
|
||||
Default key: T
|
||||
@@ -431,6 +457,14 @@ Applies to: no restrictions.
|
||||
|
||||
Toggles whether file nodes are displayed.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTree-B*
|
||||
Default key: B
|
||||
Map option: NERDTreeMapToggleBookmarks
|
||||
Applies to: no restrictions.
|
||||
|
||||
Toggles whether the bookmarks table is displayed.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTree-q*
|
||||
Default key: q
|
||||
@@ -523,6 +557,11 @@ NERD tree. These options should be set in your vimrc.
|
||||
|NERDTreeMouseMode| Tells the NERD tree how to handle mouse
|
||||
clicks.
|
||||
|
||||
|NERDTreeQuitOnOpen| Closes the tree window after opening a file.
|
||||
|
||||
|NERDTreeShowBookmarks| Tells the NERD tree whether to display the
|
||||
bookmarks table on startup.
|
||||
|
||||
|NERDTreeShowFiles| Tells the NERD tree whether to display files
|
||||
in the tree on startup.
|
||||
|
||||
@@ -535,14 +574,9 @@ NERD tree. These options should be set in your vimrc.
|
||||
|NERDTreeSortOrder| Tell the NERD tree how to sort the nodes in
|
||||
the tree.
|
||||
|
||||
|NERDTreeSplitVertical| Tells the script whether the NERD tree should
|
||||
be created by splitting the window vertically
|
||||
or horizontally.
|
||||
|
||||
|NERDTreeWinPos| Tells the script where to put the NERD tree
|
||||
window.
|
||||
|
||||
|
||||
|NERDTreeWinSize| Sets the window size when the NERD tree is
|
||||
opened.
|
||||
|
||||
@@ -693,6 +727,24 @@ itself. For example, if you have the following node: >
|
||||
then (to single click activate it) you must click somewhere in
|
||||
'application.rb'.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeQuitOnOpen*
|
||||
|
||||
Values: 0 or 1.
|
||||
Default: 0
|
||||
|
||||
If set to 1, the NERD tree window will close after opening a file with the
|
||||
|NERDTree-o| or |NERDTree-tab| mappings.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeShowBookmarks*
|
||||
Values: 0 or 1.
|
||||
Default: 0.
|
||||
|
||||
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.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeShowFiles*
|
||||
Values: 0 or 1.
|
||||
@@ -701,9 +753,9 @@ Default: 1.
|
||||
If this option is set to 1 then files are displayed in the NERD tree. If it is
|
||||
set to 0 then only directories are displayed.
|
||||
|
||||
This option can be toggled dynamically with the |NERDTree-F| mapping and is
|
||||
useful for drastically shrinking the tree when you are navigating to a
|
||||
different part of the tree.
|
||||
This option can be toggled dynamically, per tree, with the |NERDTree-F|
|
||||
mapping and is useful for drastically shrinking the tree when you are
|
||||
navigating to a different part of the tree.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeShowHidden*
|
||||
@@ -711,8 +763,8 @@ Values: 0 or 1.
|
||||
Default: 0.
|
||||
|
||||
This option tells vim whether to display hidden files by default. This option
|
||||
can be dynamically toggled with the |NERDTree-H| mapping.
|
||||
Use one of the follow lines to set this option: >
|
||||
can be dynamically toggled, per tree, with the |NERDTree-H| mapping. Use one
|
||||
of the follow lines to set this option: >
|
||||
let NERDTreeShowHidden=0
|
||||
let NERDTreeShowHidden=1
|
||||
<
|
||||
@@ -761,30 +813,16 @@ Other examples: >
|
||||
3. Dirs will appear first, then ruby and php. Swap files, bak files and vim
|
||||
backup files will appear last with everything else preceding them.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeSplitVertical*
|
||||
Values: 0 or 1.
|
||||
Default: 1.
|
||||
|
||||
This option, along with |NERDTreeWinPos|, is used to determine where the NERD
|
||||
tree window appears.
|
||||
|
||||
If it is set to 1 then the NERD tree window will appear on either the left or
|
||||
right side of the screen (depending on the |NERDTreeWinPos| option).
|
||||
|
||||
If it set to 0 then the NERD tree window will appear at the top of the screen.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeWinPos*
|
||||
Values: 0 or 1.
|
||||
Default: 1.
|
||||
Values: "left", "right", "top" or "bottom"
|
||||
Default: "left".
|
||||
|
||||
This option works in conjunction with the |NERDTreeSplitVertical| option to
|
||||
determine where NERD tree window is placed on the screen.
|
||||
This option is used to determine where NERD tree window is placed on the
|
||||
screen.
|
||||
|
||||
If the option is set to 1 then the NERD tree will appear on the left or top of
|
||||
the screen (depending on the value of |NERDTreeSplitVertical|). If set to 0,
|
||||
the window will appear on the right or bottom of the screen.
|
||||
"top" or "bottom", will cause a horizontal split to be created for the tree,
|
||||
while "left" and "right" will cause a vertical split.
|
||||
|
||||
This option is makes it possible to use two different explorer type
|
||||
plugins simultaneously. For example, you could have the taglist plugin on the
|
||||
@@ -836,6 +874,26 @@ fridge for later ;)
|
||||
==============================================================================
|
||||
7. Changelog *NERDTreeChangelog*
|
||||
|
||||
2.12.0
|
||||
- added a UI for bookmarks. See :help NERDTreeBookmarkTable for details.
|
||||
Thanks to Zhang Shuhan for testing and bug reports.
|
||||
- relaxed the restrictions on bookmark names, now the only restriction is
|
||||
that they cant contain spaces. This allows for e.g. Chinese bookmark
|
||||
names. Thanks to Zhang Shuhan for the suggestion.
|
||||
- combined the NERDTreeWinPos and NERDTreeSplitVertical options. See :help
|
||||
NERDTreeWinPos.
|
||||
- applied a patch from Matan Nassau to add the NERDTreeQuitOnOpen option
|
||||
which closes the tree window after opening a file. See :help
|
||||
NERDTreeQuitOnOpen.
|
||||
- optimised the nerd tree rendering. Now it takes just over 1/3 of the time
|
||||
it previously took to render.
|
||||
- now the tree filter mappings toggle the filters "per tree" rather than
|
||||
globally. The global filter variables are used to set the initial filter
|
||||
settings for each new NERD tree.
|
||||
- fix to window resizing when opening a file when NERD tree is the only
|
||||
window open
|
||||
- other fixes
|
||||
|
||||
2.11.0
|
||||
- changes to the 'o' mapping when opening files:
|
||||
- dont clobber "special" windows (eg taglist/quickfix/etc). This should
|
||||
@@ -1089,7 +1147,8 @@ Thanks to Olivier Yiptong for prompting me to make line numbers in the
|
||||
NERD tree window optional.
|
||||
|
||||
Thanks to Zhang Shuhan for all of his emails and testing to help improve the
|
||||
NERD tree path handling.
|
||||
NERD tree path handling. Thanks also for suggesting the bookmarks gui, and for
|
||||
testing and making suggestions and bugreports.
|
||||
|
||||
Thanks to Cory Echols for sending a patch to add the :NERDTreeClose command and
|
||||
set the NERD tree buffers filetype to 'nerdtree'
|
||||
@@ -1100,6 +1159,7 @@ feature.
|
||||
Thanks to Yuan Jiang for suggesting the "o" mapping shouldnt clobber "special"
|
||||
windows, like taglist.
|
||||
|
||||
Thanks to Matan Nassau for the patch to add the NERDTreeQuitOnOpen option.
|
||||
==============================================================================
|
||||
9. License *NERDTreeLicense*
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
" File: NERD_tree.vim
|
||||
" Description: vim global plugin that provides a nice tree explorer
|
||||
" Maintainer: Martin Grenfell <martin_grenfell at msn dot com>
|
||||
" Last Change: 23 June, 2008
|
||||
" Last Change: 5 July, 2008
|
||||
" License: This program is free software. It comes without any warranty,
|
||||
" 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
|
||||
@@ -10,7 +10,7 @@
|
||||
" See http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||
"
|
||||
" ============================================================================
|
||||
let s:NERD_tree_version = '2.11.0'
|
||||
let s:NERD_tree_version = '2.12.0'
|
||||
|
||||
" SECTION: Script init stuff {{{1
|
||||
"============================================================
|
||||
@@ -53,6 +53,8 @@ call s:InitVariable("g:NERDTreeHighlightCursorline", 1)
|
||||
call s:InitVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks')
|
||||
call s:InitVariable("g:NERDTreeMouseMode", 1)
|
||||
call s:InitVariable("g:NERDTreeNotificationThreshold", 100)
|
||||
call s:InitVariable("g:NERDTreeQuitOnOpen", 0)
|
||||
call s:InitVariable("g:NERDTreeShowBookmarks", 0)
|
||||
call s:InitVariable("g:NERDTreeShowFiles", 1)
|
||||
call s:InitVariable("g:NERDTreeShowHidden", 0)
|
||||
call s:InitVariable("g:NERDTreeShowLineNumbers", 0)
|
||||
@@ -71,8 +73,7 @@ endif
|
||||
"once here
|
||||
let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
|
||||
|
||||
call s:InitVariable("g:NERDTreeSplitVertical", 1)
|
||||
call s:InitVariable("g:NERDTreeWinPos", 1)
|
||||
call s:InitVariable("g:NERDTreeWinPos", "left")
|
||||
call s:InitVariable("g:NERDTreeWinSize", 31)
|
||||
|
||||
let s:running_windows = has("win16") || has("win32") || has("win64")
|
||||
@@ -113,6 +114,7 @@ call s:InitVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit)
|
||||
call s:InitVariable("g:NERDTreeMapQuit", "q")
|
||||
call s:InitVariable("g:NERDTreeMapRefresh", "r")
|
||||
call s:InitVariable("g:NERDTreeMapRefreshRoot", "R")
|
||||
call s:InitVariable("g:NERDTreeMapToggleBookmarks", "B")
|
||||
call s:InitVariable("g:NERDTreeMapToggleFiles", "F")
|
||||
call s:InitVariable("g:NERDTreeMapToggleFilters", "f")
|
||||
call s:InitVariable("g:NERDTreeMapToggleHidden", "H")
|
||||
@@ -140,22 +142,198 @@ endif
|
||||
command! -n=? -complete=dir NERDTree :call s:InitNerdTree('<args>')
|
||||
command! -n=? -complete=dir NERDTreeToggle :call s:Toggle('<args>')
|
||||
command! -n=0 NERDTreeClose :call s:CloseTreeIfOpen()
|
||||
command! -n=1 -complete=customlist,s:FindBookmarks NERDTreeFromBookmark call s:InitNerdTree('<args>')
|
||||
command! -n=1 -complete=customlist,s:CompleteBookmarks NERDTreeFromBookmark call s:InitNerdTree('<args>')
|
||||
" SECTION: Auto commands {{{1
|
||||
"============================================================
|
||||
"Save the cursor position whenever we close the nerd tree
|
||||
exec "autocmd BufWinLeave *". s:NERDTreeWinName ."* :call <SID>SaveScreenState()"
|
||||
"cache bookmarks when vim loads
|
||||
autocmd VimEnter * call <SID>ReadBookmarks()
|
||||
autocmd VimEnter * call s:oBookmark.CacheBookmarks()
|
||||
|
||||
"SECTION: Classes {{{1
|
||||
"============================================================
|
||||
"CLASS: oBookmark {{{2
|
||||
"============================================================
|
||||
let s:oBookmark = {}
|
||||
" FUNCTION: oBookmark.AddBookmark(name, path) {{{3
|
||||
" Class method to add a new bookmark to the list, if a previous bookmark exists
|
||||
" with the same name, just update the path for that bookmark
|
||||
function! s:oBookmark.AddBookmark(name, path) dict
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
if i.name == a:name
|
||||
let i.path = a:path
|
||||
return
|
||||
endif
|
||||
endfor
|
||||
call add(s:oBookmark.Bookmarks(), s:oBookmark.New(a:name, a:path))
|
||||
call s:oBookmark.Sort()
|
||||
endfunction
|
||||
" Function: oBookmark.Bookmarks() {{{3
|
||||
" Class method to get all bookmarks. Lazily initializes the bookmarks global
|
||||
" variable
|
||||
function! s:oBookmark.Bookmarks() dict
|
||||
if !exists("g:NERDTreeBookmarks")
|
||||
let g:NERDTreeBookmarks = []
|
||||
endif
|
||||
return g:NERDTreeBookmarks
|
||||
endfunction
|
||||
" Function: oBookmark.BookmarkFor(name) {{{3
|
||||
" Class method to get the bookmark that has the given name. {} is return if no
|
||||
" bookmark is found
|
||||
function! s:oBookmark.BookmarkFor(name) dict
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
if i.name == a:name
|
||||
return i
|
||||
endif
|
||||
endfor
|
||||
return {}
|
||||
endfunction
|
||||
" Function: oBookmark.BookmarkNames() {{{3
|
||||
" Class method to return an array of all bookmark names
|
||||
function! s:oBookmark.BookmarkNames() dict
|
||||
let names = []
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
call add(names, i.name)
|
||||
endfor
|
||||
return names
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.CacheBookmarks() {{{3
|
||||
" Class method to read all bookmarks from the bookmarks file intialize
|
||||
" bookmark objects for each one.
|
||||
function! s:oBookmark.CacheBookmarks() dict
|
||||
if filereadable(g:NERDTreeBookmarksFile)
|
||||
let bookmarks = []
|
||||
let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
|
||||
let invalidBookmarksFound = 0
|
||||
for i in bookmarkStrings
|
||||
let name = substitute(i, '^\(.\{-}\) .*$', '\1', '')
|
||||
let path = substitute(i, '^.\{-} \(.*\)$', '\1', '')
|
||||
|
||||
try
|
||||
let bookmark = s:oBookmark.New(name, s:oPath.New(path))
|
||||
call add(bookmarks, bookmark)
|
||||
catch /NERDTree.Path.InvalidArguments/
|
||||
let invalidBookmarksFound += 1
|
||||
endtry
|
||||
endfor
|
||||
let g:NERDTreeBookmarks = bookmarks
|
||||
if invalidBookmarksFound
|
||||
call s:Echo(invalidBookmarksFound . " invalid bookmarks were read and discarded")
|
||||
call s:oBookmark.Write()
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.CompareTo(otherbookmark) {{{3
|
||||
" Compare these two bookmarks for sorting purposes
|
||||
function! s:oBookmark.CompareTo(otherbookmark) dict
|
||||
return a:otherbookmark.name < self.name
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.ClearAll() {{{3
|
||||
" Class method to delete all bookmarks.
|
||||
function! s:oBookmark.ClearAll() dict
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
call i.Delete()
|
||||
endfor
|
||||
call s:oBookmark.Write()
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.Delete() {{{3
|
||||
" Delete this bookmark. If the node for this bookmark is under the current
|
||||
" root, then recache bookmarks for its Path object
|
||||
function! s:oBookmark.Delete() dict
|
||||
let node = {}
|
||||
try
|
||||
let node = self.GetNode(1)
|
||||
catch /NERDTree.BookmarkNotFound/
|
||||
endtry
|
||||
call remove(s:oBookmark.Bookmarks(), index(s:oBookmark.Bookmarks(), self))
|
||||
if !empty(node)
|
||||
call node.path.CacheDisplayString()
|
||||
endif
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.GetNode(searchFromAbsoluteRoot) {{{3
|
||||
" Gets the treenode for this bookmark
|
||||
"
|
||||
" Args:
|
||||
" searchFromAbsoluteRoot: specifies whether we should search from the current
|
||||
" tree root, or the highest cached node
|
||||
function! s:oBookmark.GetNode(searchFromAbsoluteRoot) dict
|
||||
let searchRoot = a:searchFromAbsoluteRoot ? s:AbsoluteTreeRoot() : t:NERDTreeRoot
|
||||
let targetNode = searchRoot.FindNode(self.path)
|
||||
if empty(targetNode)
|
||||
throw "NERDTree.BookmarkNotFound no node was found for bookmark: " . self.name
|
||||
endif
|
||||
return targetNode
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.GetNodeForName(name, searchFromAbsoluteRoot) {{{3
|
||||
" Class method that finds the bookmark with the given name and returns the
|
||||
" treenode for it.
|
||||
function! s:oBookmark.GetNodeForName(name, searchFromAbsoluteRoot) dict
|
||||
let bookmark = s:oBookmark.BookmarkFor(a:name)
|
||||
if bookmark == {}
|
||||
throw "NERDTree.BookmarkNotFound no node was found for bookmark: " . a:name
|
||||
endif
|
||||
return bookmark.GetNode(a:searchFromAbsoluteRoot)
|
||||
endfunction
|
||||
" FUNCTION: oBookmark.New(name, path) {{{3
|
||||
" Create a new bookmark object with the given name and path object
|
||||
function! s:oBookmark.New(name, path) dict
|
||||
if a:name =~ ' '
|
||||
throw "NERDTree.IllegalBookmarkName illegal name:" . a:name
|
||||
endif
|
||||
|
||||
let newBookmark = copy(self)
|
||||
let newBookmark.name = a:name
|
||||
let newBookmark.path = a:path
|
||||
return newBookmark
|
||||
endfunction
|
||||
" Function: oBookmark.Sort() {{{3
|
||||
" Class method that sorts all bookmarks
|
||||
function! s:oBookmark.Sort() dict
|
||||
let CompareFunc = function("s:CompareBookmarks")
|
||||
call sort(s:oBookmark.Bookmarks(), CompareFunc)
|
||||
endfunction
|
||||
" Function: oBookmark.Str() {{{3
|
||||
" Get the string that should be rendered in the view for this bookmark
|
||||
function! s:oBookmark.Str() dict
|
||||
let pathStrMaxLen = winwidth(s:GetTreeWinNum()) - 5 - len(self.name)
|
||||
if &nu
|
||||
let pathStrMaxLen = pathStrMaxLen - &numberwidth
|
||||
endif
|
||||
|
||||
let pathStr = self.path.StrForOS(0)
|
||||
if len(pathStr) > pathStrMaxLen
|
||||
let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen)
|
||||
endif
|
||||
return '>' . self.name . ' [' . pathStr . ']'
|
||||
endfunction
|
||||
" Function: oBookmark.Write() {{{3
|
||||
" Class method to write all bookmarks to the bookmarks file
|
||||
function! s:oBookmark.Write() dict
|
||||
let bookmarkStrings = []
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
call add(bookmarkStrings, i.name . ' ' . i.path.StrForOS(0))
|
||||
endfor
|
||||
call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
|
||||
endfunction
|
||||
"CLASS: oTreeFileNode {{{2
|
||||
"This class is the parent of the oTreeDirNode class and constitures the
|
||||
"'Component' part of the composite design pattern between the treenode
|
||||
"classes.
|
||||
"============================================================
|
||||
let s:oTreeFileNode = {}
|
||||
"FUNCTION: oTreeFileNode.Bookmark(name) {{{3
|
||||
"bookmark this node with a:name
|
||||
function! s:oTreeFileNode.Bookmark(name) dict
|
||||
try
|
||||
let oldMarkedNode = s:oBookmark.GetNodeForName(a:name, 1)
|
||||
call oldMarkedNode.path.CacheDisplayString()
|
||||
catch /NERDTree.Bookmark\(DoesntExist\|NotFound\)/
|
||||
endtry
|
||||
|
||||
call s:oBookmark.AddBookmark(a:name, self.path)
|
||||
call self.path.CacheDisplayString()
|
||||
call s:oBookmark.Write()
|
||||
endfunction
|
||||
"FUNCTION: oTreeFileNode.CacheParent {{{3
|
||||
"initializes self.parent if it isnt already
|
||||
function! s:oTreeFileNode.CacheParent() dict
|
||||
@@ -181,13 +359,12 @@ endfunction
|
||||
|
||||
"FUNCTION: oTreeFileNode.ClearBookmarks() {{{3
|
||||
function! s:oTreeFileNode.ClearBookmarks() dict
|
||||
let bookmarks = s:GetBookmarks()
|
||||
for i in keys(bookmarks)
|
||||
if bookmarks[i].Equals(self.path)
|
||||
call remove(bookmarks, i)
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
if i.path.Equals(self.path)
|
||||
call i.Delete()
|
||||
end
|
||||
endfor
|
||||
call self.path.CacheBookmarkNames()
|
||||
call self.path.CacheDisplayString()
|
||||
endfunction
|
||||
"FUNCTION: oTreeFileNode.Copy(dest) {{{3
|
||||
function! s:oTreeFileNode.Copy(dest) dict
|
||||
@@ -811,24 +988,38 @@ endfunction
|
||||
"CLASS: oPath {{{2
|
||||
"============================================================
|
||||
let s:oPath = {}
|
||||
let oPath = s:oPath
|
||||
"FUNCTION: oPath.BookmarkNames() {{{3
|
||||
function! s:oPath.BookmarkNames() dict
|
||||
if !exists("self.bookmarkNames")
|
||||
call self.CacheBookmarkNames()
|
||||
if !exists("self.bookmark")
|
||||
call self.CacheDisplayString()
|
||||
endif
|
||||
return self.bookmarkNames
|
||||
endfunction
|
||||
"FUNCTION: oPath.CacheBookmarkNames() {{{3
|
||||
function! s:oPath.CacheBookmarkNames() dict
|
||||
let self.bookmarkNames = []
|
||||
let bookmarks = s:GetBookmarks()
|
||||
for k in keys(bookmarks)
|
||||
if bookmarks[k].Equals(self)
|
||||
call add(self.bookmarkNames, k)
|
||||
"FUNCTION: oPath.CacheDisplayString() {{{3
|
||||
function! s:oPath.CacheDisplayString() dict
|
||||
let self.cachedDisplayString = self.GetLastPathComponent(1)
|
||||
|
||||
if self.isExecutable
|
||||
let self.cachedDisplayString = self.cachedDisplayString . '*'
|
||||
endif
|
||||
|
||||
let bookmarkNames = []
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
if i.path.Equals(self)
|
||||
call add(bookmarkNames, i.name)
|
||||
endif
|
||||
endfor
|
||||
return self.bookmarkNames
|
||||
if !empty(bookmarkNames)
|
||||
let self.cachedDisplayString .= ' {' . join(bookmarkNames) . '}'
|
||||
endif
|
||||
|
||||
if self.isSymLink
|
||||
let self.cachedDisplayString .= ' -> ' . self.symLinkDest
|
||||
endif
|
||||
|
||||
if self.isReadOnly
|
||||
let self.cachedDisplayString .= ' [RO]'
|
||||
endif
|
||||
endfunction
|
||||
"FUNCTION: oPath.ChangeToDir() {{{3
|
||||
function! s:oPath.ChangeToDir() dict
|
||||
@@ -1095,11 +1286,11 @@ function! s:oPath.Ignore() dict
|
||||
endif
|
||||
|
||||
"dont show hidden files unless instructed to
|
||||
if g:NERDTreeShowHidden == 0 && lastPathComponent =~ '^\.'
|
||||
if t:NERDTreeShowHidden == 0 && lastPathComponent =~ '^\.'
|
||||
return 1
|
||||
endif
|
||||
|
||||
if g:NERDTreeShowFiles == 0 && self.isDirectory == 0
|
||||
if t:NERDTreeShowFiles == 0 && self.isDirectory == 0
|
||||
return 1
|
||||
endif
|
||||
|
||||
@@ -1135,6 +1326,8 @@ function! s:oPath.New(fullpath) dict
|
||||
|
||||
call newPath.ReadInfoFromDisk(a:fullpath)
|
||||
|
||||
let newPath.cachedDisplayString = ""
|
||||
|
||||
return newPath
|
||||
endfunction
|
||||
|
||||
@@ -1191,7 +1384,7 @@ endfunction
|
||||
"FUNCTION: oPath.Refresh() {{{3
|
||||
function! s:oPath.Refresh() dict
|
||||
call self.ReadInfoFromDisk(self.StrForOS(0))
|
||||
call self.CacheBookmarkNames()
|
||||
call self.CacheDisplayString()
|
||||
endfunction
|
||||
|
||||
"FUNCTION: oPath.Rename() {{{3
|
||||
@@ -1258,26 +1451,11 @@ endfunction
|
||||
"Return:
|
||||
"a string that can be used in the view to represent this path
|
||||
function! s:oPath.StrDisplay() dict
|
||||
let toReturn = self.GetLastPathComponent(1)
|
||||
|
||||
if self.isExecutable
|
||||
let toReturn = toReturn . '*'
|
||||
if self.cachedDisplayString == ""
|
||||
call self.CacheDisplayString()
|
||||
endif
|
||||
|
||||
let bookmarks = self.BookmarkNames()
|
||||
if !empty(bookmarks)
|
||||
let toReturn .= ' {' . join(bookmarks, ',') . '}'
|
||||
endif
|
||||
|
||||
if self.isSymLink
|
||||
let toReturn .= ' -> ' . self.symLinkDest
|
||||
endif
|
||||
|
||||
if self.isReadOnly
|
||||
let toReturn .= ' [RO]'
|
||||
endif
|
||||
|
||||
return toReturn
|
||||
return self.cachedDisplayString
|
||||
endfunction
|
||||
|
||||
"FUNCTION: oPath.StrForEditCmd() {{{3
|
||||
@@ -1343,15 +1521,6 @@ function! s:oPath.StrTrunk() dict
|
||||
return self.drive . '/' . join(self.pathSegments[0:-2], '/')
|
||||
endfunction
|
||||
|
||||
"FUNCTION: oPath.UncacheBookmark(name){{{3
|
||||
"remove the given bookmark from this paths cached bookmarks
|
||||
function! s:oPath.UncacheBookmark(name) dict
|
||||
let bookmarks = self.BookmarkNames()
|
||||
let i = index(bookmarks, a:name)
|
||||
if i != -1
|
||||
call remove(bookmarks, i)
|
||||
endif
|
||||
endfunction
|
||||
"FUNCTION: oPath.WinToUnixPath(pathstr){{{3
|
||||
"Takes in a windows path and returns the unix equiv
|
||||
"
|
||||
@@ -1419,42 +1588,16 @@ function! s:BufInWindows(bnum)
|
||||
return cnt
|
||||
endfunction " >>>
|
||||
|
||||
"FUNCTION: s:ClearAllBookmarks() {{{2
|
||||
"delete all bookmarks
|
||||
function! s:ClearAllBookmarks()
|
||||
for name in keys(g:NERDTreeBookmarks)
|
||||
let node = {}
|
||||
try
|
||||
let node = s:GetNodeForBookmark(name, 1)
|
||||
catch /NERDTree/
|
||||
endtry
|
||||
call remove(g:NERDTreeBookmarks, name)
|
||||
if !empty(node)
|
||||
call node.path.CacheBookmarkNames()
|
||||
endif
|
||||
endfor
|
||||
call s:WriteBookmarks()
|
||||
"FUNCTION: CompareBookmarks(first, second) {{{2
|
||||
"Compares two bookmarks
|
||||
function! s:CompareBookmarks(first, second)
|
||||
return a:first.CompareTo(a:second)
|
||||
endfunction
|
||||
"FUNCTION: s:GetNodeForBookmark(name, searchFromAbsoluteRoot) {{{2
|
||||
"get the treenode for the bookmark with the given name
|
||||
"
|
||||
"Args:
|
||||
"name: name of bookmark
|
||||
"searchFromAbsoluteRoot: specifies wheather we should search from the current
|
||||
"tree root, or the highest cached node
|
||||
function! s:GetNodeForBookmark(name, searchFromAbsoluteRoot)
|
||||
try
|
||||
let bookmark = s:GetBookmarks()[a:name]
|
||||
catch /E716/ "key not in dictionary error
|
||||
throw "NERDTree.BookmarkDoesntExist no bookmark found with name: " . a:name
|
||||
endtry
|
||||
|
||||
let searchRoot = a:searchFromAbsoluteRoot ? s:AbsoluteTreeRoot() : t:NERDTreeRoot
|
||||
let targetNode = searchRoot.FindNode(bookmark)
|
||||
if empty(targetNode)
|
||||
throw "NERDTree.BookmarkNotFound no node was found for bookmark: " . a:name
|
||||
endif
|
||||
return targetNode
|
||||
" FUNCTION: s:CompleteBookmarks(A,L,P) {{{2
|
||||
" completion function for the bookmark commands
|
||||
function! s:CompleteBookmarks(A,L,P)
|
||||
return filter(s:oBookmark.BookmarkNames(), 'v:val =~ "^' . a:A . '"')
|
||||
endfunction
|
||||
"FUNCTION: s:InitNerdTree(name) {{{2
|
||||
"Initialise the nerd tree for this tab. The tree will start in either the
|
||||
@@ -1464,8 +1607,8 @@ endfunction
|
||||
"name: the name of a bookmark or a directory
|
||||
function! s:InitNerdTree(name)
|
||||
let path = {}
|
||||
if count(keys(s:GetBookmarks()), a:name)
|
||||
let path = s:GetBookmarks()[a:name]
|
||||
if s:oBookmark.BookmarkFor(a:name) != {}
|
||||
let path = s:oBookmark.BookmarkFor(a:name).path
|
||||
else
|
||||
let dir = a:name == '' ? expand('%:p:h') : a:name
|
||||
let dir = resolve(dir)
|
||||
@@ -1488,6 +1631,9 @@ function! s:InitNerdTree(name)
|
||||
|
||||
let t:treeShowHelp = 0
|
||||
let t:NERDTreeIgnoreEnabled = 1
|
||||
let t:NERDTreeShowFiles = g:NERDTreeShowFiles
|
||||
let t:NERDTreeShowHidden = g:NERDTreeShowHidden
|
||||
let t:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
|
||||
|
||||
if s:TreeExistsForTab()
|
||||
if s:IsTreeOpen()
|
||||
@@ -1503,43 +1649,11 @@ function! s:InitNerdTree(name)
|
||||
call s:RenderView()
|
||||
call s:PutCursorOnNode(t:NERDTreeRoot, 0, 0)
|
||||
endfunction
|
||||
" Function: s:ReadBookmarks() {{{2
|
||||
function! s:ReadBookmarks()
|
||||
if filereadable(g:NERDTreeBookmarksFile)
|
||||
let bookmarks = s:GetBookmarks()
|
||||
let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
|
||||
let invalidBookmarksFound = 0
|
||||
for i in bookmarkStrings
|
||||
let key = substitute(i, '^\(\w\{-}\) .*$', '\1', '')
|
||||
let path = substitute(i, '^\w\{-} \(.*\)$', '\1', '')
|
||||
|
||||
try
|
||||
let bookmarks[key] = s:oPath.New(path)
|
||||
catch /NERDTree.Path.InvalidArguments/
|
||||
let invalidBookmarksFound += 1
|
||||
endtry
|
||||
endfor
|
||||
if invalidBookmarksFound
|
||||
call s:Echo(invalidBookmarksFound . " invalid bookmarks were read and discarded")
|
||||
call s:WriteBookmarks()
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
" Function: s:TreeExistsForTab() {{{2
|
||||
" Returns 1 if a nerd tree root exists in the current tab
|
||||
function! s:TreeExistsForTab()
|
||||
return exists("t:NERDTreeRoot")
|
||||
endfunction
|
||||
" Function: s:WriteBookmarks() {{{2
|
||||
function! s:WriteBookmarks()
|
||||
let bookmarks = s:GetBookmarks()
|
||||
let bookmarkStrings = []
|
||||
for k in keys(bookmarks)
|
||||
call add(bookmarkStrings, k . ' ' . bookmarks[k].StrForOS(0))
|
||||
endfor
|
||||
call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
|
||||
endfunction
|
||||
|
||||
" SECTION: Public Functions {{{1
|
||||
"============================================================
|
||||
"Returns the node that the cursor is currently on.
|
||||
@@ -1624,8 +1738,8 @@ endfunction
|
||||
"options etc
|
||||
function! s:CreateTreeWin()
|
||||
"create the nerd tree window
|
||||
let splitLocation = g:NERDTreeWinPos ? "topleft " : "botright "
|
||||
let splitMode = g:NERDTreeSplitVertical ? "vertical " : ""
|
||||
let splitLocation = (g:NERDTreeWinPos == "top" || g:NERDTreeWinPos == "left") ? "topleft " : "botright "
|
||||
let splitMode = s:ShouldSplitVertically() ? "vertical " : ""
|
||||
let splitSize = g:NERDTreeWinSize
|
||||
let t:NERDTreeWinName = localtime() . s:NERDTreeWinName
|
||||
let cmd = splitLocation . splitMode . splitSize . ' new ' . t:NERDTreeWinName
|
||||
@@ -1770,6 +1884,13 @@ function! s:DumpHelp()
|
||||
let @h=@h."\" ". g:NERDTreeMapOpenExpl.": Open netrw for selected\n"
|
||||
let @h=@h."\" node\n"
|
||||
|
||||
let @h=@h."\"\n\" ----------------------------\n"
|
||||
let @h=@h."\" Bookmark table mappings~\n"
|
||||
let @h=@h."\" double-click,\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
|
||||
|
||||
let @h=@h."\"\n\" ----------------------------\n"
|
||||
let @h=@h."\" Tree navigation mappings~\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n"
|
||||
@@ -1794,9 +1915,10 @@ function! s:DumpHelp()
|
||||
|
||||
let @h=@h."\"\n\" ----------------------------\n"
|
||||
let @h=@h."\" Tree filtering mappings~\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (g:NERDTreeShowHidden ? "on" : "off") . ")\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (t:NERDTreeShowHidden ? "on" : "off") . ")\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (t:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (g:NERDTreeShowFiles ? "on" : "off") . ")\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (t:NERDTreeShowFiles ? "on" : "off") . ")\n"
|
||||
let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (t:NERDTreeShowBookmarks ? "on" : "off") . ")\n"
|
||||
|
||||
let @h=@h."\"\n\" ----------------------------\n"
|
||||
let @h=@h."\" Other mappings~\n"
|
||||
@@ -1845,12 +1967,6 @@ function! s:EchoError(msg)
|
||||
call s:Echo(a:msg)
|
||||
echohl normal
|
||||
endfunction
|
||||
" FUNCTION: s:FindBookmarks(A,L,P) {{{2
|
||||
" completion function for the bookmark commands
|
||||
function! s:FindBookmarks(A,L,P)
|
||||
let keys = keys(s:GetBookmarks())
|
||||
return filter(keys, 'v:val =~ "^' . a:A . '"')
|
||||
endfunction
|
||||
"FUNCTION: s:FindNodeLineNumber(treenode){{{2
|
||||
"Finds the line number for the given tree node
|
||||
"
|
||||
@@ -1913,14 +2029,6 @@ function! s:FindRootNodeLineNumber()
|
||||
return rootLine
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:GetBookmarks(name) {{{2
|
||||
" getter/lazy initializer for the g:NERDTreeBookmarks hash
|
||||
function! s:GetBookmarks()
|
||||
if !exists("g:NERDTreeBookmarks")
|
||||
let g:NERDTreeBookmarks = {}
|
||||
endif
|
||||
return g:NERDTreeBookmarks
|
||||
endfunction
|
||||
"FUNCTION: s:GetPath(ln) {{{2
|
||||
"Gets the full path to the node that is rendered on the given line number
|
||||
"
|
||||
@@ -1989,6 +2097,17 @@ function! s:GetPath(ln)
|
||||
return toReturn
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:GetSelectedBookmark() {{{2
|
||||
"Returns the current node if it is a dir node, or else returns the current
|
||||
"nodes parent
|
||||
function! s:GetSelectedBookmark()
|
||||
let line = getline(".")
|
||||
let name = substitute(line, '^>\(.\{-}\) \[.*\]$', '\1', '')
|
||||
if name != line
|
||||
return s:oBookmark.BookmarkFor(name)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:GetSelectedDir() {{{2
|
||||
"Returns the current node if it is a dir node, or else returns the current
|
||||
"nodes parent
|
||||
@@ -2164,16 +2283,16 @@ function! s:OpenNodeSplit(treenode)
|
||||
" 'right' and 'below' will be set to the settings needed for
|
||||
" splitbelow and splitright IF the explorer is the only window.
|
||||
"
|
||||
if g:NERDTreeSplitVertical == 1
|
||||
let there= g:NERDTreeWinPos ? "wincmd h" : "wincmd l"
|
||||
let back= g:NERDTreeWinPos ? "wincmd l" : "wincmd h"
|
||||
let right=g:NERDTreeWinPos ? 1 : 0
|
||||
if s:ShouldSplitVertically()
|
||||
let there= g:NERDTreeWinPos == "left" ? "wincmd h" : "wincmd l"
|
||||
let back = g:NERDTreeWinPos == "left" ? "wincmd l" : "wincmd h"
|
||||
let right= g:NERDTreeWinPos == "left"
|
||||
let below=0
|
||||
else
|
||||
let there= g:NERDTreeWinPos ? "wincmd k" : "wincmd j"
|
||||
let back= g:NERDTreeWinPos ? "wincmd j" : "wincmd k"
|
||||
let there= g:NERDTreeWinPos == "top" ? "wincmd k" : "wincmd j"
|
||||
let back = g:NERDTreeWinPos == "top" ? "wincmd j" : "wincmd k"
|
||||
let below= g:NERDTreeWinPos == "top"
|
||||
let right=0
|
||||
let below=g:NERDTreeWinPos ? 1 : 0
|
||||
endif
|
||||
|
||||
" Attempt to go to adjacent window
|
||||
@@ -2193,13 +2312,15 @@ function! s:OpenNodeSplit(treenode)
|
||||
|
||||
" Create a variable to use if splitting vertically
|
||||
let splitMode = ""
|
||||
if (onlyOneWin && g:NERDTreeSplitVertical) || (!onlyOneWin && !g:NERDTreeSplitVertical)
|
||||
if (onlyOneWin && s:ShouldSplitVertically()) || (!onlyOneWin && !s:ShouldSplitVertically())
|
||||
let splitMode = "vertical"
|
||||
endif
|
||||
|
||||
echomsg splitMode
|
||||
|
||||
" Open the new window
|
||||
try
|
||||
exec("silent " . splitMode." sp " . a:treenode.path.StrForEditCmd())
|
||||
exec(splitMode." sp " . a:treenode.path.StrForEditCmd())
|
||||
catch /^Vim\%((\a\+)\)\=:E37/
|
||||
call s:PutCursorInTreeWin()
|
||||
throw "NERDTree.view.FileOpen exception: ". a:treenode.path.Str(0) ." is already open and modified."
|
||||
@@ -2207,6 +2328,14 @@ function! s:OpenNodeSplit(treenode)
|
||||
"do nothing
|
||||
endtry
|
||||
|
||||
"resize the tree window if no other window was open before
|
||||
if onlyOneWin
|
||||
let size = exists("t:NERDTreeOldWindowSize") ? t:NERDTreeOldWindowSize : g:NERDTreeWinSize
|
||||
exec(there)
|
||||
exec("silent ". splitMode ." resize ". size)
|
||||
wincmd p
|
||||
endif
|
||||
|
||||
" Restore splitmode settings
|
||||
let &splitbelow=savesplitbelow
|
||||
let &splitright=savesplitright
|
||||
@@ -2265,6 +2394,20 @@ function! s:PutCursorInTreeWin()
|
||||
exec s:GetTreeWinNum() . "wincmd w"
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:RenderBookmarks {{{2
|
||||
function! s:RenderBookmarks()
|
||||
|
||||
call setline(line(".")+1, ">----------Bookmarks----------")
|
||||
call cursor(line(".")+1, col("."))
|
||||
|
||||
for i in s:oBookmark.Bookmarks()
|
||||
call setline(line(".")+1, i.Str())
|
||||
call cursor(line(".")+1, col("."))
|
||||
endfor
|
||||
|
||||
call setline(line(".")+1, '')
|
||||
call cursor(line(".")+1, col("."))
|
||||
endfunction
|
||||
"FUNCTION: s:RenderView {{{2
|
||||
"The entry function for rendering the tree. Renders the root then calls
|
||||
"s:DrawTree to draw the children of the root
|
||||
@@ -2282,7 +2425,7 @@ function! s:RenderView()
|
||||
let topLine = line("w0")
|
||||
|
||||
"delete all lines in the buffer (being careful not to clobber a register)
|
||||
:silent 1,$delete _
|
||||
silent 1,$delete _
|
||||
|
||||
call s:DumpHelp()
|
||||
|
||||
@@ -2290,6 +2433,10 @@ function! s:RenderView()
|
||||
call setline(line(".")+1, "")
|
||||
call cursor(line(".")+1, col("."))
|
||||
|
||||
if t:NERDTreeShowBookmarks
|
||||
call s:RenderBookmarks()
|
||||
endif
|
||||
|
||||
"add the 'up a dir' line
|
||||
call setline(line(".")+1, s:tree_up_dir_line)
|
||||
call cursor(line(".")+1, col("."))
|
||||
@@ -2302,7 +2449,7 @@ function! s:RenderView()
|
||||
call s:DrawTree(t:NERDTreeRoot, 0, 0, [], t:NERDTreeRoot.GetChildCount() == 1)
|
||||
|
||||
"delete the blank line at the top of the buffer
|
||||
:silent 1,1delete _
|
||||
silent 1,1delete _
|
||||
|
||||
"restore the view
|
||||
let old_scrolloff=&scrolloff
|
||||
@@ -2343,7 +2490,7 @@ function! s:RestoreScreenState()
|
||||
if !exists("t:NERDTreeOldTopLine") || !exists("t:NERDTreeOldPos") || !exists("t:NERDTreeOldWindowSize")
|
||||
return
|
||||
endif
|
||||
exec("silent ". (g:NERDTreeSplitVertical ? "vertical" : "") ." resize ".t:NERDTreeOldWindowSize)
|
||||
exec("silent ". (s:ShouldSplitVertically() ? "vertical" : "") ." resize ".t:NERDTreeOldWindowSize)
|
||||
|
||||
let old_scrolloff=&scrolloff
|
||||
let &scrolloff=0
|
||||
@@ -2361,7 +2508,7 @@ endfunction
|
||||
function! s:SaveScreenState()
|
||||
let t:NERDTreeOldPos = getpos(".")
|
||||
let t:NERDTreeOldTopLine = line("w0")
|
||||
let t:NERDTreeOldWindowSize = g:NERDTreeSplitVertical ? winwidth("") : winheight("")
|
||||
let t:NERDTreeOldWindowSize = s:ShouldSplitVertically() ? winwidth("") : winheight("")
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:SetupSyntaxHighlighting() {{{2
|
||||
@@ -2394,13 +2541,9 @@ function! s:SetupSyntaxHighlighting()
|
||||
syn match treeHelpCommand #" :.\{-}\>#hs=s+3
|
||||
syn match treeHelp #^".*# contains=treeHelpKey,treeHelpTitle,treeFlag,treeToggleOff,treeToggleOn,treeHelpCommand
|
||||
|
||||
|
||||
"highlighting for readonly files
|
||||
syn match treeRO #[\/0-9a-zA-Z]\+.*\[RO\]# contains=treeFlag,treeBookmark
|
||||
|
||||
"highlighting for bookmarks
|
||||
syn match treeBookmark # {.*}#hs=s+1
|
||||
|
||||
"highlighting for sym links
|
||||
syn match treeLink #[^-| `].* -> # contains=treeBookmark,treeOpenable,treeClosable,treeDirSlash
|
||||
|
||||
@@ -2412,6 +2555,15 @@ function! s:SetupSyntaxHighlighting()
|
||||
syn match treeFile #`-.*# contains=treeLink,treePart,treeRO,treePartFile,treeBookmark,treeExecFile
|
||||
syn match treeCWD #^/.*$#
|
||||
|
||||
"highlighting for bookmarks
|
||||
syn match treeBookmark # {.*}#hs=s+1
|
||||
|
||||
"highlighting for the bookmarks table
|
||||
syn match treeBookmarksLeader #^>#
|
||||
syn match treeBookmarksHeader #^>-\+Bookmarks-\+$# contains=treeBookmarksLeader
|
||||
syn match treeBookmarkName #^>.\{-} #he=e-1 contains=treeBookmarksLeader
|
||||
syn match treeBookmark #^>.*$# contains=treeBookmarksLeader,treeBookmarkName,treeBookmarksHeader
|
||||
|
||||
if g:NERDChristmasTree
|
||||
hi def link treePart Special
|
||||
hi def link treePartFile Type
|
||||
@@ -2426,6 +2578,11 @@ function! s:SetupSyntaxHighlighting()
|
||||
hi def link treeClosable Title
|
||||
endif
|
||||
|
||||
hi def link treeBookmarksHeader statement
|
||||
hi def link treeBookmarksLeader ignore
|
||||
hi def link treeBookmarkName Identifier
|
||||
hi def link treeBookmark normal
|
||||
|
||||
hi def link treeHelp String
|
||||
hi def link treeHelpKey Identifier
|
||||
hi def link treeHelpCommand Identifier
|
||||
@@ -2476,6 +2633,11 @@ function! s:ShouldSplitToOpen(winnumber)
|
||||
return modified && s:BufInWindows(winbufnr(a:winnumber)) < 2
|
||||
endfunction
|
||||
|
||||
" Function: s:ShouldSplitVertically() {{{2
|
||||
" Returns 1 if g:NERDTreeWinPos is 'left' or 'right'
|
||||
function! s:ShouldSplitVertically()
|
||||
return g:NERDTreeWinPos == 'left' || g:NERDTreeWinPos == 'right'
|
||||
endfunction
|
||||
"FUNCTION: s:StripMarkupFromLine(line, removeLeadingSpaces){{{2
|
||||
"returns the given line with all the tree parts stripped off
|
||||
"
|
||||
@@ -2543,18 +2705,28 @@ function! s:ActivateNode()
|
||||
if getline(".") == s:tree_up_dir_line
|
||||
return s:UpDir(0)
|
||||
endif
|
||||
let treenode = s:GetSelectedNode()
|
||||
if treenode == {}
|
||||
call s:EchoWarning("cannot open selected entry")
|
||||
return
|
||||
endif
|
||||
|
||||
if treenode.path.isDirectory
|
||||
call treenode.ToggleOpen()
|
||||
call s:RenderView()
|
||||
call s:PutCursorOnNode(treenode, 0, 0)
|
||||
let treenode = s:GetSelectedNode()
|
||||
if treenode != {}
|
||||
if treenode.path.isDirectory
|
||||
call treenode.ToggleOpen()
|
||||
call s:RenderView()
|
||||
call s:PutCursorOnNode(treenode, 0, 0)
|
||||
else
|
||||
call s:OpenFileNode(treenode)
|
||||
if g:NERDTreeQuitOnOpen
|
||||
call s:CloseTree()
|
||||
endif
|
||||
endif
|
||||
else
|
||||
call s:OpenFileNode(treenode)
|
||||
let bookmark = s:GetSelectedBookmark()
|
||||
if !empty(bookmark)
|
||||
if bookmark.path.isDirectory
|
||||
call s:BookmarkToRoot(bookmark.name)
|
||||
else
|
||||
call s:OpenFileNode(s:oTreeFileNode.New(bookmark.path))
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -2591,6 +2763,7 @@ function! s:BindMappings()
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleHidden ." :call <SID>ToggleShowHidden()<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleFilters ." :call <SID>ToggleIgnoreFilter()<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleFiles ." :call <SID>ToggleShowFiles()<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleBookmarks ." :call <SID>ToggleShowBookmarks()<cr>"
|
||||
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapCloseDir ." :call <SID>CloseCurrentDir()<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapCloseChildren ." :call <SID>CloseChildren()<cr>"
|
||||
@@ -2604,43 +2777,32 @@ function! s:BindMappings()
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpLastChild ." :call <SID>JumpToLastChild()<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpRoot ." :call <SID>JumpToRoot()<cr>"
|
||||
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTab ." :call <SID>OpenNodeNewTab(0)<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTabSilent ." :call <SID>OpenNodeNewTab(1)<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTab ." :call <SID>OpenInNewTab(0)<cr>"
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTabSilent ." :call <SID>OpenInNewTab(1)<cr>"
|
||||
|
||||
exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenExpl ." :call <SID>OpenExplorer()<cr>"
|
||||
|
||||
command! -buffer -nargs=1 Bookmark :call <SID>BookmarkNode('<args>')
|
||||
command! -buffer -complete=customlist,s:FindBookmarks -nargs=1 RevealBookmark :call <SID>RevealBookmark('<args>')
|
||||
command! -buffer -complete=customlist,s:FindBookmarks -nargs=1 OpenBookmark :call <SID>OpenBookmark('<args>')
|
||||
command! -buffer -complete=customlist,s:FindBookmarks -nargs=* ClearBookmarks call <SID>ClearBookmarks('<args>')
|
||||
command! -buffer -complete=customlist,s:FindBookmarks -nargs=+ BookmarkToRoot call <SID>BookmarkToRoot('<args>')
|
||||
command! -buffer -nargs=0 ClearAllBookmarks call <SID>ClearAllBookmarks() <bar> call <SID>RenderView()
|
||||
command! -buffer -nargs=0 ReadBookmarks call <SID>ReadBookmarks() <bar> call <SID>RenderView()
|
||||
command! -buffer -nargs=0 WriteBookmarks call <SID>WriteBookmarks()
|
||||
command! -buffer -complete=customlist,s:CompleteBookmarks -nargs=1 RevealBookmark :call <SID>RevealBookmark('<args>')
|
||||
command! -buffer -complete=customlist,s:CompleteBookmarks -nargs=1 OpenBookmark :call <SID>OpenBookmark('<args>')
|
||||
command! -buffer -complete=customlist,s:CompleteBookmarks -nargs=* ClearBookmarks call <SID>ClearBookmarks('<args>')
|
||||
command! -buffer -complete=customlist,s:CompleteBookmarks -nargs=+ BookmarkToRoot call <SID>BookmarkToRoot('<args>')
|
||||
command! -buffer -nargs=0 ClearAllBookmarks call s:oBookmark.ClearAll() <bar> call <SID>RenderView()
|
||||
command! -buffer -nargs=0 ReadBookmarks call s:oBookmark.CacheBookmarks() <bar> call <SID>RenderView()
|
||||
command! -buffer -nargs=0 WriteBookmarks call s:oBookmark.Write()
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:BookmarkNode(name) {{{2
|
||||
" Associate the current node with the given name
|
||||
function! s:BookmarkNode(name)
|
||||
if a:name !~ '^[0-9a-zA-Z_]*$'
|
||||
call s:Echo("Bookmarks must be named using numbers, letters and underscores only")
|
||||
return
|
||||
endif
|
||||
|
||||
let currentNode = s:GetSelectedNode()
|
||||
if currentNode != {}
|
||||
|
||||
try
|
||||
let oldMarkedNode = s:GetNodeForBookmark(a:name, 1)
|
||||
call oldMarkedNode.path.UncacheBookmark(a:name)
|
||||
catch /NERDTree.Bookmark\(DoesntExist\|NotFound\)/
|
||||
call currentNode.Bookmark(a:name)
|
||||
call s:RenderView()
|
||||
catch /NERDTree.IllegalBookmarkName/
|
||||
call s:Echo("bookmark names must not contain spaces")
|
||||
endtry
|
||||
|
||||
let bookmarks = s:GetBookmarks()
|
||||
let bookmarks[a:name] = currentNode.path
|
||||
call currentNode.path.CacheBookmarkNames()
|
||||
call s:WriteBookmarks()
|
||||
call s:RenderView()
|
||||
else
|
||||
call s:Echo("select a node first")
|
||||
endif
|
||||
@@ -2649,10 +2811,9 @@ endfunction
|
||||
" Make the node for the given bookmark the new tree root
|
||||
function! s:BookmarkToRoot(name)
|
||||
try
|
||||
let targetNode = s:GetNodeForBookmark(a:name, 1)
|
||||
let targetNode = s:oBookmark.GetNodeForName(a:name, 1)
|
||||
catch /NERDTree.BookmarkNotFound/
|
||||
let bookmarks = s:GetBookmarks()
|
||||
let targetNode = s:oTreeFileNode.New(bookmarks[a:name])
|
||||
let targetNode = s:oTreeFileNode.New(s:oBookmark.BookmarkFor(a:name).path)
|
||||
endtry
|
||||
call targetNode.MakeRoot()
|
||||
call s:RenderView()
|
||||
@@ -2718,7 +2879,6 @@ endfunction
|
||||
|
||||
" FUNCTION: s:ClearBookmarks(bookmarks) {{{2
|
||||
function! s:ClearBookmarks(bookmarks)
|
||||
let bookmarks = s:GetBookmarks()
|
||||
if a:bookmarks == ''
|
||||
let currentNode = s:GetSelectedNode()
|
||||
if currentNode != {}
|
||||
@@ -2726,20 +2886,11 @@ function! s:ClearBookmarks(bookmarks)
|
||||
endif
|
||||
else
|
||||
for name in split(a:bookmarks, ' ')
|
||||
if count(keys(bookmarks), name)
|
||||
let node = {}
|
||||
try
|
||||
let node = s:GetNodeForBookmark(name, 1)
|
||||
catch /NERDTree/
|
||||
endtry
|
||||
call remove(bookmarks, name)
|
||||
if !empty(node)
|
||||
call node.path.CacheBookmarkNames()
|
||||
endif
|
||||
endif
|
||||
let bookmark = s:oBookmark.BookmarkFor(name)
|
||||
call bookmark.Delete()
|
||||
endfor
|
||||
endif
|
||||
call s:WriteBookmarks()
|
||||
call s:oBookmark.Write()
|
||||
call s:RenderView()
|
||||
endfunction
|
||||
" FUNCTION: s:CloseChildren() {{{2
|
||||
@@ -2793,7 +2944,7 @@ function! s:CopyNode()
|
||||
|
||||
let confirmed = 1
|
||||
if currentNode.path.CopyingWillOverwrite(newNodePath)
|
||||
echo "\nWarning: copying may overwrite files! Continue? (yN)"
|
||||
call s:Echo("\nWarning: copying may overwrite files! Continue? (yN)")
|
||||
let choice = nr2char(getchar())
|
||||
let confirmed = choice == 'y'
|
||||
endif
|
||||
@@ -3001,13 +3152,13 @@ endfunction
|
||||
" put the cursor on the given bookmark and, if its a file, open it
|
||||
function! s:OpenBookmark(name)
|
||||
try
|
||||
let targetNode = s:GetNodeForBookmark(a:name, 0)
|
||||
let targetNode = s:oBookmark.GetNodeForName(a:name, 0)
|
||||
call s:PutCursorOnNode(targetNode, 0, 1)
|
||||
redraw!
|
||||
catch /NERDTree.BookmarkNotFound/
|
||||
call s:Echo("note - target node is not cached")
|
||||
let bookmarks = s:GetBookmarks()
|
||||
let targetNode = s:oTreeFileNode.New(bookmarks[a:name])
|
||||
let bookmark = s:oBookmark.BookmarkFor(a:name)
|
||||
let targetNode = s:oTreeFileNode.New(bookmark.path)
|
||||
endtry
|
||||
if targetNode.path.isDirectory
|
||||
call s:OpenExplorerFor(targetNode)
|
||||
@@ -3022,6 +3173,9 @@ function! s:OpenEntrySplit()
|
||||
let treenode = s:GetSelectedNode()
|
||||
if treenode != {}
|
||||
call s:OpenFileNodeSplit(treenode)
|
||||
if g:NERDTreeQuitOnOpen
|
||||
call s:CloseTree()
|
||||
endif
|
||||
else
|
||||
call s:Echo("select a node first")
|
||||
endif
|
||||
@@ -3037,27 +3191,35 @@ function! s:OpenExplorer()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:OpenNodeNewTab(stayCurrentTab) {{{2
|
||||
" Opens the currently selected file from the explorer in a
|
||||
" new tab
|
||||
"
|
||||
" FUNCTION: s:OpenInNewTab(stayCurrentTab) {{{2
|
||||
" Opens the selected node or bookmark in a new tab
|
||||
" Args:
|
||||
" stayCurrentTab: if 1 then vim will stay in the current tab, if 0 then vim
|
||||
" will go to the tab where the new file is opened
|
||||
function! s:OpenNodeNewTab(stayCurrentTab)
|
||||
function! s:OpenInNewTab(stayCurrentTab)
|
||||
let currentTab = tabpagenr()
|
||||
|
||||
let treenode = s:GetSelectedNode()
|
||||
if treenode != {}
|
||||
let curTabNr = tabpagenr()
|
||||
exec "tabedit " . treenode.path.StrForEditCmd()
|
||||
if a:stayCurrentTab
|
||||
exec "tabnext " . curTabNr
|
||||
exec "tabnext " . currentTab
|
||||
endif
|
||||
else
|
||||
call s:Echo("select a node first")
|
||||
let bookmark = s:GetSelectedBookmark()
|
||||
if bookmark != {}
|
||||
if bookmark.path.isDirectory
|
||||
exec "tabnew +NERDTreeFromBookmark\\ " . bookmark.name
|
||||
else
|
||||
exec "tabedit " . bookmark.path.StrForEditCmd()
|
||||
endif
|
||||
if a:stayCurrentTab
|
||||
exec "tabnext " . currentTab
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
" FUNCTION: s:OpenNodeRecursively() {{{2
|
||||
function! s:OpenNodeRecursively()
|
||||
let treenode = s:GetSelectedNode()
|
||||
@@ -3093,7 +3255,7 @@ endfunction
|
||||
" put the cursor on the node associate with the given name
|
||||
function! s:RevealBookmark(name)
|
||||
try
|
||||
let targetNode = s:GetNodeForBookmark(a:name, 0)
|
||||
let targetNode = s:oBookmark.GetNodeForName(a:name, 0)
|
||||
call s:PutCursorOnNode(targetNode, 0, 1)
|
||||
catch /NERDTree.BookmarkDoesntExist/
|
||||
call s:Echo("Bookmark isnt cached under the current root")
|
||||
@@ -3209,10 +3371,17 @@ function! s:ToggleIgnoreFilter()
|
||||
call s:CenterView()
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:ToggleShowBookmarks() {{{2
|
||||
" toggles the display of bookmarks
|
||||
function! s:ToggleShowBookmarks()
|
||||
let t:NERDTreeShowBookmarks = !t:NERDTreeShowBookmarks
|
||||
call s:RenderViewSavingPosition()
|
||||
call s:CenterView()
|
||||
endfunction
|
||||
" FUNCTION: s:ToggleShowFiles() {{{2
|
||||
" toggles the display of hidden files
|
||||
function! s:ToggleShowFiles()
|
||||
let g:NERDTreeShowFiles = !g:NERDTreeShowFiles
|
||||
let t:NERDTreeShowFiles = !t:NERDTreeShowFiles
|
||||
call s:RenderViewSavingPosition()
|
||||
call s:CenterView()
|
||||
endfunction
|
||||
@@ -3220,7 +3389,7 @@ endfunction
|
||||
" FUNCTION: s:ToggleShowHidden() {{{2
|
||||
" toggles the display of hidden files
|
||||
function! s:ToggleShowHidden()
|
||||
let g:NERDTreeShowHidden = !g:NERDTreeShowHidden
|
||||
let t:NERDTreeShowHidden = !t:NERDTreeShowHidden
|
||||
call s:RenderViewSavingPosition()
|
||||
call s:CenterView()
|
||||
endfunction
|
||||
|
||||
Reference in New Issue
Block a user