]>
Commit | Line | Data |
---|---|---|
1 | " ============================================================================ | |
2 | " File: fs_menu.vim | |
3 | " Description: plugin for the NERD Tree that provides a file system menu | |
4 | " Maintainer: Martin Grenfell <martin.grenfell at gmail dot com> | |
5 | " Last Change: 17 July, 2009 | |
6 | " License: This program is free software. It comes without any warranty, | |
7 | " to the extent permitted by applicable law. You can redistribute | |
8 | " it and/or modify it under the terms of the Do What The Fuck You | |
9 | " Want To Public License, Version 2, as published by Sam Hocevar. | |
10 | " See http://sam.zoy.org/wtfpl/COPYING for more details. | |
11 | " | |
12 | " ============================================================================ | |
13 | if exists("g:loaded_nerdtree_fs_menu") | |
14 | finish | |
15 | endif | |
16 | let g:loaded_nerdtree_fs_menu = 1 | |
17 | ||
18 | call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'}) | |
19 | call NERDTreeAddMenuItem({'text': '(m)ove the curent node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) | |
20 | call NERDTreeAddMenuItem({'text': '(d)elete the curent node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) | |
21 | if g:NERDTreePath.CopyingSupported() | |
22 | call NERDTreeAddMenuItem({'text': '(c)copy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) | |
23 | endif | |
24 | ||
25 | "FUNCTION: s:echo(msg){{{1 | |
26 | function! s:echo(msg) | |
27 | redraw | |
28 | echomsg "NERDTree: " . a:msg | |
29 | endfunction | |
30 | ||
31 | "FUNCTION: s:echoWarning(msg){{{1 | |
32 | function! s:echoWarning(msg) | |
33 | echohl warningmsg | |
34 | call s:echo(a:msg) | |
35 | echohl normal | |
36 | endfunction | |
37 | ||
38 | "FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1 | |
39 | "prints out the given msg and, if the user responds by pushing 'y' then the | |
40 | "buffer with the given bufnum is deleted | |
41 | " | |
42 | "Args: | |
43 | "bufnum: the buffer that may be deleted | |
44 | "msg: a message that will be echoed to the user asking them if they wish to | |
45 | " del the buffer | |
46 | function! s:promptToDelBuffer(bufnum, msg) | |
47 | echo a:msg | |
48 | if nr2char(getchar()) ==# 'y' | |
49 | exec "silent bdelete! " . a:bufnum | |
50 | endif | |
51 | endfunction | |
52 | ||
53 | "FUNCTION: NERDTreeAddNode(){{{1 | |
54 | function! NERDTreeAddNode() | |
55 | let curDirNode = g:NERDTreeDirNode.GetSelected() | |
56 | ||
57 | let newNodeName = input("Add a childnode\n". | |
58 | \ "==========================================================\n". | |
59 | \ "Enter the dir/file name to be created. Dirs end with a '/'\n" . | |
60 | \ "", curDirNode.path.str({'format': 'Glob'}) . g:NERDTreePath.Slash()) | |
61 | ||
62 | if newNodeName ==# '' | |
63 | call s:echo("Node Creation Aborted.") | |
64 | return | |
65 | endif | |
66 | ||
67 | try | |
68 | let newPath = g:NERDTreePath.Create(newNodeName) | |
69 | let parentNode = b:NERDTreeRoot.findNode(newPath.getParent()) | |
70 | ||
71 | let newTreeNode = g:NERDTreeFileNode.New(newPath) | |
72 | if parentNode.isOpen || !empty(parentNode.children) | |
73 | call parentNode.addChild(newTreeNode, 1) | |
74 | call NERDTreeRender() | |
75 | call newTreeNode.putCursorHere(1, 0) | |
76 | endif | |
77 | catch /^NERDTree/ | |
78 | call s:echoWarning("Node Not Created.") | |
79 | endtry | |
80 | endfunction | |
81 | ||
82 | "FUNCTION: NERDTreeMoveNode(){{{1 | |
83 | function! NERDTreeMoveNode() | |
84 | let curNode = g:NERDTreeFileNode.GetSelected() | |
85 | let newNodePath = input("Rename the current node\n" . | |
86 | \ "==========================================================\n" . | |
87 | \ "Enter the new path for the node: \n" . | |
88 | \ "", curNode.path.str()) | |
89 | ||
90 | if newNodePath ==# '' | |
91 | call s:echo("Node Renaming Aborted.") | |
92 | return | |
93 | endif | |
94 | ||
95 | try | |
96 | let bufnum = bufnr(curNode.path.str()) | |
97 | ||
98 | call curNode.rename(newNodePath) | |
99 | call NERDTreeRender() | |
100 | ||
101 | "if the node is open in a buffer, ask the user if they want to | |
102 | "close that buffer | |
103 | if bufnum != -1 | |
104 | let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)" | |
105 | call s:promptToDelBuffer(bufnum, prompt) | |
106 | endif | |
107 | ||
108 | call curNode.putCursorHere(1, 0) | |
109 | ||
110 | redraw | |
111 | catch /^NERDTree/ | |
112 | call s:echoWarning("Node Not Renamed.") | |
113 | endtry | |
114 | endfunction | |
115 | ||
116 | " FUNCTION: NERDTreeDeleteNode() {{{1 | |
117 | function! NERDTreeDeleteNode() | |
118 | let currentNode = g:NERDTreeFileNode.GetSelected() | |
119 | let confirmed = 0 | |
120 | ||
121 | if currentNode.path.isDirectory | |
122 | let choice =input("Delete the current node\n" . | |
123 | \ "==========================================================\n" . | |
124 | \ "STOP! To delete this entire directory, type 'yes'\n" . | |
125 | \ "" . currentNode.path.str() . ": ") | |
126 | let confirmed = choice ==# 'yes' | |
127 | else | |
128 | echo "Delete the current node\n" . | |
129 | \ "==========================================================\n". | |
130 | \ "Are you sure you wish to delete the node:\n" . | |
131 | \ "" . currentNode.path.str() . " (yN):" | |
132 | let choice = nr2char(getchar()) | |
133 | let confirmed = choice ==# 'y' | |
134 | endif | |
135 | ||
136 | ||
137 | if confirmed | |
138 | try | |
139 | call currentNode.delete() | |
140 | call NERDTreeRender() | |
141 | ||
142 | "if the node is open in a buffer, ask the user if they want to | |
143 | "close that buffer | |
144 | let bufnum = bufnr(currentNode.path.str()) | |
145 | if buflisted(bufnum) | |
146 | let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)" | |
147 | call s:promptToDelBuffer(bufnum, prompt) | |
148 | endif | |
149 | ||
150 | redraw | |
151 | catch /^NERDTree/ | |
152 | call s:echoWarning("Could not remove node") | |
153 | endtry | |
154 | else | |
155 | call s:echo("delete aborted") | |
156 | endif | |
157 | ||
158 | endfunction | |
159 | ||
160 | " FUNCTION: NERDTreeCopyNode() {{{1 | |
161 | function! NERDTreeCopyNode() | |
162 | let currentNode = g:NERDTreeFileNode.GetSelected() | |
163 | let newNodePath = input("Copy the current node\n" . | |
164 | \ "==========================================================\n" . | |
165 | \ "Enter the new path to copy the node to: \n" . | |
166 | \ "", currentNode.path.str()) | |
167 | ||
168 | if newNodePath != "" | |
169 | "strip trailing slash | |
170 | let newNodePath = substitute(newNodePath, '\/$', '', '') | |
171 | ||
172 | let confirmed = 1 | |
173 | if currentNode.path.copyingWillOverwrite(newNodePath) | |
174 | call s:echo("Warning: copying may overwrite files! Continue? (yN)") | |
175 | let choice = nr2char(getchar()) | |
176 | let confirmed = choice ==# 'y' | |
177 | endif | |
178 | ||
179 | if confirmed | |
180 | try | |
181 | let newNode = currentNode.copy(newNodePath) | |
182 | call NERDTreeRender() | |
183 | call newNode.putCursorHere(0, 0) | |
184 | catch /^NERDTree/ | |
185 | call s:echoWarning("Could not copy node") | |
186 | endtry | |
187 | endif | |
188 | else | |
189 | call s:echo("Copy aborted.") | |
190 | endif | |
191 | redraw | |
192 | endfunction | |
193 | ||
194 | " vim: set sw=4 sts=4 et fdm=marker: |