mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-08 11:23:48 -05:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5f24e2b8b | ||
|
|
0e71462f90 | ||
|
|
2c14ed0e15 | ||
|
|
de0e2edeac | ||
|
|
81f3eaba29 | ||
|
|
f63fb6984f | ||
|
|
a1fa4a33bf | ||
|
|
3a9d533f3d | ||
|
|
d3f9fc44ca | ||
|
|
1d46d6df3e | ||
|
|
593c16add3 | ||
|
|
d3becd1149 | ||
|
|
1b19089917 | ||
|
|
c8be9458dd | ||
|
|
628098fff1 | ||
|
|
b134f6518b |
55
.github/ISSUE_TEMPLATE/bug.md
vendored
55
.github/ISSUE_TEMPLATE/bug.md
vendored
@@ -5,41 +5,42 @@ labels: bug
|
||||
---
|
||||
<!-- Attention! Please Read!
|
||||
|
||||
Please fill out ALL the information below so that the issue can be fully
|
||||
understood. Omitting information will delay the resolution of your issue. It
|
||||
will be labeled "Needs More Info", and may be closed until there is enough
|
||||
information.
|
||||
Please fill out ALL the information below so that the issue can be fully understood. Omitting
|
||||
information will delay the resolution of your issue. It will be labeled "Needs More Info", and
|
||||
may be closed until there is enough information.
|
||||
|
||||
Keep in mind that others may have the same question in the future. The better
|
||||
your information, the more likely they'll be able to help themselves. -->
|
||||
Keep in mind that others may have the same question in the future. The better your information,
|
||||
the more likely they'll be able to help themselves.
|
||||
-->
|
||||
|
||||
#### Self-Diagnosis
|
||||
<!-- Check the boxes after creating the issue, or use [x]. -->
|
||||
- [ ] I have searched the [issues](https://github.com/scrooloose/nerdtree/issues) for an answer to my question.
|
||||
- [ ] I have reviewed the NERDTree documentation. `:h NERDTree`
|
||||
- [ ] I have reviewed the [Wiki](https://github.com/scrooloose/nerdtree/wiki).
|
||||
- [ ] I have searched the web for an answer to my question.
|
||||
Before creating an issue, take some time to search these resources for an answer. It's possible that someone else has already seen and solved your issue.
|
||||
- [old NERDTree issues](https://github.com/preservim/nerdtree/issues?q=is%3Aissue)
|
||||
- NERDTree documentation - `:h NERDTree`
|
||||
- [NERDTree Wiki](https://github.com/preservim/nerdtree/wiki)
|
||||
- Other resources: <https://stackoverflow.com>, <https://vi.stackexchange.com>, etc.
|
||||
|
||||
#### Environment (for bug reports)
|
||||
- [ ] Operating System:
|
||||
- [ ] Vim/Neovim version `:echo v:version`:
|
||||
- [ ] NERDTree version, found on 1st line in NERDTree quickhelp `?`:
|
||||
- [ ] vimrc settings
|
||||
- [ ] NERDTree variables
|
||||
```vim
|
||||
```
|
||||
- Other NERDTree-dependent Plugins
|
||||
- [ ] jistr/vim-nerdtree-tabs
|
||||
- [ ] ryanoasis/vim-devicons
|
||||
- [ ] tiagofumo/vim-nerdtree-syntax-highlight
|
||||
- [ ] Xuyuanp/nerdtree-git-plugin
|
||||
- [ ] Others (specify):
|
||||
- [ ] I've verified the issue occurs with only NERDTree installed.
|
||||
#### Environment
|
||||
- Operating System:
|
||||
- Vim/Neovim version `:version`:
|
||||
- NERDTree version, found on first line of quickhelp `?`:
|
||||
- Are you using any of these NERDTree-dependent plugins? <!-- Check the boxes after creating the issue. -->
|
||||
- [ ] [Xuyuanp/nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin)
|
||||
- [ ] [ryanoasis/vim-devicons](https://github.com/ryanoasis/vim-devicons)
|
||||
- [ ] [tiagofumo/vim-nerdtree-syntax-highlight](https://github.com/tiagofumo/vim-nerdtree-syntax-highlight)
|
||||
- [ ] [scrooloose/nerdtree-project-plugin](https://github.com/scrooloose/nerdtree-project-plugin)
|
||||
- [ ] [PhilRunninger/nerdtree-buffer-ops](https://github.com/PhilRunninger/nerdtree-buffer-ops)
|
||||
- [ ] [PhilRunninger/nerdtree-visual-selection](https://github.com/PhilRunninger/nerdtree-visual-selection)
|
||||
- [ ] [jistr/vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)
|
||||
- [ ] Others (specify):
|
||||
- Provide a minimal **.vimrc** file that will reproduce the issue.
|
||||
```vim
|
||||
```
|
||||
|
||||
#### Steps to Reproduce the Issue
|
||||
1.
|
||||
|
||||
#### Current Result (Include screenshots where appropriate.)
|
||||
#### Current Behavior (Include screenshots where appropriate.)
|
||||
|
||||
#### Expected Result
|
||||
|
||||
|
||||
21
.github/ISSUE_TEMPLATE/question.md
vendored
21
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -3,22 +3,11 @@ name: "General Question"
|
||||
about: "Having trouble setting up NERDTree? Need clarification on a setting? Ask your question here."
|
||||
labels: "general question"
|
||||
---
|
||||
<!-- Attention! Please Read!
|
||||
|
||||
Please fill out ALL the information below so that the issue can be fully
|
||||
understood. Omitting information will delay the resolution of your issue. It
|
||||
will be labeled "Needs More Info", and may be closed until there is enough
|
||||
information.
|
||||
|
||||
Keep in mind that others may have the same question in the future. The better
|
||||
your information, the more likely they'll be able to help themselves. -->
|
||||
|
||||
#### Self-Diagnosis
|
||||
<!-- Check the boxes after creating the issue, or use [x]. -->
|
||||
- [ ] I have searched the [issues](https://github.com/scrooloose/nerdtree/issues) for an answer to my question.
|
||||
- [ ] I have reviewed the NERDTree documentation. `:h NERDTree`
|
||||
- [ ] I have reviewed the [Wiki](https://github.com/scrooloose/nerdtree/wiki).
|
||||
- [ ] I have searched the web for an answer to my question.
|
||||
Before creating an issue, take some time to search these resources. It's possible that someone else has already asked your question and gotten an answer.
|
||||
- [old NERDTree issues](https://github.com/preservim/nerdtree/issues?q=is%3Aissue)
|
||||
- NERDTree documentation - `:h NERDTree`
|
||||
- [NERDTree Wiki](https://github.com/preservim/nerdtree/wiki)
|
||||
- Other resource: <https://stackoverflow.com>, <https://vi.stackexchange.com>, etc.
|
||||
|
||||
#### State Your Question
|
||||
|
||||
|
||||
14
CHANGELOG.md
14
CHANGELOG.md
@@ -4,6 +4,20 @@
|
||||
version in an unordered list. The format is:
|
||||
- **.PATCH**: Pull Request Title (PR Author) [PR Number](Link to PR)
|
||||
-->
|
||||
#### 6.10
|
||||
- **.12**: Answer the question about accessing files over scp or ftp. (PhilRunninger) [#1259](https://github.com/preservim/nerdtree/pull/1259)
|
||||
- **.11**: Trim filenames created via the fs_menu (elanorigby) [#1243](https://github.com/preservim/nerdtree/pull/1243)
|
||||
- **.10**: Improve F.A.Q. Answers and Issue Templates (PhilRunninger) [#1249](https://github.com/preservim/nerdtree/pull/1249)
|
||||
- **.9**: `go` on a bookmark directory will NERDTreeFind it. (PhilRunninger) [#1236](https://github.com/preservim/nerdtree/pull/1236)
|
||||
- **.8**: Put `Callback` function variables in local scope. (PhilRunninger) [#1230](https://github.com/preservim/nerdtree/pull/1230)
|
||||
- **.7**: Fix mouse-clicking a file to open it. (PhilRunninger) [#1225](https://github.com/preservim/nerdtree/pull/1225)
|
||||
- **.6**: Restore the default behavior of the `<CR>` key. (PhilRunninger) [#1221](https://github.com/preservim/nerdtree/pull/1221)
|
||||
- **.5**: Fix `{'keepopen':0}` in NERDTreeCustomOpenArgs (PhilRunninger) [#1217](https://github.com/preservim/nerdtree/pull/1217)
|
||||
- **.4**: Removed directory separator from sort key (Daniel E) [#1219](https://github.com/preservim/nerdtree/pull/1219)
|
||||
- **.3**: Add new FAQ and answer: How to prevent buffers replacing NERDTree. (PhilRunninger) [#1215](https://github.com/preservim/nerdtree/pull/1215)
|
||||
- **.2**: New menu command: Run a system command in this directory. (PhilRunninger) [#1214](https://github.com/preservim/nerdtree/pull/1214)
|
||||
- **.1**: Escape quotation marks so they can be used in key mappings. (PhilRunninger) [#1213](https://github.com/preservim/nerdtree/pull/1213)
|
||||
- **.0**: Enable full path specifications for NERDTreeIgnore (PhilRunninger) [#1207](https://github.com/preservim/nerdtree/pull/1207)
|
||||
#### 6.9
|
||||
- **.12**: Respect NERDTreeCustomOpenArgs when opening bookmark (przepompownia) [#1200](https://github.com/preservim/nerdtree/pull/1200)
|
||||
- **.11**: Revamp the README. (buncis, PhilRunninger) [#1192](https://github.com/preservim/nerdtree/pull/1192), [#1193](https://github.com/preservim/nerdtree/pull/1193)
|
||||
|
||||
@@ -8,7 +8,7 @@ The NERDTree is a file system explorer for the Vim editor. Using this plugin, us
|
||||
|
||||
## Installation
|
||||
|
||||
Use your favorite plugin manager to install this plugin. [tpope/vim-pathogen](https://github.com/tpope/vim-pathogen), [VundleVimVundle.vim](https://github.com/VundleVim/Vundle.vim), [junegunnvim-plug](https://github.com/junegunn/vim-plug), and [Shougo/dein.vim](https://github.com/Shougo/dein.vim) are some of the more popular ones. A lengthy discussion of these and other managers can be found on [vi.stackexchange.com](https://vi.stackexchange.com/questions/388/what-is-the-difference-between-the-vim-plugin-managers). Basic instructions are provided below, but please **be sure to read, understand, and follow all the safety rules that come with your ~~power tools~~ plugin manager.**
|
||||
Use your favorite plugin manager to install this plugin. [tpope/vim-pathogen](https://github.com/tpope/vim-pathogen), [VundleVim/Vundle.vim](https://github.com/VundleVim/Vundle.vim), [junegunn/vim-plug](https://github.com/junegunn/vim-plug), and [Shougo/dein.vim](https://github.com/Shougo/dein.vim) are some of the more popular ones. A lengthy discussion of these and other managers can be found on [vi.stackexchange.com](https://vi.stackexchange.com/questions/388/what-is-the-difference-between-the-vim-plugin-managers). Basic instructions are provided below, but please **be sure to read, understand, and follow all the safety rules that come with your ~~power tools~~ plugin manager.**
|
||||
|
||||
If you have no favorite, or want to manage your plugins without 3rd-party dependencies, consider using Vim 8+ packages, as described in Greg Hurrell's excellent Youtube video: [Vim screencast #75: Plugin managers](https://www.youtube.com/watch?v=X2_R3uxDN6g).
|
||||
|
||||
@@ -148,19 +148,31 @@ autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists('s:std_in
|
||||
\ execute 'NERDTree' argv()[0] | wincmd p | enew | execute 'cd '.argv()[0] | endif
|
||||
```
|
||||
|
||||
### How can I close Vim automatically when NERDTree is the last window?
|
||||
### How can I close Vim or a tab automatically when NERDTree is the last window?
|
||||
|
||||
```vim
|
||||
" Exit Vim if NERDTree is the only window left.
|
||||
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() |
|
||||
\ quit | endif
|
||||
" Exit Vim if NERDTree is the only window remaining in the only tab.
|
||||
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
|
||||
```
|
||||
---
|
||||
```vim
|
||||
" Close the tab if NERDTree is the only window remaining in it.
|
||||
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
|
||||
```
|
||||
|
||||
### How can I prevent other buffers replacing NERDTree in its window?
|
||||
|
||||
```vim
|
||||
" If another buffer tries to replace NERDTree, put it in the other window, and bring back NERDTree.
|
||||
autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 |
|
||||
\ let buf=bufnr() | buffer# | execute "normal! \<C-W>w" | execute 'buffer'.buf | endif
|
||||
```
|
||||
|
||||
### Can I have the same NERDTree on every tab automatically?
|
||||
|
||||
```vim
|
||||
" Open the existing NERDTree on each new tab.
|
||||
autocmd BufWinEnter * silent NERDTreeMirror
|
||||
autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif
|
||||
```
|
||||
or change your NERDTree-launching shortcut key like so:
|
||||
```vim
|
||||
@@ -176,3 +188,34 @@ let g:NERDTreeDirArrowCollapsible = '▾'
|
||||
```
|
||||
The preceding values are the non-Windows default arrow symbols. Setting these variables to empty strings will remove the arrows completely and shift the entire tree two character positions to the left. See `:h NERDTreeDirArrowExpandable` for more details.
|
||||
|
||||
### Can NERDTree access remote files via scp or ftp?
|
||||
|
||||
Short answer: No, and there are no plans to add that functionality. However, Vim ships with a plugin that does just that. It's called netrw, and by adding the following lines to your `.vimrc`, you can use it to open files over the `scp:`, `ftp:`, or other protocols, while still using NERDTree for all local files. The function seamlessly makes the decision to open NERDTree or netrw, and other supported protocols can be added to the regular expression.
|
||||
|
||||
```vim
|
||||
" Function to open the file or NERDTree or netrw.
|
||||
" Returns: 1 if either file explorer was opened; otherwise, 0.
|
||||
function! s:OpenFileOrExplorer(...)
|
||||
if a:0 == 0 || a:1 == ''
|
||||
NERDTree
|
||||
elseif filereadable(a:1)
|
||||
execute 'edit '.a:1
|
||||
return 0
|
||||
elseif a:1 =~? '^\(scp\|ftp\)://' " Add other protocols as needed.
|
||||
execute 'Vexplore '.a:1
|
||||
elseif isdirectory(a:1)
|
||||
execute 'NERDTree '.a:1
|
||||
endif
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
" Auto commands to handle OS commandline arguments
|
||||
autocmd StdinReadPre * let s:std_in=1
|
||||
autocmd VimEnter * if argc()==1 && !exists('s:std_in') | if <SID>OpenFileOrExplorer(argv()[0]) | wincmd p | enew | wincmd p | endif | endif
|
||||
|
||||
" Command to call the OpenFileOrExplorer function.
|
||||
command! -n=? -complete=file -bar Edit :call <SID>OpenFileOrExplorer('<args>')
|
||||
|
||||
" Command-mode abbreviation to replace the :edit Vim command.
|
||||
cnoreabbrev e Edit
|
||||
```
|
||||
|
||||
@@ -30,6 +30,16 @@ endfunction
|
||||
" SECTION: General Functions {{{1
|
||||
"============================================================
|
||||
|
||||
" FUNCTION: nerdtree#closeTreeOnOpen() {{{2
|
||||
function! nerdtree#closeTreeOnOpen() abort
|
||||
return g:NERDTreeQuitOnOpen == 1 || g:NERDTreeQuitOnOpen == 3
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#closeBookmarksOnOpen() {{{2
|
||||
function! nerdtree#closeBookmarksOnOpen() abort
|
||||
return g:NERDTreeQuitOnOpen == 2 || g:NERDTreeQuitOnOpen == 3
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#slash() {{{2
|
||||
" Return the path separator used by the underlying file system. Special
|
||||
" consideration is taken for the use of the 'shellslash' option on Windows
|
||||
@@ -46,28 +56,6 @@ function! nerdtree#slash() abort
|
||||
return '/'
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#and(x,y) {{{2
|
||||
" Implements and() function for Vim <= 7.4
|
||||
function! nerdtree#and(x,y) abort
|
||||
if exists('*and')
|
||||
return and(a:x, a:y)
|
||||
else
|
||||
let l:x = a:x
|
||||
let l:y = a:y
|
||||
let l:n = 0
|
||||
let l:result = 0
|
||||
while l:x > 0 && l:y > 0
|
||||
if (l:x % 2) && (l:y % 2)
|
||||
let l:result += float2nr(pow(2, l:n))
|
||||
endif
|
||||
let l:x = float2nr(l:x / 2)
|
||||
let l:y = float2nr(l:y / 2)
|
||||
let l:n += 1
|
||||
endwhile
|
||||
return l:result
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#checkForBrowse(dir) {{{2
|
||||
"inits a window tree in the current buffer if appropriate
|
||||
function! nerdtree#checkForBrowse(dir) abort
|
||||
|
||||
@@ -109,40 +109,16 @@ endfunction
|
||||
|
||||
"FUNCTION: s:initCustomOpenArgs() {{{1
|
||||
function! s:initCustomOpenArgs() abort
|
||||
let l:defaultOpenArgs = {'file': {'reuse': 'all', 'where': 'p'}, 'dir': {}}
|
||||
let l:customOpenArgs = get(g:, 'NERDTreeCustomOpenArgs', {})
|
||||
|
||||
if !s:validateType(l:customOpenArgs, type({})) || empty(l:customOpenArgs)
|
||||
let g:NERDTreeCustomOpenArgs = l:customOpenArgs
|
||||
return l:defaultOpenArgs
|
||||
endif
|
||||
|
||||
for l:typeKey in keys(l:defaultOpenArgs)
|
||||
if !s:validateType(get(l:customOpenArgs, l:typeKey, {}), type({}))
|
||||
\ || !has_key(l:customOpenArgs, l:typeKey)
|
||||
let l:customOpenArgs[l:typeKey] = l:defaultOpenArgs[l:typeKey]
|
||||
continue
|
||||
endif
|
||||
|
||||
for l:optionName in keys(l:defaultOpenArgs[l:typeKey])
|
||||
if s:validateType(get(l:customOpenArgs[l:typeKey], l:optionName, v:null), type(''))
|
||||
continue
|
||||
endif
|
||||
let l:customOpenArgs[l:typeKey][l:optionName] = l:defaultOpenArgs[l:typeKey][l:optionName]
|
||||
endfor
|
||||
endfor
|
||||
|
||||
let g:NERDTreeCustomOpenArgs = l:customOpenArgs
|
||||
|
||||
return extend(l:customOpenArgs, l:defaultOpenArgs, 'keep')
|
||||
endfunction
|
||||
|
||||
function! s:validateType(variable, type) abort
|
||||
if type(a:variable) == a:type
|
||||
return v:true
|
||||
endif
|
||||
|
||||
return v:false
|
||||
let l:defaultOpenArgs = {'file': {'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()}, 'dir': {}}
|
||||
try
|
||||
let g:NERDTreeCustomOpenArgs = get(g:, 'NERDTreeCustomOpenArgs', {})
|
||||
call extend(g:NERDTreeCustomOpenArgs, l:defaultOpenArgs, 'keep')
|
||||
catch /^Vim(\a\+):E712:/
|
||||
call nerdtree#echoWarning('g:NERDTreeCustomOpenArgs is not set properly. Using default value.')
|
||||
let g:NERDTreeCustomOpenArgs = l:defaultOpenArgs
|
||||
finally
|
||||
return g:NERDTreeCustomOpenArgs
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:activateAll() {{{1
|
||||
@@ -168,13 +144,13 @@ endfunction
|
||||
"FUNCTION: s:activateFileNode() {{{1
|
||||
"handle the user activating a tree node
|
||||
function! s:activateFileNode(node) abort
|
||||
call a:node.activate({'reuse': 'all', 'where': 'p'})
|
||||
call a:node.activate({'reuse': 'all', 'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()})
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:activateBookmark(bookmark) {{{1
|
||||
"handle the user activating a bookmark
|
||||
function! s:activateBookmark(bm) abort
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p'} : {})
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1
|
||||
@@ -397,7 +373,7 @@ function! s:handleLeftClick() abort
|
||||
if currentNode.path.isDirectory
|
||||
call currentNode.activate()
|
||||
else
|
||||
call currentNode.activate({'reuse': 'all', 'where': 'p'})
|
||||
call currentNode.activate({'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()})
|
||||
endif
|
||||
return
|
||||
endif
|
||||
@@ -539,24 +515,24 @@ endfunction
|
||||
|
||||
" FUNCTION: s:openHSplit(target) {{{1
|
||||
function! s:openHSplit(target) abort
|
||||
call a:target.activate({'where': 'h'})
|
||||
call a:target.activate({'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()})
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:openVSplit(target) {{{1
|
||||
function! s:openVSplit(target) abort
|
||||
call a:target.activate({'where': 'v'})
|
||||
call a:target.activate({'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()})
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:openHSplitBookmark(bookmark) {{{1
|
||||
"handle the user activating a bookmark
|
||||
function! s:openHSplitBookmark(bm) abort
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h'} : {})
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:openVSplitBookmark(bookmark) {{{1
|
||||
"handle the user activating a bookmark
|
||||
function! s:openVSplitBookmark(bm) abort
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v'} : {})
|
||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:previewHSplitBookmark(bookmark) {{{1
|
||||
@@ -576,13 +552,13 @@ endfunction
|
||||
|
||||
" FUNCTION: s:openInNewTab(target) {{{1
|
||||
function! s:openInNewTab(target) abort
|
||||
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't'})
|
||||
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen()})
|
||||
call l:opener.open(a:target)
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:openInNewTabSilent(target) {{{1
|
||||
function! s:openInNewTabSilent(target) abort
|
||||
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'stay': 1})
|
||||
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen(), 'stay': 1})
|
||||
call l:opener.open(a:target)
|
||||
endfunction
|
||||
|
||||
@@ -596,7 +572,11 @@ endfunction
|
||||
|
||||
" FUNCTION: s:previewBookmark(bookmark) {{{1
|
||||
function! s:previewBookmark(bookmark) abort
|
||||
call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'h', 'keepopen': 1} : {})
|
||||
if a:bookmark.path.isDirectory
|
||||
execute 'NERDTreeFind '.a:bookmark.path.str()
|
||||
else
|
||||
call a:bookmark.activate(b:NERDTree, {'stay': 1, 'where': 'p', 'keepopen': 1})
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:previewNodeCurrent(node) {{{1
|
||||
@@ -621,7 +601,7 @@ function! nerdtree#ui_glue#revealBookmark(name) abort
|
||||
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree)
|
||||
call targetNode.putCursorHere(0, 1)
|
||||
catch /^NERDTree.BookmarkNotFoundError/
|
||||
call nerdtree#echo('Bookmark isnt cached under the current root')
|
||||
call nerdtree#echo('Bookmark isn''t cached under the current root')
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ The following features and functionality are provided by the NERDTree:
|
||||
:NERDTreeVCS (opens root of repository containing CWD)
|
||||
<
|
||||
:NERDTreeFromBookmark <bookmark> *:NERDTreeFromBookmark*
|
||||
Opens a fresh NERDTree with the root initialized to the dir for
|
||||
Opens a fresh NERDTree with the root initialized to the directory for
|
||||
<bookmark>. The only reason to use this command over :NERDTree is for
|
||||
the completion (which is for bookmarks rather than directories).
|
||||
|
||||
@@ -126,7 +126,7 @@ The following features and functionality are provided by the 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*
|
||||
:NERDTreeToggleVCS [<start-directory> | <bookmark>] *:NERDTreeToggleVCS*
|
||||
Like |:NERDTreeToggle|, but searches up the directory tree to find the top of
|
||||
the version control system repository, and roots the NERDTree there. It
|
||||
works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A
|
||||
@@ -249,7 +249,7 @@ Key Description help-tag~
|
||||
|
||||
o........Open files, directories and bookmarks......................|NERDTree-o|
|
||||
go.......Open selected file, but leave cursor in the NERDTree......|NERDTree-go|
|
||||
Open selected bookmark dir in current NERDTree
|
||||
Find selected bookmark directory in current NERDTree
|
||||
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|
|
||||
i........Open selected file in a split window.......................|NERDTree-i|
|
||||
@@ -260,10 +260,10 @@ gs.......Same as s, but leave the cursor on the NERDTree...........|NERDTree-gs|
|
||||
O........Recursively open the selected directory....................|NERDTree-O|
|
||||
x........Close the current nodes parent.............................|NERDTree-x|
|
||||
X........Recursively close all children of the current node.........|NERDTree-X|
|
||||
e........Edit the current dir.......................................|NERDTree-e|
|
||||
e........Edit the current directory.................................|NERDTree-e|
|
||||
|
||||
double-click....same as |NERDTree-o|.
|
||||
middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for dirs.
|
||||
middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for directories.
|
||||
|
||||
D........Delete the current bookmark ...............................|NERDTree-D|
|
||||
|
||||
@@ -274,13 +274,13 @@ J........Jump down inside directories at the current tree depth.....|NERDTree-J|
|
||||
<C-J>....Jump down to next sibling of the current directory.......|NERDTree-C-J|
|
||||
<C-K>....Jump up to previous sibling of the current directory.....|NERDTree-C-K|
|
||||
|
||||
C........Change the tree root to the selected dir...................|NERDTree-C|
|
||||
C........Change the tree root to the selected directory.............|NERDTree-C|
|
||||
u........Move the tree root up one directory........................|NERDTree-u|
|
||||
U........Same as 'u' except the old root node is left open..........|NERDTree-U|
|
||||
r........Recursively refresh the current directory..................|NERDTree-r|
|
||||
R........Recursively refresh the current root.......................|NERDTree-R|
|
||||
m........Display the NERDTree menu..................................|NERDTree-m|
|
||||
cd.......Change the CWD to the dir of the selected node............|NERDTree-cd|
|
||||
cd.......Change the CWD to the directory of the selected node......|NERDTree-cd|
|
||||
CD.......Change tree root to the CWD...............................|NERDTree-CD|
|
||||
|
||||
I........Toggle whether hidden files displayed......................|NERDTree-I|
|
||||
@@ -469,7 +469,7 @@ Jump to the first child of the current nodes parent.
|
||||
|
||||
If the cursor is already on the first node then do the following:
|
||||
* loop back thru the siblings of the current nodes parent until we find an
|
||||
open dir with children
|
||||
open directory with children
|
||||
* go to the first child of that node
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -482,7 +482,7 @@ Jump to the last child of the current nodes parent.
|
||||
|
||||
If the cursor is already on the last node then do the following:
|
||||
* loop forward thru the siblings of the current nodes parent until we find
|
||||
an open dir with children
|
||||
an open directory with children
|
||||
* go to the last child of that node
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -516,7 +516,7 @@ Default key: u
|
||||
Map setting: *NERDTreeMapUpdir*
|
||||
Applies to: no restrictions.
|
||||
|
||||
Move the tree root up a dir (like doing a "cd ..").
|
||||
Move the tree root up a directory (like doing a "cd ..").
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
*NERDTree-U*
|
||||
@@ -532,8 +532,8 @@ Default key: r
|
||||
Map setting: *NERDTreeMapRefresh*
|
||||
Applies to: files and directories.
|
||||
|
||||
If a dir is selected, recursively refresh that dir, i.e. scan the filesystem
|
||||
for changes and represent them in the tree.
|
||||
If a directory is selected, recursively refresh that directory, i.e. scan the
|
||||
filesystem for changes and represent them in the tree.
|
||||
|
||||
If a file node is selected then the above is done on it's parent.
|
||||
|
||||
@@ -634,8 +634,8 @@ file explorers have.
|
||||
|
||||
The script comes with two default menu plugins: exec_menuitem.vim and
|
||||
fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for
|
||||
creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a
|
||||
menu item to execute executable files.
|
||||
creating/deleting/moving/copying files and directories. exec_menuitem.vim
|
||||
provides a menu item to execute executable files.
|
||||
|
||||
Related tags: |NERDTree-m| |NERDTreeApi|
|
||||
|
||||
@@ -921,7 +921,7 @@ Default: ['\~$'].
|
||||
|
||||
This setting is used to specify which files the NERDTree should ignore. It
|
||||
must be a list of regular expressions. When the NERDTree is rendered, any
|
||||
files/dirs that match any of the regex's in NERDTreeIgnore won't be
|
||||
files/directories that match any of the regex's in NERDTreeIgnore won't be
|
||||
displayed.
|
||||
|
||||
For example if you put the following line in your vimrc: >
|
||||
@@ -929,13 +929,18 @@ For example if you put the following line in your vimrc: >
|
||||
<
|
||||
then all files ending in .vim or ~ will be ignored.
|
||||
|
||||
There are 2 magic flags that can be appended to the end of each regular
|
||||
expression to specify that the regex should match only files or only dirs.
|
||||
These flags are "[[dir]]" and "[[file]]". Example: >
|
||||
let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]']
|
||||
There are 3 magic flags that can be appended to the end of each regular
|
||||
expression to specify that the regex should match only filenames, only lowest
|
||||
level directories, or a full path. These flags are "[[dir]]", "[[file]]", and
|
||||
"[[path]]". Example: >
|
||||
let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]', 'tmp/cache$[[path]]']
|
||||
<
|
||||
This will cause all dirs ending in ".d" to be ignored and all files ending in
|
||||
".o" to be ignored.
|
||||
This will cause all directories ending in ".d" to be ignored, all files ending
|
||||
in ".o" to be ignored, and the "cache" subdirectory of any "tmp" directory to
|
||||
be ignored. All other "cache" directories will be displayed.
|
||||
|
||||
When using the "[[path]]" tag on Windows, make sure you use escaped
|
||||
backslashes for the separators in the regex, eg. 'Temp\\cache$[[path]]'
|
||||
|
||||
Note: to tell the NERDTree not to ignore any files you must use the following
|
||||
line: >
|
||||
@@ -1099,8 +1104,8 @@ Examples: >
|
||||
<
|
||||
1. Directories will appear last, everything else will appear above.
|
||||
2. Everything will simply appear in alphabetical order.
|
||||
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.
|
||||
3. Directories will appear first, then ruby and php. Swap files, bak files
|
||||
and vim backup files will appear last with everything else preceding them.
|
||||
4. Everything is sorted by size, largest to smallest, with directories
|
||||
considered to have size 0 bytes.
|
||||
5. Directories will appear first alphabetically, followed by files, sorted by
|
||||
@@ -1174,8 +1179,9 @@ Use one of the following lines for this setting: >
|
||||
Values: 0 or 1
|
||||
Default: 1.
|
||||
|
||||
When displaying dir nodes, this setting tells NERDTree to collapse dirs that
|
||||
have only one child. Use one of the following lines for this setting: >
|
||||
When displaying directory nodes, this setting tells NERDTree to collapse
|
||||
directories that have only one child. Use one of the following lines for this
|
||||
setting: >
|
||||
let NERDTreeCascadeSingleChildDir=0
|
||||
let NERDTreeCascadeSingleChildDir=1
|
||||
<
|
||||
@@ -1184,11 +1190,12 @@ have only one child. Use one of the following lines for this setting: >
|
||||
Values: 0 or 1
|
||||
Default: 1.
|
||||
|
||||
When opening dir nodes, this setting tells NERDTree to recursively open dirs
|
||||
that have only one child which is also a dir. NERDTree will stop when it finds
|
||||
a dir that contains anything but another single dir. This setting also causes
|
||||
the |NERDTree-x| mapping to close dirs in the same manner. This setting may be
|
||||
useful for Java projects. Use one of the following lines for this setting: >
|
||||
When opening directory nodes, this setting tells NERDTree to recursively open
|
||||
directories that have only one child which is also a directory. NERDTree will
|
||||
stop when it finds a directory that contains anything but another single
|
||||
directory. This setting also causes the |NERDTree-x| mapping to close
|
||||
directories in the same manner. This setting may be useful for Java projects.
|
||||
Use one of the following lines for this setting: >
|
||||
let NERDTreeCascadeOpenSingleChildDir=0
|
||||
let NERDTreeCascadeOpenSingleChildDir=1
|
||||
<
|
||||
@@ -1362,8 +1369,8 @@ NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()*
|
||||
<
|
||||
This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim.
|
||||
It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of
|
||||
the current dir node. Note this mapping will only fire when the cursor is
|
||||
on a directory node.
|
||||
the current directory node. Note this mapping will only fire when the
|
||||
cursor is on a directory node.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
4.2. Menu API *NERDTreeMenuAPI*
|
||||
|
||||
@@ -256,7 +256,7 @@ endfunction
|
||||
function! s:Bookmark.open(nerdtree, ...)
|
||||
let opts = a:0 ? a:1 : {}
|
||||
|
||||
if nerdtree#and(g:NERDTreeQuitOnOpen,2)
|
||||
if nerdtree#closeBookmarksOnOpen()
|
||||
call a:nerdtree.ui.toggleShowBookmarks()
|
||||
endif
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ function! s:KeyMap.bind()
|
||||
else
|
||||
let keymapInvokeString = self.key
|
||||
endif
|
||||
let keymapInvokeString = escape(keymapInvokeString, '\')
|
||||
let keymapInvokeString = escape(keymapInvokeString, '\"')
|
||||
|
||||
let premap = self.key ==# '<LeftRelease>' ? ' <LeftRelease>' : ' '
|
||||
|
||||
@@ -66,11 +66,11 @@ endfunction
|
||||
"FUNCTION: KeyMap.invoke() {{{1
|
||||
"Call the KeyMaps callback function
|
||||
function! s:KeyMap.invoke(...)
|
||||
let Callback = type(self.callback) ==# type(function('tr')) ? self.callback : function(self.callback)
|
||||
let l:Callback = type(self.callback) ==# type(function('tr')) ? self.callback : function(self.callback)
|
||||
if a:0
|
||||
call Callback(a:1)
|
||||
call l:Callback(a:1)
|
||||
else
|
||||
call Callback()
|
||||
call l:Callback()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
@@ -65,14 +65,6 @@ function! s:NERDTree.Close()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:NERDTree.CloseIfQuitOnOpen() {{{1
|
||||
"Closes the NERD tree window if the close on open option is set
|
||||
function! s:NERDTree.CloseIfQuitOnOpen()
|
||||
if nerdtree#and(g:NERDTreeQuitOnOpen,1) && s:NERDTree.IsOpen()
|
||||
call s:NERDTree.Close()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1
|
||||
"Places the cursor at the top of the bookmarks table
|
||||
function! s:NERDTree.CursorToBookmarkTable()
|
||||
|
||||
@@ -15,8 +15,8 @@ function! s:Notifier.NotifyListeners(event, path, nerdtree, params)
|
||||
let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params)
|
||||
|
||||
for Listener in s:Notifier.GetListenersForEvent(a:event)
|
||||
let Callback = type(Listener) == type(function('tr')) ? Listener : function(Listener)
|
||||
call Callback(event)
|
||||
let l:Callback = type(Listener) == type(function('tr')) ? Listener : function(Listener)
|
||||
call l:Callback(event)
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
|
||||
@@ -33,8 +33,7 @@ function! s:Opener._bufInWindows(bnum)
|
||||
endfunction
|
||||
|
||||
" FUNCTION: Opener._checkToCloseTree(newtab) {{{1
|
||||
" Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see
|
||||
" if the tree should be closed now.
|
||||
" Check the class options to see if the tree should be closed now.
|
||||
"
|
||||
" Args:
|
||||
" a:newtab - boolean. If set, only close the tree now if we are opening the
|
||||
@@ -46,7 +45,7 @@ function! s:Opener._checkToCloseTree(newtab)
|
||||
endif
|
||||
|
||||
if (a:newtab && self._where ==# 't') || !a:newtab
|
||||
call g:NERDTree.CloseIfQuitOnOpen()
|
||||
call g:NERDTree.Close()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -218,7 +217,7 @@ endfunction
|
||||
|
||||
" FUNCTION: Opener._openFile() {{{1
|
||||
function! s:Opener._openFile()
|
||||
if !self._stay && !nerdtree#and(g:NERDTreeQuitOnOpen,1) && exists('b:NERDTreeZoomed') && b:NERDTreeZoomed
|
||||
if !self._stay && self._keepopen && get(b:, 'NERDTreeZoomed', 0)
|
||||
call b:NERDTree.ui.toggleZoom()
|
||||
endif
|
||||
|
||||
|
||||
@@ -394,7 +394,7 @@ function! s:Path.getSortKey()
|
||||
let self._sortKey = [self.getSortOrderIndex()] + metadata
|
||||
endif
|
||||
|
||||
let path = self.getLastPathComponent(1)
|
||||
let path = self.getLastPathComponent(0)
|
||||
if !g:NERDTreeSortHiddenFirst
|
||||
let path = substitute(path, '^[._]', '', '')
|
||||
endif
|
||||
@@ -459,10 +459,10 @@ function! s:Path.ignore(nerdtree)
|
||||
endif
|
||||
endfor
|
||||
|
||||
for Callback in g:NERDTree.PathFilters()
|
||||
let Callback = type(Callback) ==# type(function('tr')) ? Callback : function(Callback)
|
||||
if Callback({'path': self, 'nerdtree': a:nerdtree})
|
||||
return 1
|
||||
for l:Callback in g:NERDTree.PathFilters()
|
||||
let l:Callback = type(l:Callback) ==# type(function('tr')) ? l:Callback : function(l:Callback)
|
||||
if l:Callback({'path': self, 'nerdtree': a:nerdtree})
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
@@ -483,7 +483,10 @@ endfunction
|
||||
" returns true if this path matches the given ignore pattern
|
||||
function! s:Path._ignorePatternMatches(pattern)
|
||||
let pat = a:pattern
|
||||
if strpart(pat,len(pat)-7) ==# '[[dir]]'
|
||||
if strpart(pat,len(pat)-8) ==# '[[path]]'
|
||||
let pat = strpart(pat,0, len(pat)-8)
|
||||
return self.str() =~# pat
|
||||
elseif strpart(pat,len(pat)-7) ==# '[[dir]]'
|
||||
if !self.isDirectory
|
||||
return 0
|
||||
endif
|
||||
|
||||
@@ -49,6 +49,10 @@ else
|
||||
call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'})
|
||||
endif
|
||||
|
||||
if exists('*system')
|
||||
call NERDTreeAddMenuItem({'text': 'Run (s)ystem command in this directory', 'shortcut':'s', 'callback': 'NERDTreeSystemCommand'})
|
||||
endif
|
||||
|
||||
"FUNCTION: s:inputPrompt(action){{{1
|
||||
"returns the string that should be prompted to the user for the given action
|
||||
"
|
||||
@@ -165,7 +169,7 @@ endfunction
|
||||
function! NERDTreeAddNode()
|
||||
let curDirNode = g:NERDTreeDirNode.GetSelected()
|
||||
let prompt = s:inputPrompt('add')
|
||||
let newNodeName = input(prompt, curDirNode.path.str() . nerdtree#slash(), 'file')
|
||||
let newNodeName = trim(input(prompt, curDirNode.path.str() . nerdtree#slash(), 'file'))
|
||||
|
||||
if newNodeName ==# ''
|
||||
call nerdtree#echo('Node Creation Aborted.')
|
||||
@@ -202,7 +206,7 @@ function! NERDTreeMoveNode()
|
||||
let newNodePath = input(prompt, curNode.path.str(), 'file')
|
||||
while filereadable(newNodePath)
|
||||
call nerdtree#echoWarning('This destination already exists. Try again.')
|
||||
let newNodePath = input(prompt, curNode.path.str(), 'file')
|
||||
let newNodePath = trim(input(prompt, curNode.path.str(), 'file'))
|
||||
endwhile
|
||||
|
||||
|
||||
@@ -333,7 +337,7 @@ endfunction
|
||||
function! NERDTreeCopyNode()
|
||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
||||
let prompt = s:inputPrompt('copy')
|
||||
let newNodePath = input(prompt, currentNode.path.str(), 'file')
|
||||
let newNodePath = trim(input(prompt, currentNode.path.str(), 'file'))
|
||||
|
||||
if newNodePath !=# ''
|
||||
"strip trailing slash
|
||||
@@ -460,4 +464,21 @@ function! NERDTreeExecuteFileWindows()
|
||||
call system('cmd.exe /c start "" ' . shellescape(l:node.path.str()))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: NERDTreeSystemCommand() {{{1
|
||||
function! NERDTreeSystemCommand()
|
||||
let l:node = g:NERDTreeFileNode.GetSelected()
|
||||
|
||||
if empty(l:node)
|
||||
return
|
||||
endif
|
||||
|
||||
let l:cwd = getcwd()
|
||||
let l:directory = l:node.path.isDirectory ? l:node.path.str() : l:node.parent.path.str()
|
||||
execute 'cd '.l:directory
|
||||
|
||||
let l:nl = nr2char(10)
|
||||
echo l:nl . system(input(l:directory . (nerdtree#runningWindows() ? '> ' : ' $ ')))
|
||||
execute 'cd '.l:cwd
|
||||
endfunction
|
||||
|
||||
" vim: set sw=4 sts=4 et fdm=marker:
|
||||
|
||||
Reference in New Issue
Block a user