samer@3
|
1 " filebrowser.vim: utility file for vim 6.2+
|
samer@3
|
2 "
|
samer@3
|
3 " Copyright: Srinath Avadhanula <srinath AT fastmail DOT fm>
|
samer@3
|
4 " Parts of this file are taken from explorer.vim which is a plugin file
|
samer@3
|
5 " distributed with vim under the Vim charityware license.
|
samer@3
|
6 " License: distributed under the Vim charityware license.
|
samer@3
|
7 "
|
samer@3
|
8 " Settings:
|
samer@3
|
9 " FB_CallBackFunction: the function name which gets called when the user
|
samer@3
|
10 " presses <cr> on a file-name in the file browser.
|
samer@3
|
11 " FB_AllowRegexp: A filename has to match this regexp to be displayed.
|
samer@3
|
12 " FB_RejectRegexp: If a filename matches this regexp, then its not displayed.
|
samer@3
|
13 " (Both these regexps are '' by default which means no filtering is
|
samer@3
|
14 " done).
|
samer@3
|
15
|
samer@3
|
16 " line continuation used here.
|
samer@3
|
17 let s:save_cpo = &cpo
|
samer@3
|
18 set cpo&vim
|
samer@3
|
19
|
samer@3
|
20 "======================================================================
|
samer@3
|
21 " Globally visible functions (API)
|
samer@3
|
22 "======================================================================
|
samer@3
|
23 " FB_OpenFileBrowser: opens a new buffer and displays the file list {{{
|
samer@3
|
24 " Description:
|
samer@3
|
25 function! FB_OpenFileBrowser(dir)
|
samer@3
|
26 if !isdirectory(a:dir)
|
samer@3
|
27 return
|
samer@3
|
28 endif
|
samer@3
|
29 if exists('s:FB_BufferNumber')
|
samer@3
|
30 if bufwinnr(s:FB_BufferNumber) != -1
|
samer@3
|
31 execute bufwinnr(s:FB_BufferNumber).' wincmd w'
|
samer@3
|
32 return
|
samer@3
|
33 endif
|
samer@3
|
34 execute 'aboveleft split #'.s:FB_BufferNumber
|
samer@3
|
35 else
|
samer@3
|
36 aboveleft split __Choose_File__
|
samer@3
|
37 let s:FB_BufferNumber = bufnr('%')
|
samer@3
|
38 endif
|
samer@3
|
39 call FB_DisplayFiles(a:dir)
|
samer@3
|
40 endfunction " }}}
|
samer@3
|
41 " FB_DisplayFiles: displays the files in a given directory {{{
|
samer@3
|
42 " Description:
|
samer@3
|
43 " Call this function only when the cursor is in a temporary buffer
|
samer@3
|
44 function! FB_DisplayFiles(dir)
|
samer@3
|
45 if !isdirectory(a:dir)
|
samer@3
|
46 return
|
samer@3
|
47 endif
|
samer@3
|
48 call s:FB_SetSilentSettings()
|
samer@3
|
49 " make this a "scratch" buffer
|
samer@3
|
50 call s:FB_SetScratchSettings()
|
samer@3
|
51
|
samer@3
|
52 let allowRegexp = s:FB_GetVar('FB_AllowRegexp', '')
|
samer@3
|
53 let rejectRegexp = s:FB_GetVar('FB_RejectRegexp', '')
|
samer@3
|
54
|
samer@3
|
55 " change to the directory to make processing simpler.
|
samer@3
|
56 execute "lcd ".a:dir
|
samer@3
|
57 " delete everything in the buffer.
|
samer@3
|
58 " IMPORTANT: we need to be in a scratch buffer
|
samer@3
|
59 0,$ d_
|
samer@3
|
60
|
samer@3
|
61 let allFilenames = glob('*')
|
samer@3
|
62 let dispFiles = ""
|
samer@3
|
63 let subDirs = "../\n"
|
samer@3
|
64
|
samer@3
|
65 let allFilenames = allFilenames."\n"
|
samer@3
|
66 let start = 0
|
samer@3
|
67 while 1
|
samer@3
|
68 let next = stridx(allFilenames, "\n", start)
|
samer@3
|
69 let filename = strpart(allFilenames, start, next-start)
|
samer@3
|
70 if filename == ""
|
samer@3
|
71 break
|
samer@3
|
72 endif
|
samer@3
|
73
|
samer@3
|
74 if isdirectory(filename)
|
samer@3
|
75 let subDirs = subDirs.filename."/\n"
|
samer@3
|
76 else
|
samer@3
|
77 if allowRegexp != '' && filename !~ allowRegexp
|
samer@3
|
78 elseif rejectRegexp != '' && filename =~ rejectRegexp
|
samer@3
|
79 else
|
samer@3
|
80 let dispFiles = dispFiles.filename."\n"
|
samer@3
|
81 endif
|
samer@3
|
82 endif
|
samer@3
|
83
|
samer@3
|
84 let start = next + 1
|
samer@3
|
85 endwhile
|
samer@3
|
86
|
samer@3
|
87 0put!=dispFiles
|
samer@3
|
88 0put!=subDirs
|
samer@3
|
89 " delte the last empty line resulting from the put
|
samer@3
|
90 $ d_
|
samer@3
|
91
|
samer@3
|
92 call s:FB_SetHighlighting()
|
samer@3
|
93 call s:FB_DisplayHelp()
|
samer@3
|
94 call s:FB_SetMaps()
|
samer@3
|
95
|
samer@3
|
96 " goto the first file/directory
|
samer@3
|
97 0
|
samer@3
|
98 call search('^"=', 'w')
|
samer@3
|
99 normal! j:<bs>
|
samer@3
|
100
|
samer@3
|
101 set nomodified nomodifiable
|
samer@3
|
102
|
samer@3
|
103 call s:FB_ResetSilentSettings()
|
samer@3
|
104 endfunction " }}}
|
samer@3
|
105 " FB_SetVar: sets script local variables from outside this script {{{
|
samer@3
|
106 " Description:
|
samer@3
|
107 function! FB_SetVar(varname, value)
|
samer@3
|
108 let s:{a:varname} = a:value
|
samer@3
|
109 endfunction " }}}
|
samer@3
|
110
|
samer@3
|
111 " ==============================================================================
|
samer@3
|
112 " Script local functions below this
|
samer@3
|
113 " ==============================================================================
|
samer@3
|
114 " FB_SetHighlighting: sets syntax highlighting for the buffer {{{
|
samer@3
|
115 " Description:
|
samer@3
|
116 " Origin: from explorer.vim in vim
|
samer@3
|
117 function! <SID>FB_SetHighlighting()
|
samer@3
|
118 " Set up syntax highlighting
|
samer@3
|
119 " Something wrong with the evaluation of the conditional though...
|
samer@3
|
120 if has("syntax") && exists("g:syntax_on") && !has("syntax_items")
|
samer@3
|
121 syn match browseSynopsis "^\"[ -].*"
|
samer@3
|
122 syn match browseDirectory "[^\"].*/ "
|
samer@3
|
123 syn match browseDirectory "[^\"].*/$"
|
samer@3
|
124 syn match browseCurDir "^\"= .*$"
|
samer@3
|
125 syn match browseSortBy "^\" Sorted by .*$" contains=browseSuffixInfo
|
samer@3
|
126 syn match browseSuffixInfo "(.*)$" contained
|
samer@3
|
127 syn match browseFilter "^\" Not Showing:.*$"
|
samer@3
|
128 syn match browseFiletime "«\d\+$"
|
samer@3
|
129
|
samer@3
|
130 "hi def link browseSynopsis PreProc
|
samer@3
|
131 hi def link browseSynopsis Special
|
samer@3
|
132 hi def link browseDirectory Directory
|
samer@3
|
133 hi def link browseCurDir Statement
|
samer@3
|
134 hi def link browseSortBy String
|
samer@3
|
135 hi def link browseSuffixInfo Type
|
samer@3
|
136 hi def link browseFilter String
|
samer@3
|
137 hi def link browseFiletime Ignore
|
samer@3
|
138 hi def link browseSuffixes Type
|
samer@3
|
139 endif
|
samer@3
|
140 endfunction " }}}
|
samer@3
|
141 " FB_SetMaps: sets buffer local maps {{{
|
samer@3
|
142 " Description:
|
samer@3
|
143 function! <SID>FB_SetMaps()
|
samer@3
|
144 nnoremap <buffer> <silent> q :bdelete<cr>
|
samer@3
|
145 nnoremap <buffer> <silent> C :call FB_DisplayFiles(getcwd())<CR>
|
samer@3
|
146 nnoremap <buffer> <silent> <esc> :bdelete<cr>
|
samer@3
|
147 nnoremap <buffer> <silent> <CR> :call <SID>FB_EditEntry()<CR>
|
samer@3
|
148 nnoremap <buffer> <silent> ? :call <SID>FB_ToggleHelp()<CR>
|
samer@3
|
149
|
samer@3
|
150 " lock the user in this window
|
samer@3
|
151 nnoremap <buffer> <C-w> <nop>
|
samer@3
|
152 endfunction " }}}
|
samer@3
|
153 " FB_SetSilentSettings: some settings which make things silent {{{
|
samer@3
|
154 " Description:
|
samer@3
|
155 " Origin: from explorer.vim distributed with vim.
|
samer@3
|
156 function! <SID>FB_SetSilentSettings()
|
samer@3
|
157 let s:save_report=&report
|
samer@3
|
158 let s:save_showcmd = &sc
|
samer@3
|
159 set report=10000 noshowcmd
|
samer@3
|
160 endfunction
|
samer@3
|
161 " FB_ResetSilentSettings: reset settings set by FB_SetSilentSettings
|
samer@3
|
162 " Description:
|
samer@3
|
163 function! <SID>FB_ResetSilentSettings()
|
samer@3
|
164 let &report=s:save_report
|
samer@3
|
165 let &showcmd = s:save_showcmd
|
samer@3
|
166 endfunction " }}}
|
samer@3
|
167 " FB_SetScratchSettings: makes the present buffer a scratch buffer {{{
|
samer@3
|
168 " Description:
|
samer@3
|
169 function! <SID>FB_SetScratchSettings()
|
samer@3
|
170 " Turn off the swapfile, set the buffer type so that it won't get
|
samer@3
|
171 " written, and so that it will get deleted when it gets hidden.
|
samer@3
|
172 setlocal noreadonly modifiable
|
samer@3
|
173 setlocal noswapfile
|
samer@3
|
174 setlocal buftype=nowrite
|
samer@3
|
175 setlocal bufhidden=delete
|
samer@3
|
176 " Don't wrap around long lines
|
samer@3
|
177 setlocal nowrap
|
samer@3
|
178 endfunction
|
samer@3
|
179
|
samer@3
|
180 " }}}
|
samer@3
|
181 " FB_ToggleHelp: toggles verbosity of help {{{
|
samer@3
|
182 " Description:
|
samer@3
|
183 function! <SID>FB_ToggleHelp()
|
samer@3
|
184 let s:FB_VerboseHelp = 1 - s:FB_GetVar('FB_VerboseHelp', 0)
|
samer@3
|
185
|
samer@3
|
186 call FB_DisplayFiles('.')
|
samer@3
|
187 endfunction " }}}
|
samer@3
|
188 " FB_DisplayHelp: displays a helpful header {{{
|
samer@3
|
189 " Description:
|
samer@3
|
190 function! <SID>FB_DisplayHelp()
|
samer@3
|
191 let verboseHelp = s:FB_GetVar('FB_VerboseHelp', 0)
|
samer@3
|
192 if verboseHelp
|
samer@3
|
193 let txt =
|
samer@3
|
194 \ "\" <cr>: on file, choose the file and quit\n"
|
samer@3
|
195 \ ."\" on dir, enter directory\n"
|
samer@3
|
196 \ ."\" q/<esc>: quit without choosing\n"
|
samer@3
|
197 \ ."\" C: change directory to getcwd()\n"
|
samer@3
|
198 \ ."\" ?: toggle help verbosity\n"
|
samer@3
|
199 \ ."\"= ".getcwd()
|
samer@3
|
200 else
|
samer@3
|
201 let txt = "\" ?: toggle help verbosity\n"
|
samer@3
|
202 \ ."\"= ".getcwd()
|
samer@3
|
203 endif
|
samer@3
|
204 0put!=txt
|
samer@3
|
205 endfunction " }}}
|
samer@3
|
206 " FB_EditEntry: handles the user pressing <enter> on a line {{{
|
samer@3
|
207 " Description:
|
samer@3
|
208 function! <SID>FB_EditEntry()
|
samer@3
|
209 let line = getline('.')
|
samer@3
|
210
|
samer@3
|
211 if isdirectory(line)
|
samer@3
|
212 call FB_DisplayFiles(line)
|
samer@3
|
213 endif
|
samer@3
|
214
|
samer@3
|
215 " If the user has a call back function defined on choosing a file, handle
|
samer@3
|
216 " it.
|
samer@3
|
217 let cbf = s:FB_GetVar('FB_CallBackFunction', '')
|
samer@3
|
218 if cbf != '' && line !~ '^" ' && filereadable(line)
|
samer@3
|
219 let fname = fnamemodify(line, ':p')
|
samer@3
|
220 bdelete
|
samer@3
|
221
|
samer@3
|
222 let arguments = s:FB_GetVar('FB_CallBackFunctionArgs', '')
|
samer@3
|
223 if arguments != ''
|
samer@3
|
224 let arguments = ','.arguments
|
samer@3
|
225 endif
|
samer@3
|
226 call Tex_Debug('arguments = '.arguments, 'fb')
|
samer@3
|
227 call Tex_Debug("call ".cbf."('".fname."'".arguments.')', 'fb')
|
samer@3
|
228 exec "call ".cbf."('".fname."'".arguments.')'
|
samer@3
|
229 endif
|
samer@3
|
230 endfunction " }}}
|
samer@3
|
231 " FB_GetVar: gets the most local value of a variable {{{
|
samer@3
|
232 function! <SID>FB_GetVar(name, default)
|
samer@3
|
233 if exists('s:'.a:name)
|
samer@3
|
234 return s:{a:name}
|
samer@3
|
235 elseif exists('w:'.a:name)
|
samer@3
|
236 return w:{a:name}
|
samer@3
|
237 elseif exists('b:'.a:name)
|
samer@3
|
238 return b:{a:name}
|
samer@3
|
239 elseif exists('g:'.a:name)
|
samer@3
|
240 return g:{a:name}
|
samer@3
|
241 else
|
samer@3
|
242 return a:default
|
samer@3
|
243 endif
|
samer@3
|
244 endfunction
|
samer@3
|
245
|
samer@3
|
246 " }}}
|
samer@3
|
247
|
samer@3
|
248 let &cpo = s:save_cpo
|
samer@3
|
249
|
samer@3
|
250 " vim:fdm=marker:ff=unix:noet:ts=4:sw=4:nowrap
|