Start anew
[git/jnareb-git.git] / share / vim / vim58 / macros / explorer.vim
blobde5a34fbfd8c18dc2c2e8916e54c4756a893566b
1 "=============================================================================
2 " File : explorer.vim
3 " Author : M A Aziz Ahmed (aziz@123india.com)
4 " Last update : Sun Feb 27 2000
5 " Version : 1.1
6 "-----------------------------------------------------------------------------
7 " This file implements a file explorer. Latest version available at:
8 " http://www.freespeech.org/aziz/vim/my_macros/
9 "-----------------------------------------------------------------------------
10 " Just type ,e to launch the file explorer (this file should have been
11 " sourced) in a separate window. Type ,s to split the current window and
12 " launch explorer there. If the current buffer is modified, the window is
13 " anyway split (irrespective of ,e or ,s).
14 " It is also possible to delete files and rename files within explorer.
15 " (In UNIX, renaming doesn't seem to work, though!)
16 " The directory which explorer uses by default is determined by the 'browsedir'
17 " option.
18 "=============================================================================
20 nmap ,e   :call ExplInitiate(0)<cr>
21 nmap ,s   :call ExplInitiate(1)<cr>
23 function! ExplInitiate(split, ...)
24   if (expand("%:p:t")=="_fileExplorer.tmp")
25     echo "Already in file explorer"
26   else
27     let g:oldCh=&ch
28     let &ch=2
29     if (a:0==0)
30       call ExplInitializeDirName("")
31     else
32       call ExplInitializeDirName(a:1)
33     endif
34     if ((&modified==1) || (a:split==1))
35       sp /_fileExplorer.tmp
36       let b:splitWindow=1
37     else
38       e /_fileExplorer.tmp
39       let b:splitWindow=0
40     endif
41     call ExplSyntaxFile()
42     call ExplProcessFile(g:currDir)
43   endif
44 endfunction
46 function! ExplInitializeDirName(dirName)
47   if (a:dirName=="")
48     if (exists("&bsdir"))
49       if (&bsdir=="buffer")
50         let startDir=expand("%:p:h")
51       elseif ((!exists("g:currDir")) || (&bsdir=="current"))
52         let startDir=getcwd()
53       else
54         let startDir=expand(g:currDir)
55       endif
56     elseif (!exists("g:currDir"))
57       let startDir=getcwd()
58     else
59       let startDir=expand(g:currDir)
60     endif
61   else
62     let startDir = a:dirName
63   endif
64   let g:currDir=(substitute(startDir,"\\","/","g"))."/"
65   " In case the ending / was already a part of getcwd(), two //s would appear
66   " at the end of g:currDir. So remove one of them
67   let g:currDir=substitute(g:currDir,"//$","/","g")
68   let g:currDir=substitute(g:currDir,"/./","/","g")
69 endfunction
71 function! ExplProcessFile(fileName)
72   if ((isdirectory(a:fileName)) || (a:fileName==g:currDir."../"))
73     "Delete all lines
74     1,$d
75     let oldRep=&report
76     set report=1000
77     if (a:fileName==g:currDir."../")
78       let g:currDir=substitute(g:currDir,"/[^/]*/$","/","")
79     else
80       let g:currDir=a:fileName
81     endif
82     call ExplAddHeader()
83     " exec("cd ".escape(g:currDir, ' '))
84     call ExplDisplayFiles(g:currDir)
85     normal zz
86     echo "Loaded contents of ".g:currDir
87     let &report=oldRep
88   elseif (filereadable(a:fileName))
89     if (filereadable(@#))
90       exec("e! #")
91     endif
92     exec("e! ".escape(a:fileName, ' '))
93     call ExplCloseExplorer()
94   endif
95   let &modified=0
96 endfunction
98 function! ExplGetFileName()
99   return g:currDir.getline(".")
100 endfunction
102 function! ExplAddHeader()
103     " Give a very brief help
104     let @f="\" <enter> : open file or directory\n"
105     let @f=@f."\" - : go up one level      c : change directory\n"
106     let @f=@f."\" r : rename file          d : delete file\n"
107     let @f=@f."\" q : quit file explorer   s : set this dir to current directory\n"
108     let @f=@f."\"---------------------------------------------------\n"
109     let @f=@f.". ".g:currDir."\n"
110     let @f=@f."\"---------------------------------------------------\n"
111     " Add parent directory
112     let @f=@f."../\n"
113     put! f
114     $ 
115     d
116 endfunction
118 function! ExplDisplayFiles(dir)
119   let @f=glob(a:dir."*")
120   if (@f!="")
121     normal mt
122     put f
123     .,$g/^/call ExplMarkDirs()
124     normal `t
125   endif
126 endfunction
128 function! ExplMarkDirs()
129   let oldRep=&report
130   set report=1000
131   "Remove slashes if added
132   s;/$;;e  
133   "Removes all the leading slashes and adds slashes at the end of directories
134   s;^.*\\\([^\\]*\)$;\1;e
135   s;^.*/\([^/]*\)$;\1;e
136   normal ^
137   if (isdirectory(ExplGetFileName()))
138     s;$;/;
139   else
140     " Move the file at the end so that directories appear first
141     m$
142   endif
143   let &report=oldRep
144 endfunction
146 function! ExplDeleteFile() range
147   let oldRep = &report
148   let &report = 1000
150   let filesDeleted = 0
151   let stopDel = 0
152   let delAll = 0
153   let currLine = a:firstline
154   let lastLine = a:lastline
155   while ((currLine <= lastLine) && (stopDel==0))
156     exec(currLine)
157     let fileName=ExplGetFileName()
158     if (isdirectory(fileName))
159       echo fileName." : Directory deletion not supported yet"
160       let currLine = currLine + 1
161     else
162       if (delAll == 0)
163         let sure=input("Delete ".fileName."?(y/n/a/q) ")
164         if (sure=="a")
165           let delAll = 1
166         endif
167       endif
168       if ((sure=="y") || (sure=="a"))
169         let success=delete(fileName)
170         if (success!=0)
171           exec (" ")
172           echo "\nCannot delete ".fileName
173           let currLine = currLine + 1
174         else
175           d
176           let filesDeleted = filesDeleted + 1
177           let lastLine = lastLine - 1
178         endif
179       elseif (sure=="q")
180         let stopDel = 1
181       elseif (sure=="n")
182         let currLine = currLine + 1
183       endif
184     endif
185   endwhile
186   echo "\n".filesDeleted." files deleted"
187   let &report = oldRep
188   let &modified=0
189 endfunction
191 function! ExplRenameFile()
192   let fileName=ExplGetFileName()
193   if (isdirectory(fileName))
194     echo "Directory renaming not supported yet"
195   elseif (filereadable(fileName))
196     let altName=input("Rename ".fileName." to : ")
197     echo " "
198     let success=rename(fileName, g:currDir.altName)
199     if (success!=0)
200       echo "Cannot rename ".fileName. " to ".altName
201     else
202       echo "Renamed ".fileName." to ".altName
203       let oldRep=&report
204       set report=1000
205       exec("s/^\\S*$/".altName."/")
206       let &report=oldRep
207     endif
208   endif
209   let &modified=0
210 endfunction
212 function! ExplGotoDir(dummy, dirName)
213   if (isdirectory(expand(a:dirName)))
214     " Guess the complete path
215     if (isdirectory(expand(getcwd()."/".a:dirName)))
216       let dirpath=getcwd()."/".a:dirName
217     else
218       let dirpath=expand(a:dirName)
219     endif
220     call ExplInitializeDirName(dirpath)
221     call ExplProcessFile(g:currDir)
222   else
223     echo a:dirName." : No such directory"
224   endif
225 endfunction
227 function! ExplCloseExplorer()
228   bd! /_fileExplorer.tmp
229   if (exists("g:oldCh"))
230     let &ch=g:oldCh
231   endif
232 endfunction
234 function! ExplBack2PrevFile()
235   if ((@#!="") && (@#!="_fileExplorer.tmp") && (b:splitWindow==0) && 
236         \(isdirectory(@#)==0))
237     exec("e #")
238   endif
239   call ExplCloseExplorer()
240 endfunction
242 function! ExplSyntaxFile()
243   if 1 || has("syntax") && exists("syntax_on") && !has("syntax_items")
244     syn match browseSynopsis    "^\".*"
245     syn match browseDirectory   "[^\"].*/$"
246     syn match browseCurDir      "^\. .*$"
247     
248     if !exists("g:did_browse_syntax_inits")
249       let did_browse_syntax_inits = 1
250       hi link browseSynopsis    PreProc
251       hi link browseDirectory   Directory
252       hi link browseCurDir      Statement
253     endif
254   endif
255 endfunction
256       
257 function! ExplEditDir(fileName)
258   if (isdirectory(a:fileName))
259     " Do some processing if the path is relative..
260     let completePath=expand("%:p")
261     call ExplInitiate(0, completePath)
262   elseif ((expand("%")=="") && (bufloaded(".")==1))
263     " This is a workaround for a vim bug in Windows. When one tries to edit   
264     " :e .
265     " expand("%") *sometimes* returns a blank string
266     call ExplInitiate(0, getcwd())
267   endif
268 endfunction
270 augroup fileExplorer
271   au!
272   au BufEnter _fileExplorer.tmp let oldSwap=&swapfile | set noswapfile
273   au BufLeave _fileExplorer.tmp let &swapfile=oldSwap
274   au BufEnter _fileExplorer.tmp nm <cr> :call ExplProcessFile(ExplGetFileName())<cr>
275   au BufLeave _fileExplorer.tmp nun <cr>
276   au BufEnter _fileExplorer.tmp nm - :call ExplProcessFile(g:currDir."../")<cr>
277   au BufLeave _fileExplorer.tmp nun -
278   au BufEnter _fileExplorer.tmp nm c :ChangeDirectory to: 
279   au BufLeave _fileExplorer.tmp nun c
280   au BufEnter _fileExplorer.tmp nm r :call ExplRenameFile()<cr>
281   au BufLeave _fileExplorer.tmp nun r
282   au BufEnter _fileExplorer.tmp nm d :. call ExplDeleteFile()<cr>
283   au BufLeave _fileExplorer.tmp nun d
284   au BufEnter _fileExplorer.tmp vm d :call ExplDeleteFile()<cr>
285   au BufLeave _fileExplorer.tmp vun d
286   au BufEnter _fileExplorer.tmp nm q :call ExplBack2PrevFile()<cr>
287   au BufLeave _fileExplorer.tmp nun q
288   au BufEnter _fileExplorer.tmp nm s :exec ("cd ".escape(g:currDir,' '))<cr>
289   au BufLeave _fileExplorer.tmp nun s
290   au BufEnter _fileExplorer.tmp command! -nargs=+ -complete=dir ChangeDirectory call ExplGotoDir(<f-args>)
291   au BufLeave _fileExplorer.tmp delcommand ChangeDirectory
292   au BufEnter * nested call ExplEditDir(expand("%"))
293 augroup end