mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-08 11:23:48 -05:00
Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
052b1f00a0 | ||
|
|
f63132cade | ||
|
|
484dc84b47 | ||
|
|
2e9d43b6f8 | ||
|
|
10eaa3a2f4 | ||
|
|
e2670f0d19 | ||
|
|
4cc6097ecb | ||
|
|
30ad6da984 | ||
|
|
3005a0e9c0 | ||
|
|
a7d585f7af | ||
|
|
5e77fb2fef | ||
|
|
29a321d061 | ||
|
|
0257d64248 | ||
|
|
2d7cb043d4 | ||
|
|
f767dd34a0 | ||
|
|
832bbaa729 | ||
|
|
343508e9fd | ||
|
|
495b4e781a | ||
|
|
e67324fdea | ||
|
|
5249b30fbf | ||
|
|
09b165cfac | ||
|
|
6224d20698 | ||
|
|
07612557eb | ||
|
|
7a0312f492 | ||
|
|
41a44be8d5 | ||
|
|
85103aa607 | ||
|
|
1f5018dc45 | ||
|
|
d706f40ae7 | ||
|
|
e41dd019d9 | ||
|
|
2388af7754 | ||
|
|
c3d7c141bb | ||
|
|
450abd1820 | ||
|
|
6d3743549c | ||
|
|
961c3571c4 | ||
|
|
26333ceeab | ||
|
|
8c48845d11 | ||
|
|
b16553ac54 | ||
|
|
e48b5728f9 | ||
|
|
f7b09634ba | ||
|
|
c2c4a6564f | ||
|
|
881c265438 | ||
|
|
26740d1157 | ||
|
|
6d5e185cef | ||
|
|
3a3636b7cb | ||
|
|
5fbf0d7dba |
33
CHANGELOG.md
33
CHANGELOG.md
@@ -1,13 +1,34 @@
|
||||
# NERDTree Change Log
|
||||
|
||||
<!--
|
||||
Introduce a new MAJOR.MINOR version with a 4-hash header.
|
||||
|
||||
PATCH versions are listed from newest to oldest under their respective MAJOR.MINOR version
|
||||
in an unordered list. The format is:
|
||||
<!-- Introduce a new MAJOR or MINOR version with a 4-hash header.
|
||||
PATCH versions are listed from newest to oldest under their respective MAJOR.MINOR
|
||||
version in an unordered list. The format is:
|
||||
- **.PATCH**: Pull Request Title (PR Author) [PR Number](Link to PR)
|
||||
-->
|
||||
#### 6.7
|
||||
- **.15**: Add curly braces to the list of characters to be escaped. (PhilRunninger) [#1128](https://github.com/preservim/nerdtree/pull/1128)
|
||||
- **.14**: Use backward-compatible `nerdtree#and()` in one place that was missed. (PhilRunninger) [#1134](https://github.com/preservim/nerdtree/pull/1134)
|
||||
- **.13**: `cmd.exe /c start "" <filename>` for windows default viewer support. (J. Altayó) [#1130](https://github.com/preservim/nerdtree/pull/1130)
|
||||
- **.12**: Fixed a bug that caused the file-tree construction to slow down significantly. (Eugenij-W) [#1126](https://github.com/preservim/nerdtree/pull/1126)
|
||||
- **.11**: Fix exception in NERDTreeFind (on windows OS and If the file is located in the root directory of the disk) (Eugenij-W) [#1122](https://github.com/preservim/nerdtree/pull/1122)
|
||||
- **.10**: Do not consider the tree root to be "cascadable". (lifecrisis) [#1120](https://github.com/preservim/nerdtree/pull/1120)
|
||||
- **.9**: Force `:NERDTreeFocus` to allow events to be fired when switching windows. (PhilRunninger) [#1118](https://github.com/preservim/nerdtree/pull/1118)
|
||||
- **.8**: Fix example code for the `NERDTreeAddKeyMap()` function. (PhilRunninger) [#1116](https://github.com/preservim/nerdtree/pull/1116)
|
||||
- **.7**: Put `'%'` argument in `bufname()` for backwards compatibility. (PhilRunninger) [#1105](https://github.com/preservim/nerdtree/pull/1105)
|
||||
- **.6**: If a file's already open in the window, don't edit it again. (PhilRunninger) [#1103](https://github.com/preservim/nerdtree/pull/1103)
|
||||
- **.5**: Prevent unneeded tree creation in `:NERDTreeToggle[VCS] <path>` (PhilRunninger) [#1101](https://github.com/preservim/nerdtree/pull/1101)
|
||||
- **.4**: Add missing calls to the `shellescape()` function (lifecrisis) [#1099](https://github.com/preservim/nerdtree/pull/1099)
|
||||
- **.3**: Fix vsplit to not open empty buffers when opening previously closed file (AwkwardKore) [#1098](https://github.com/preservim/nerdtree/pull/1098)
|
||||
- **.2**: Fix infinity loop (on winvim) in FindParentVCSRoot (Eugenij-W) [#1095](https://github.com/preservim/nerdtree/pull/1095)
|
||||
- **.1**: File Move: Escape existing directory name when looking for open files. (PhilRunninger) [#1094](https://github.com/preservim/nerdtree/pull/1094)
|
||||
- **.0**: Open the parent directory when revealing a non-existent file with :NERDTreeFind (bouk) [#1090](https://github.com/preservim/nerdtree/pull/1090)
|
||||
#### 6.6
|
||||
- **.1**: [add] How to install using dein.vim (kazukazuinaina) [#1087](https://github.com/preservim/nerdtree/pull/1087)
|
||||
- **.0**: Add the ability to turn off directory arrows (PhilRunninger) [#1085](https://github.com/preservim/nerdtree/pull/1085)
|
||||
#### 6.5
|
||||
- **.0**: `NERDTreeToggle <start-directory>` always sets NERDTree root. (PhilRunninger) [#1083](https://github.com/preservim/nerdtree/pull/1083)
|
||||
#### 6.4
|
||||
- **.6**: NERDTreeFind shows expected message if file doesn't exist e.g. with vim-startify (andys8). [#1081](https://github.com/preservim/nerdtree/pull/1081)
|
||||
- **.5**: Ensure events are (or aren't) being ignored correctly. (PhilRunninger) [#1080](https://github.com/preservim/nerdtree/pull/1080)
|
||||
- **.4**: Prevent overwriting existing files/dirs on node move. (PhilRunninger) [#1079](https://github.com/preservim/nerdtree/pull/1079)
|
||||
- **.3**: Fix regex that finds keyword for minimal menu. (PhilRunninger) [#1075](https://github.com/preservim/nerdtree/pull/1075)
|
||||
- **.2**: Lint vimscript, fix errors and warnings, add CI job to review PRs (Caleb Maclennan) [#1071](https://github.com/preservim/nerdtree/pull/1071)
|
||||
|
||||
@@ -59,6 +59,13 @@ Plug 'preservim/nerdtree'
|
||||
call plug#end()
|
||||
```
|
||||
|
||||
#### [dein.vim](https://github.com/Shougo/dein.vim)
|
||||
```vim
|
||||
call dein#begin()
|
||||
call dein#add('preservim/nerdtree')
|
||||
call dein#end()
|
||||
```
|
||||
|
||||
#### [apt-vim](https://github.com/egalpin/apt-vim)
|
||||
```bash
|
||||
apt-vim install -y https://github.com/preservim/nerdtree.git
|
||||
@@ -143,3 +150,8 @@ Use these variables in your vimrc. Note that below are default arrow symbols
|
||||
let g:NERDTreeDirArrowExpandable = '▸'
|
||||
let g:NERDTreeDirArrowCollapsible = '▾'
|
||||
```
|
||||
You can remove the arrows altogether by setting these variables to empty strings, as shown below. This will remove not only the arrows, but a single space following them, shifting the whole tree two character positions to the left.
|
||||
```vim
|
||||
let g:NERDTreeDirArrowExpandable = ''
|
||||
let g:NERDTreeDirArrowCollapsible = ''
|
||||
```
|
||||
|
||||
@@ -45,7 +45,7 @@ function! nerdtree#slash() abort
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#and(x,y) {{{2
|
||||
" Implements and() function for Vim <= 7.2
|
||||
" Implements and() function for Vim <= 7.4
|
||||
function! nerdtree#and(x,y) abort
|
||||
if exists('*and')
|
||||
return and(a:x, a:y)
|
||||
@@ -169,8 +169,11 @@ function! nerdtree#exec(cmd, ignoreAll) abort
|
||||
if a:ignoreAll
|
||||
set eventignore=all
|
||||
endif
|
||||
exec a:cmd
|
||||
let &eventignore = old_ei
|
||||
try
|
||||
exec a:cmd
|
||||
finally
|
||||
let &eventignore = old_ei
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#has_opt(options, name) {{{2
|
||||
|
||||
@@ -284,15 +284,18 @@ endfunction
|
||||
" FUNCTION: s:findAndRevealPath(pathStr) {{{1
|
||||
function! s:findAndRevealPath(pathStr) abort
|
||||
let l:pathStr = !empty(a:pathStr) ? a:pathStr : expand('%:p')
|
||||
if !filereadable(l:pathStr)
|
||||
let l:pathStr = fnamemodify(l:pathStr, ':h')
|
||||
endif
|
||||
let l:revealOpts = {}
|
||||
|
||||
if empty(l:pathStr)
|
||||
call nerdtree#echoWarning('no file for the current buffer')
|
||||
return
|
||||
endif
|
||||
|
||||
if !filereadable(l:pathStr)
|
||||
let l:pathStr = fnamemodify(l:pathStr, ':h')
|
||||
let l:revealOpts['open'] = 1
|
||||
endif
|
||||
|
||||
try
|
||||
let l:pathStr = g:NERDTreePath.Resolve(l:pathStr)
|
||||
let l:pathObj = g:NERDTreePath.New(l:pathStr)
|
||||
@@ -326,7 +329,7 @@ function! s:findAndRevealPath(pathStr) abort
|
||||
call b:NERDTree.ui.setShowHidden(1)
|
||||
endif
|
||||
|
||||
let l:node = b:NERDTree.root.reveal(l:pathObj)
|
||||
let l:node = b:NERDTree.root.reveal(l:pathObj, l:revealOpts)
|
||||
call b:NERDTree.render()
|
||||
call l:node.putCursorHere(1, 0)
|
||||
endfunction
|
||||
|
||||
@@ -122,8 +122,9 @@ The following features and functionality are provided by the NERDTree:
|
||||
|
||||
:NERDTreeToggle [<start-directory> | <bookmark>] *:NERDTreeToggle*
|
||||
If a NERDTree already exists for this tab, it is reopened and rendered
|
||||
again. If no NERDTree exists for this tab then this command acts the
|
||||
same as the |:NERDTree| command.
|
||||
again. If <start-directory> or <bookmark> is given, the root of NERDTree
|
||||
is set to that path. If no NERDTree exists for this tab then this command
|
||||
acts the same as the |:NERDTree| command.
|
||||
|
||||
:NERDTreeToggleVCS [<start-directory> | <bookmark>] *:NERDTreeToggleVCS*
|
||||
Like |:NERDTreeToggle|, but searches up the directory tree to find the top of
|
||||
@@ -1222,13 +1223,19 @@ Values: Any single character.
|
||||
Defaults: Windows: ~ and + Others: ▾ and ▸
|
||||
|
||||
These characters indicate whether a directory is collapsible or expandable.
|
||||
|
||||
They can be set to "\u00a0" to hide the arrows, but if you do this you may
|
||||
need to change the node delimiter. See |NERDTreeNodeDelimiter|. You cannot use
|
||||
the same character for both the arrows and the delimiter. Example: >
|
||||
Example: >
|
||||
let NERDTreeDirArrowExpandable=">"
|
||||
let NERDTreeDirArrowCollapsible="v"
|
||||
<
|
||||
They can be set to "\u00a0" to replace the arrows with a non-breaking space.
|
||||
If you do this you may need to change the node delimiter. See
|
||||
|NERDTreeNodeDelimiter|. You cannot use the same character for both the arrows
|
||||
and the delimiter.
|
||||
|
||||
Alternatively, they can be set to '' (an empty string). This removes the
|
||||
arrows and the single space that follows them, shifting the entire tree two
|
||||
character positions to the left.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTreeNodeDelimiter*
|
||||
Values: Any single character.
|
||||
@@ -1346,12 +1353,12 @@ NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()*
|
||||
Example: >
|
||||
call NERDTreeAddKeyMap({
|
||||
\ 'key': 'foo',
|
||||
\ 'callback': 'NERDTreeCDHandler',
|
||||
\ 'callback': 'NERDTreeEchoPathHandler',
|
||||
\ 'quickhelpText': 'echo full path of current node',
|
||||
\ 'scope': 'DirNode' })
|
||||
|
||||
function! NERDTreeCDHandler(dirnode)
|
||||
call a:dirnode.changeToDir()
|
||||
function! NERDTreeEchoPathHandler(dirnode)
|
||||
echo a:dirnode.path.str()
|
||||
endfunction
|
||||
<
|
||||
This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim.
|
||||
|
||||
@@ -249,7 +249,11 @@ function! s:Creator._pathForString(str)
|
||||
if dir =~# '^\.'
|
||||
let dir = getcwd() . g:NERDTreePath.Slash() . dir
|
||||
endif
|
||||
let dir = g:NERDTreePath.Resolve(dir)
|
||||
|
||||
"hack to prevent removing slash if dir is the root of the file system.
|
||||
if dir !=# '/'
|
||||
let dir = g:NERDTreePath.Resolve(dir)
|
||||
endif
|
||||
|
||||
try
|
||||
let path = g:NERDTreePath.New(dir)
|
||||
@@ -333,14 +337,17 @@ function! s:Creator._tabpagevar(tabnr, var)
|
||||
let old_ei = &eventignore
|
||||
set eventignore=all
|
||||
|
||||
exec 'tabnext ' . a:tabnr
|
||||
let v = -1
|
||||
if exists('t:' . a:var)
|
||||
exec 'let v = t:' . a:var
|
||||
endif
|
||||
exec 'tabnext ' . currentTab
|
||||
try
|
||||
exec 'tabnext ' . a:tabnr
|
||||
let v = -1
|
||||
if exists('t:' . a:var)
|
||||
exec 'let v = t:' . a:var
|
||||
endif
|
||||
exec 'tabnext ' . currentTab
|
||||
|
||||
let &eventignore = old_ei
|
||||
finally
|
||||
let &eventignore = old_ei
|
||||
endtry
|
||||
|
||||
return v
|
||||
endfunction
|
||||
@@ -352,17 +359,20 @@ function! s:Creator.ToggleTabTree(dir)
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:Creator.toggleTabTree(dir) {{{1
|
||||
" Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is
|
||||
" closed it is restored or initialized (if it doesnt exist)
|
||||
" Toggles the NERD tree. I.e if the NERD tree is open, it is closed. If it is
|
||||
" closed, it is restored or initialized. If dir is not empty, it will be set
|
||||
" as the new root.
|
||||
"
|
||||
" Args:
|
||||
" dir: the full path for the root node (is only used if the NERD tree is being
|
||||
" initialized.
|
||||
" dir: the full path for the root node (is used if the NERD tree is being
|
||||
" initialized, or to change the root to a new dir.)
|
||||
function! s:Creator.toggleTabTree(dir)
|
||||
if g:NERDTree.ExistsForTab()
|
||||
if !g:NERDTree.IsOpen()
|
||||
call self._createTreeWin()
|
||||
if !&hidden
|
||||
if !empty(a:dir) && a:dir !=# b:NERDTree.root.path.str()
|
||||
call self.createTabTree(a:dir)
|
||||
elseif !&hidden
|
||||
call b:NERDTree.render()
|
||||
endif
|
||||
call b:NERDTree.ui.restoreScreenState()
|
||||
|
||||
@@ -96,9 +96,9 @@ endfunction
|
||||
|
||||
"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1
|
||||
"Places the cursor in the nerd tree window
|
||||
function! s:NERDTree.CursorToTreeWin()
|
||||
function! s:NERDTree.CursorToTreeWin(...)
|
||||
call g:NERDTree.MustBeOpen()
|
||||
call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', 1)
|
||||
call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', a:0 >0 ? a:1 : 1)
|
||||
endfunction
|
||||
|
||||
" Function: s:NERDTree.ExistsForBuffer() {{{1
|
||||
|
||||
@@ -195,7 +195,7 @@ function! s:Opener._newVSplit()
|
||||
endif
|
||||
|
||||
call nerdtree#exec('wincmd p', 1)
|
||||
call nerdtree#exec('vnew', 1)
|
||||
call nerdtree#exec('vsplit', 1)
|
||||
|
||||
let l:currentWindowNumber = winnr()
|
||||
|
||||
@@ -219,7 +219,7 @@ endfunction
|
||||
|
||||
" FUNCTION: Opener._openFile() {{{1
|
||||
function! s:Opener._openFile()
|
||||
if !self._stay && !and(g:NERDTreeQuitOnOpen,1) && exists('b:NERDTreeZoomed') && b:NERDTreeZoomed
|
||||
if !self._stay && !nerdtree#and(g:NERDTreeQuitOnOpen,1) && exists('b:NERDTreeZoomed') && b:NERDTreeZoomed
|
||||
call b:NERDTree.ui.toggleZoom()
|
||||
endif
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ function! s:Path.copy(dest)
|
||||
let cmd_prefix = (self.isDirectory ? g:NERDTreeCopyDirCmd : g:NERDTreeCopyFileCmd)
|
||||
endif
|
||||
|
||||
let cmd = cmd_prefix . ' ' . escape(self.str(), self._escChars()) . ' ' . escape(a:dest, self._escChars())
|
||||
let cmd = cmd_prefix . ' ' . shellescape(self.str()) . ' ' . shellescape(a:dest)
|
||||
let success = system(cmd)
|
||||
if v:shell_error !=# 0
|
||||
throw "NERDTree.CopyError: Could not copy '". self.str() ."' to: '" . a:dest . "'"
|
||||
@@ -295,7 +295,10 @@ endfunction
|
||||
|
||||
" FUNCTION: Path.edit() {{{1
|
||||
function! s:Path.edit()
|
||||
exec 'edit ' . self.str({'format': 'Edit'})
|
||||
let l:bufname = self.str({'format': 'Edit'})
|
||||
if bufname('%') !=# l:bufname
|
||||
exec 'edit ' . l:bufname
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" FUNCTION: Path.extractDriveLetter(fullpath) {{{1
|
||||
@@ -329,7 +332,7 @@ function! s:Path._escChars()
|
||||
return " `\|\"#%&,?()\*^<>$"
|
||||
endif
|
||||
|
||||
return " \\`\|\"#%&,?()\*^<>[]$"
|
||||
return " \\`\|\"#%&,?()\*^<>[]{}$"
|
||||
endfunction
|
||||
|
||||
" FUNCTION: Path.getDir() {{{1
|
||||
@@ -543,26 +546,36 @@ endfunction
|
||||
" return 1 if this path is somewhere above the given path in the filesystem.
|
||||
"
|
||||
" a:path should be a dir
|
||||
function! s:Path.isAncestor(path)
|
||||
if !self.isDirectory
|
||||
return 0
|
||||
endif
|
||||
|
||||
let this = self.str()
|
||||
let that = a:path.str()
|
||||
return stridx(that, this) ==# 0
|
||||
function! s:Path.isAncestor(child)
|
||||
return a:child.isUnder(self)
|
||||
endfunction
|
||||
|
||||
" FUNCTION: Path.isUnder(path) {{{1
|
||||
" return 1 if this path is somewhere under the given path in the filesystem.
|
||||
function! s:Path.isUnder(path)
|
||||
if a:path.isDirectory ==# 0
|
||||
function! s:Path.isUnder(parent)
|
||||
if a:parent.isDirectory ==# 0
|
||||
return 0
|
||||
endif
|
||||
|
||||
let this = self.str()
|
||||
let that = a:path.str()
|
||||
return stridx(this, that . s:Path.Slash()) ==# 0
|
||||
if nerdtree#runningWindows() && a:parent.drive !=# self.drive
|
||||
return 0
|
||||
endif
|
||||
let l:this_count = len(self.pathSegments)
|
||||
if l:this_count ==# 0
|
||||
return 0
|
||||
endif
|
||||
let l:that_count = len(a:parent.pathSegments)
|
||||
if l:that_count ==# 0
|
||||
return 1
|
||||
endif
|
||||
if l:that_count >= l:this_count
|
||||
return 0
|
||||
endif
|
||||
for i in range(0, l:that_count-1)
|
||||
if self.pathSegments[i] !=# a:parent.pathSegments[i]
|
||||
return 0
|
||||
endif
|
||||
endfor
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
" FUNCTION: Path.JoinPathStrings(...) {{{1
|
||||
|
||||
@@ -104,16 +104,11 @@ function! s:TreeDirNode.displayString()
|
||||
endfor
|
||||
|
||||
" Select the appropriate open/closed status indicator symbol.
|
||||
if l:cascade[-1].isOpen
|
||||
let l:symbol = g:NERDTreeDirArrowCollapsible
|
||||
else
|
||||
let l:symbol = g:NERDTreeDirArrowExpandable
|
||||
endif
|
||||
|
||||
let l:symbol = (l:cascade[-1].isOpen ? g:NERDTreeDirArrowCollapsible : g:NERDTreeDirArrowExpandable )
|
||||
let l:symbol .= (g:NERDTreeDirArrowExpandable ==# '' ? '' : ' ')
|
||||
let l:flags = l:cascade[-1].path.flagSet.renderToString()
|
||||
|
||||
let l:result = l:symbol . ' ' . l:flags . l:label
|
||||
return l:result
|
||||
return l:symbol . l:flags . l:label
|
||||
endfunction
|
||||
|
||||
" FUNCTION: TreeDirNode.findNode(path) {{{1
|
||||
@@ -382,11 +377,17 @@ endfunction
|
||||
" 1. If cascaded, we don't know which dir is bookmarked or is a symlink.
|
||||
" 2. If the parent is a symlink or is bookmarked, you end up with unparsable
|
||||
" text, and NERDTree cannot get the path of any child node.
|
||||
" Also, return false if this directory is the tree root, which should never be
|
||||
" part of a cascade.
|
||||
function! s:TreeDirNode.isCascadable()
|
||||
if g:NERDTreeCascadeSingleChildDir ==# 0
|
||||
return 0
|
||||
endif
|
||||
|
||||
if self.isRoot()
|
||||
return 0
|
||||
endif
|
||||
|
||||
if self.path.isSymLink
|
||||
return 0
|
||||
endif
|
||||
@@ -430,6 +431,7 @@ function! s:TreeDirNode._initChildren(silent)
|
||||
endtry
|
||||
endfor
|
||||
|
||||
let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder
|
||||
call self.sortChildren()
|
||||
|
||||
call nerdtree#echo('')
|
||||
|
||||
@@ -321,13 +321,9 @@ function! s:TreeFileNode._renderToString(depth, drawText)
|
||||
if a:drawText ==# 1
|
||||
|
||||
let treeParts = repeat(' ', a:depth - 1)
|
||||
|
||||
if !self.path.isDirectory
|
||||
let treeParts = treeParts . ' '
|
||||
endif
|
||||
let treeParts .= (self.path.isDirectory || g:NERDTreeDirArrowExpandable ==# '' ? '' : ' ')
|
||||
|
||||
let line = treeParts . self.displayString()
|
||||
|
||||
let output = output . line . "\n"
|
||||
endif
|
||||
|
||||
|
||||
@@ -284,7 +284,11 @@ endfunction
|
||||
function! s:UI._indentLevelFor(line)
|
||||
" Replace multi-character DirArrows with a single space so the
|
||||
" indentation calculation doesn't get messed up.
|
||||
let l:line = substitute(substitute(a:line, '\V'.g:NERDTreeDirArrowExpandable, ' ', ''), '\V'.g:NERDTreeDirArrowCollapsible, ' ', '')
|
||||
if g:NERDTreeDirArrowExpandable ==# ''
|
||||
let l:line = ' '.a:line
|
||||
else
|
||||
let l:line = substitute(substitute(a:line, '\V'.g:NERDTreeDirArrowExpandable, ' ', ''), '\V'.g:NERDTreeDirArrowCollapsible, ' ', '')
|
||||
endif
|
||||
let leadChars = match(l:line, '\M\[^ ]')
|
||||
return leadChars / s:UI.IndentWid()
|
||||
endfunction
|
||||
|
||||
@@ -34,6 +34,10 @@ if executable('xdg-open')
|
||||
call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileLinux'})
|
||||
endif
|
||||
|
||||
if nerdtree#runningWindows()
|
||||
call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileWindows'})
|
||||
endif
|
||||
|
||||
if g:NERDTreePath.CopyingSupported()
|
||||
call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
|
||||
endif
|
||||
@@ -141,12 +145,12 @@ function! s:renameBuffer(bufNum, newNodeName, isDirectory)
|
||||
let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'})
|
||||
endif
|
||||
" 1. ensure that a new buffer is loaded
|
||||
call nerdtree#exec('badd ' . quotedFileName, 1)
|
||||
call nerdtree#exec('badd ' . quotedFileName, 0)
|
||||
" 2. ensure that all windows which display the just deleted filename
|
||||
" display a buffer for a new filename.
|
||||
let s:originalTabNumber = tabpagenr()
|
||||
let s:originalWindowNumber = winnr()
|
||||
call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 1)
|
||||
call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 0)
|
||||
call nerdtree#exec('tabnext ' . s:originalTabNumber, 1)
|
||||
call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1)
|
||||
" 3. We don't need a previous buffer anymore
|
||||
@@ -209,7 +213,8 @@ function! NERDTreeMoveNode()
|
||||
|
||||
try
|
||||
if curNode.path.isDirectory
|
||||
let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") =~# curNode.path.str() . "/.*"')
|
||||
let l:curPath = escape(curNode.path.str(),'\') . (nerdtree#runningWindows()?'\\':'/') . '.*'
|
||||
let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") =~# "'.escape(l:curPath,'\').'"')
|
||||
else
|
||||
let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") ==# curNode.path.str()')
|
||||
endif
|
||||
@@ -387,44 +392,78 @@ endfunction
|
||||
|
||||
" FUNCTION: NERDTreeQuickLook() {{{1
|
||||
function! NERDTreeQuickLook()
|
||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
||||
if treenode !=# {}
|
||||
call system("qlmanage -p 2>/dev/null '" . treenode.path.str() . "'")
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('qlmanage -p 2>/dev/null ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeRevealInFinder() {{{1
|
||||
function! NERDTreeRevealInFinder()
|
||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
||||
if treenode !=# {}
|
||||
call system("open -R '" . treenode.path.str() . "'")
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('open -R ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeExecuteFile() {{{1
|
||||
function! NERDTreeExecuteFile()
|
||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
||||
if treenode !=# {}
|
||||
call system("open '" . treenode.path.str() . "'")
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('open ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeRevealFileLinux() {{{1
|
||||
function! NERDTreeRevealFileLinux()
|
||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
||||
let parentnode = treenode.parent
|
||||
if parentnode !=# {}
|
||||
call system("xdg-open '" . parentnode.path.str() . "' &")
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
" Handle the edge case of "/", which has no parent.
|
||||
if l:node.path.str() ==# '/'
|
||||
call system('xdg-open /')
|
||||
return
|
||||
endif
|
||||
|
||||
if empty(l:node.parent)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('xdg-open ' . shellescape(l:node.parent.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeExecuteFileLinux() {{{1
|
||||
function! NERDTreeExecuteFileLinux()
|
||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
||||
if treenode !=# {}
|
||||
call system("xdg-open '" . treenode.path.str() . "' &")
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('xdg-open ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeExecuteFileWindows() {{{1
|
||||
function! NERDTreeExecuteFileWindows()
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
call system('cmd.exe /c start "" ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" vim: set sw=4 sts=4 et fdm=marker:
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ endfunction
|
||||
function! s:FindParentVCSRoot(path)
|
||||
let l:path = a:path
|
||||
while !empty(l:path) &&
|
||||
\ l:path._str() !~# '^\(\a:\\\|\/\)$' &&
|
||||
\ l:path._str() !~# '^\(\a:[\\\/]\|\/\)$' &&
|
||||
\ !isdirectory(l:path._str() . '/.git') &&
|
||||
\ !isdirectory(l:path._str() . '/.svn') &&
|
||||
\ !isdirectory(l:path._str() . '/.hg') &&
|
||||
@@ -42,6 +42,6 @@ function! s:FindParentVCSRoot(path)
|
||||
\ !isdirectory(l:path._str() . '/_darcs')
|
||||
let l:path = l:path.getParent()
|
||||
endwhile
|
||||
return (empty(l:path) || l:path._str() =~# '^\(\a:\\\|\/\)$') ? a:path : l:path
|
||||
return (empty(l:path) || l:path._str() =~# '^\(\a:[\\\/]\|\/\)$') ? a:path : l:path
|
||||
endfunction
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ endfunction
|
||||
|
||||
function! NERDTreeFocus()
|
||||
if g:NERDTree.IsOpen()
|
||||
call g:NERDTree.CursorToTreeWin()
|
||||
call g:NERDTree.CursorToTreeWin(0)
|
||||
else
|
||||
call g:NERDTreeCreator.ToggleTabTree('')
|
||||
endif
|
||||
|
||||
@@ -19,24 +19,7 @@ syn match NERDTreeLinkTarget #->.*# containedin=NERDTreeDir,NERDTreeFile
|
||||
syn match NERDTreeLinkFile #.* ->#me=e-3 containedin=NERDTreeFile
|
||||
syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir
|
||||
|
||||
"highlighing for directory nodes and file nodes
|
||||
syn match NERDTreeDirSlash #/# containedin=NERDTreeDir
|
||||
|
||||
exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
|
||||
exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
|
||||
|
||||
let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-')
|
||||
exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#'
|
||||
syn match NERDTreeExecFile '^ .*\*\($\| \)' contains=NERDTreeRO,NERDTreeBookmark
|
||||
exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile'
|
||||
|
||||
"highlighting for readonly files
|
||||
exec 'syn match NERDTreeRO # *\zs.*\ze \['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile'
|
||||
|
||||
syn match NERDTreeFlags #^ *\zs\[[^\]]*\]# containedin=NERDTreeFile,NERDTreeExecFile
|
||||
syn match NERDTreeFlags #\[[^\]]*\]# containedin=NERDTreeDir
|
||||
|
||||
"highlighing to conceal the delimiter around the file/dir name
|
||||
"highlighting to conceal the delimiter around the file/dir name
|
||||
if has('conceal')
|
||||
exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# conceal containedin=ALL'
|
||||
setlocal conceallevel=3 concealcursor=nvic
|
||||
@@ -45,6 +28,27 @@ else
|
||||
hi! link NERDTreeNodeDelimiters Ignore
|
||||
endif
|
||||
|
||||
"highlighing for directory nodes and file nodes
|
||||
syn match NERDTreeDirSlash #/# containedin=NERDTreeDir
|
||||
|
||||
if g:NERDTreeDirArrowExpandable !=# ''
|
||||
exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
|
||||
exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
|
||||
let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-')
|
||||
exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#'
|
||||
exec 'syn match NERDTreeExecFile #^.*'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark'
|
||||
exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile'
|
||||
else
|
||||
exec 'syn match NERDTreeDir #[^'.g:NERDTreeNodeDelimiter.']\{-}/\ze\($\|'.g:NERDTreeNodeDelimiter.'\)#'
|
||||
exec 'syn match NERDTreeExecFile #[^'.g:NERDTreeNodeDelimiter.']\{-}'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark'
|
||||
exec 'syn match NERDTreeFile #^.*'.g:NERDTreeNodeDelimiter.'.*[^\/]\($\|'.g:NERDTreeNodeDelimiter.'.*\)# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile'
|
||||
endif
|
||||
|
||||
"highlighting for readonly files
|
||||
exec 'syn match NERDTreeRO #.*'.g:NERDTreeNodeDelimiter.'\zs.*\ze'.g:NERDTreeNodeDelimiter.'.*\['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile'
|
||||
|
||||
exec 'syn match NERDTreeFlags #\[[^\]]*\]\ze'.g:NERDTreeNodeDelimiter.'# containedin=NERDTreeFile,NERDTreeExecFile,NERDTreeDir'
|
||||
|
||||
syn match NERDTreeCWD #^[</].*$#
|
||||
|
||||
"highlighting for bookmarks
|
||||
|
||||
Reference in New Issue
Block a user