Bring in Louisa Luciani's GSoC 2008 work, a DragonFly LiveDVD that is
[dragonfly.git] / nrelease / gui / root / .vim / plugin / minibufexpl.vim
1 " Mini Buffer Explorer <minibufexpl.vim>
2 "
3 " HINT: Type zR if you don't know how to use folds
4 "
5 " Script Info and Documentation  {{{
6 "=============================================================================
7 "    Copyright: Copyright (C) 2002 & 2003 Bindu Wavell 
8 "               Permission is hereby granted to use and distribute this code,
9 "               with or without modifications, provided that this copyright
10 "               notice is copied with it. Like anything else that's free,
11 "               minibufexplorer.vim is provided *as is* and comes with no
12 "               warranty of any kind, either expressed or implied. In no
13 "               event will the copyright holder be liable for any damamges
14 "               resulting from the use of this software.
15 "
16 " Name Of File: minibufexpl.vim
17 "  Description: Mini Buffer Explorer Vim Plugin
18 "   Maintainer: Bindu Wavell <bindu@wavell.net>
19 "          URL: http://vim.sourceforge.net/scripts/script.php?script_id=159
20 "  Last Change: Sunday, June 21, 2004
21 "      Version: 6.3.2
22 "               Derived from Jeff Lanzarotta's bufexplorer.vim version 6.0.7
23 "               Jeff can be reached at (jefflanzarotta@yahoo.com) and the
24 "               original plugin can be found at:
25 "               http://lanzarotta.tripod.com/vim/plugin/6/bufexplorer.vim.zip
26 "
27 "        Usage: Normally, this file should reside in the plugins
28 "               directory and be automatically sourced. If not, you must
29 "               manually source this file using ':source minibufexplorer.vim'.
30 "
31 "               You may use the default keymappings of
32 "
33 "                 <Leader>mbe - Opens MiniBufExplorer
34 "
35 "               or you may want to add something like the following
36 "               key mapping to your _vimrc/.vimrc file.
37 "
38 "                 map <Leader>b :MiniBufExplorer<cr>
39 "
40 "               However, in most cases you won't need any key-bindings at all.
41 "
42 "               <Leader> is usually backslash so type "\mbe" (quickly) to open 
43 "               the -MiniBufExplorer- window.
44 "
45 "               Other keymappings include: <Leader>mbc to close the Explorer
46 "               window,  <Leader>mbu to force the Explorer to Update and
47 "               <Leader>mbt to toggle the Explorer window; it will open if
48 "               closed or close if open. Each of these key bindings can be
49 "               overridden (see the notes on <Leader>mbe above.)
50
51 "               You can map these additional commands as follows:
52 "
53 "                 map <Leader>c :CMiniBufExplorer<cr>
54 "                 map <Leader>u :UMiniBufExplorer<cr>
55 "                 map <Leader>t :TMiniBufExplorer<cr>
56 "
57 "               NOTE: you can change the key binding used in these mappings
58 "                     so that they fit with your configuration of vim.
59 "
60 "               You can also call each of these features by typing the
61 "               following in command mode:
62 "
63 "                 :MiniBufExplorer    " Open and/or goto Explorer
64 "                 :CMiniBufExplorer   " Close the Explorer if it's open
65 "                 :UMiniBufExplorer   " Update Explorer without navigating
66 "                 :TMiniBufExplorer   " Toggle the Explorer window open and 
67 "                                       closed.
68 "
69 "               To control where the new split window goes relative to the 
70 "               current window, use the setting:
71 "
72 "                 let g:miniBufExplSplitBelow=0  " Put new window above
73 "                                                " current or on the
74 "                                                " left for vertical split
75 "                 let g:miniBufExplSplitBelow=1  " Put new window below
76 "                                                " current or on the
77 "                                                " right for vertical split
78 "
79 "               The default for this is read from the &splitbelow VIM option.
80 "
81 "               By default we are now (as of 6.0.2) forcing the -MiniBufExplorer-
82 "               window to open up at the edge of the screen. You can turn this 
83 "               off by setting the following variable in your .vimrc:
84 "
85 "                 let g:miniBufExplSplitToEdge = 0
86 "
87 "               If you would like a vertical explorer you can assign the column
88 "               width (in characters) you want for your explorer window with the
89 "               following .vimrc variable (this was introduced in 6.3.0):
90 "
91 "                 let g:miniBufExplVSplit = 20   " column width in chars
92 "
93 "               IN HORIZONTAL MODE:
94 "               It is now (as of 6.1.1) possible to set a maximum height for
95 "               the -MiniBufExplorer- window. You can set the max height by
96 "               letting the following variable in your .vimrc:
97 "
98 "                 let g:miniBufExplMaxSize = <max lines: defualt 0>
99 "               
100 "               setting this to 0 will mean the window gets as big as
101 "               needed to fit all your buffers. 
102 "
103 "               NOTE: This was g:miniBufExplMaxHeight before 6.3.0; the old
104 "               setting is backwards compatible if you don't use MaxSize.
105 "
106 "               As of 6.2.2 it is possible to set a minimum height for the 
107 "               -MiniBufExplorer- window. You can set the min height by
108 "               letting the following variable in your .vimrc:
109 "
110 "                 let g:miniBufExplMinSize = <min height: default 1>
111 "
112 "               NOTE: This was g:miniBufExplMinHeight before 6.3.0; the old
113 "               setting is backwards compatible if you don't use MinSize.
114 "
115 "               IN VERTICAL MODE: (as of 6.3.0)
116 "               By default the vertical explorer has a fixed width. If you put:
117 "
118 "                 let g:miniBufExplMaxSize = <max width: default 0> 
119 "
120 "               into your .vimrc then MBE will attempt to set the width of the
121 "               MBE window to be as wide as your widest tab. The width will not
122 "               exceed MaxSize even if you have wider tabs. 
123 "
124 "               Accepting the default value of 0 for this will give you a fixed
125 "               width MBE window.
126 "
127 "               You can specify a MinSize for the vertical explorer window by
128 "               putting the following in your .vimrc:
129 "
130 "                 let g:miniBufExplMinSize = <min width: default 1>
131 "
132 "               This will have no effect unless you also specivy MaxSize.
133 "
134 "               By default we are now (as of 6.0.1) turning on the MoreThanOne
135 "               option. This stops the -MiniBufExplorer- from opening 
136 "               automatically until more than one eligible buffer is available.
137 "               You can turn this feature off by setting the following variable
138 "               in your .vimrc:
139 "                 
140 "                 let g:miniBufExplorerMoreThanOne=1
141 "
142 "               (The following enhancement is as of 6.2.2)
143 "               Setting this to 0 will cause the MBE window to be loaded even
144 "               if no buffers are available. Setting it to 1 causes the MBE
145 "               window to be loaded as soon as an eligible buffer is read. You
146 "               can also set it to larger numbers. So if you set it to 4 for
147 "               example the MBE window wouldn't auto-open until 4 eligibles
148 "               buffers had been loaded. This is nice for folks that don't 
149 "               want an MBE window unless they are editing more than two or
150 "               three buffers.
151 "
152 "               To enable the optional mapping of Control + Vim Direction Keys 
153 "               [hjkl] to window movement commands, you can put the following into 
154 "               your .vimrc:
155 "
156 "                 let g:miniBufExplMapWindowNavVim = 1
157 "
158 "               To enable the optional mapping of Control + Arrow Keys to window 
159 "               movement commands, you can put the following into your .vimrc:
160 "
161 "                 let g:miniBufExplMapWindowNavArrows = 1
162 "
163 "               To enable the optional mapping of <C-TAB> and <C-S-TAB> to a 
164 "               function that will bring up the next or previous buffer in the
165 "               current window, you can put the following into your .vimrc:
166 "
167 "                 let g:miniBufExplMapCTabSwitchBufs = 1
168 "
169 "               To enable the optional mapping of <C-TAB> and <C-S-TAB> to mappings
170 "               that will move to the next and previous (respectively) window, you
171 "               can put the following into your .vimrc:
172 "
173 "                 let g:miniBufExplMapCTabSwitchWindows = 1
174 "
175 "
176 "               NOTE: If you set the ...TabSwitchBufs AND ...TabSwitchWindows, 
177 "                     ...TabSwitchBufs will be enabled and ...TabSwitchWindows 
178 "                     will not.
179 "               
180 "               As of MBE 6.3.0, you can put the following into your .vimrc:
181 "               
182 "                 let g:miniBufExplUseSingleClick = 1
183 "
184 "               If you would like to single click on tabs rather than double
185 "               clicking on them to goto the selected buffer. 
186 "
187 "               NOTE: If you use the single click option in taglist.vim you may 
188 "                     need to get an updated version that includes a patch I 
189 "                     provided to allow both explorers to provide single click 
190 "                     buffer selection.
191 "
192 "               It is possible to customize the the highlighting for the tabs in 
193 "               the MBE by configuring the following highlighting groups:
194 "
195 "                 MBENormal         - for buffers that have NOT CHANGED and
196 "                                     are NOT VISIBLE.
197 "                 MBEChanged        - for buffers that HAVE CHANGED and are
198 "                                     NOT VISIBLE
199 "                 MBEVisibleNormal  - buffers that have NOT CHANGED and are
200 "                                     VISIBLE
201 "                 MBEVisibleChanged - buffers that have CHANGED and are VISIBLE
202 "
203 "               You can either link to an existing highlighting group by
204 "               adding a command like:
205 "
206 "                 hi link MBEVisibleChanged Error
207 "
208 "               to your .vimrc or you can specify exact foreground and background
209 "               colors using the following syntax:
210 "
211 "                 hi MBEChanged guibg=darkblue ctermbg=darkblue termbg=white
212 "
213 "               NOTE: If you set a colorscheme in your .vimrc you should do it
214 "                     BEFORE updating the MBE highlighting groups.
215 "
216 "               If you use other explorers like TagList you can (As of 6.2.8) put:
217 "
218 "                 let g:miniBufExplModSelTarget = 1
219
220 "               into your .vimrc in order to force MBE to try to place selected 
221 "               buffers into a window that does not have a nonmodifiable buffer.
222 "               The upshot of this should be that if you go into MBE and select
223 "               a buffer, the buffer should not show up in a window that is 
224 "               hosting an explorer.
225 "
226 "               There is a VIM bug that can cause buffers to show up without 
227 "               their highlighting. The following setting will cause MBE to
228 "               try and turn highlighting back on (introduced in 6.3.1):
229 "
230 "                 let g:miniBufExplForceSyntaxEnable = 1
231 "
232 "               MBE has had a basic debugging capability for quite some time.
233 "               However, it has not been very friendly in the past. As of 6.0.8, 
234 "               you can put one of each of the following into your .vimrc:
235 "
236 "                 let g:miniBufExplorerDebugLevel = 0  " MBE serious errors output
237 "                 let g:miniBufExplorerDebugLevel = 4  " MBE all errors output
238 "                 let g:miniBufExplorerDebugLevel = 10 " MBE reports everything
239 "
240 "               You can also set a DebugMode to cause output to be target as
241 "               follows (default is mode 3):
242 "
243 "                 let g:miniBufExplorerDebugMode  = 0  " Errors will show up in 
244 "                                                      " a vim window
245 "                 let g:miniBufExplorerDebugMode  = 1  " Uses VIM's echo function
246 "                                                      " to display on the screen
247 "                 let g:miniBufExplorerDebugMode  = 2  " Writes to a file
248 "                                                      " MiniBufExplorer.DBG
249 "                 let g:miniBufExplorerDebugMode  = 3  " Store output in global:
250 "                                                 " g:miniBufExplorerDebugOutput
251 "
252 "               Or if you are able to start VIM, you might just perform these
253 "               at a command prompt right before you do the operation that is
254 "               failing.
255 "
256 "      History: Moved to end of file
257 "      
258 " Known Issues: When debugging is turned on and set to output to a window, there
259 "               are some cases where the window is opened more than once, there
260 "               are other cases where an old debug window can be lost.
261
262 "               Several MBE commands can break the window history so <C-W>[pnw]
263 "               might not take you to the expected window.
264 "
265 "         Todo: Add the ability to specify a regexp for eligible buffers
266 "               allowing the ability to filter out certain buffers that 
267 "               you don't want to control from MBE
268 "
269 "=============================================================================
270 " }}}
271
272 " Startup Check
273 "
274 " Has this plugin already been loaded? {{{
275 "
276 if exists('loaded_minibufexplorer')
277   finish
278 endif
279 let loaded_minibufexplorer = 1
280 " }}}
281
282 " Mappings and Commands
283 "
284 " MBE Keyboard Mappings {{{
285 " If we don't already have keyboard mappings for MBE then create them 
286
287 if !hasmapto('<Plug>MiniBufExplorer')
288   map <unique> <Leader>mbe <Plug>MiniBufExplorer
289 endif
290 if !hasmapto('<Plug>CMiniBufExplorer')
291   map <unique> <Leader>mbc <Plug>CMiniBufExplorer
292 endif
293 if !hasmapto('<Plug>UMiniBufExplorer')
294   map <unique> <Leader>mbu <Plug>UMiniBufExplorer
295 endif
296 if !hasmapto('<Plug>TMiniBufExplorer')
297   map <unique> <Leader>mbt <Plug>TMiniBufExplorer
298 endif
299
300 " }}}
301 " MBE <Script> internal map {{{
302
303 noremap <unique> <script> <Plug>MiniBufExplorer  :call <SID>StartExplorer(1, -1)<CR>:<BS>
304 noremap <unique> <script> <Plug>CMiniBufExplorer :call <SID>StopExplorer(1)<CR>:<BS>
305 noremap <unique> <script> <Plug>UMiniBufExplorer :call <SID>AutoUpdate(-1)<CR>:<BS>
306 noremap <unique> <script> <Plug>TMiniBufExplorer :call <SID>ToggleExplorer()<CR>:<BS>
307
308 " }}}
309 " MBE commands {{{
310
311 if !exists(':MiniBufExplorer')
312   command! MiniBufExplorer  call <SID>StartExplorer(1, -1)
313 endif
314 if !exists(':CMiniBufExplorer')
315   command! CMiniBufExplorer  call <SID>StopExplorer(1)
316 endif
317 if !exists(':UMiniBufExplorer')
318   command! UMiniBufExplorer  call <SID>AutoUpdate(-1)
319 endif
320 if !exists(':TMiniBufExplorer')
321   command! TMiniBufExplorer  call <SID>ToggleExplorer()
322 endif
323 if !exists(':MBEbn')
324   command! MBEbn call <SID>CycleBuffer(1)
325 endif
326 if !exists(':MBEbp')
327   command! MBEbp call <SID>CycleBuffer(0)
328 endif " }}}
329
330 " Global Configuration Variables
331 "
332 " Debug Level {{{
333 "
334 " 0 = no logging
335 " 1=5 = errors ; 1 is the most important
336 " 5-9 = info ; 5 is the most important
337 " 10 = Entry/Exit
338 if !exists('g:miniBufExplorerDebugLevel')
339   let g:miniBufExplorerDebugLevel = 0 
340 endif
341
342 " }}}
343 " Debug Mode {{{
344 "
345 " 0 = debug to a window
346 " 1 = use vim's echo facility
347 " 2 = write to a file named MiniBufExplorer.DBG
348 "     in the directory where vim was started
349 "     THIS IS VERY SLOW
350 " 3 = Write into g:miniBufExplorerDebugOutput
351 "     global variable [This is the default]
352 if !exists('g:miniBufExplorerDebugMode')
353   let g:miniBufExplorerDebugMode = 3 
354 endif 
355
356 " }}}
357 " Allow auto update? {{{
358 "
359 " We start out with this off for startup, but once vim is running we 
360 " turn this on.
361 if !exists('g:miniBufExplorerAutoUpdate')
362   let g:miniBufExplorerAutoUpdate = 0
363 endif
364
365 " }}}
366 " MoreThanOne? {{{
367 " Display Mini Buf Explorer when there are 'More Than One' eligible buffers 
368 "
369 if !exists('g:miniBufExplorerMoreThanOne')
370   let g:miniBufExplorerMoreThanOne = 2
371 endif 
372
373 " }}}
374 " Split below/above/left/right? {{{
375 " When opening a new -MiniBufExplorer- window, split the new windows below or 
376 " above the current window?  1 = below, 0 = above.
377 "
378 if !exists('g:miniBufExplSplitBelow')
379   let g:miniBufExplSplitBelow = &splitbelow
380 endif 
381
382 " }}}
383 " Split to edge? {{{
384 " When opening a new -MiniBufExplorer- window, split the new windows to the
385 " full edge? 1 = yes, 0 = no.
386 "
387 if !exists('g:miniBufExplSplitToEdge')
388   let g:miniBufExplSplitToEdge = 1
389 endif 
390
391 " }}}
392 " MaxHeight (depreciated) {{{
393 " When sizing the -MiniBufExplorer- window, assign a maximum window height.
394 " 0 = size to fit all buffers, otherwise the value is number of lines for
395 " buffer. [Depreciated use g:miniBufExplMaxSize]
396 "
397 if !exists('g:miniBufExplMaxHeight')
398   let g:miniBufExplMaxHeight = 0
399 endif 
400
401 " }}}
402 " MaxSize {{{
403 " Same as MaxHeight but also works for vertical splits if specified with a
404 " vertical split then vertical resizing will be performed. If left at 0 
405 " then the number of columns in g:miniBufExplVSplit will be used as a
406 " static window width.
407 if !exists('g:miniBufExplMaxSize')
408   let g:miniBufExplMaxSize = g:miniBufExplMaxHeight
409 endif
410
411 " }}}
412 " MinHeight (depreciated) {{{
413 " When sizing the -MiniBufExplorer- window, assign a minumum window height.
414 " the value is minimum number of lines for buffer. Setting this to zero can
415 " cause strange height behavior. The default value is 1 [Depreciated use
416 " g:miniBufExplMinSize]
417 "
418 if !exists('g:miniBufExplMinHeight')
419   let g:miniBufExplMinHeight = 1
420 endif
421
422 " }}}
423 " MinSize {{{
424 " Same as MinHeight but also works for vertical splits. For vertical splits, 
425 " this is ignored unless g:miniBufExplMax(Size|Height) are specified.
426 if !exists('g:miniBufExplMinSize')
427   let g:miniBufExplMinSize = g:miniBufExplMinHeight
428 endif
429
430 " }}}
431 " Horizontal or Vertical explorer? {{{
432 " For folks that like vertical explorers, I'm caving in and providing for
433 " veritcal splits. If this is set to 0 then the current horizontal 
434 " splitting logic will be run. If however you want a vertical split,
435 " assign the width (in characters) you wish to assign to the MBE window.
436 "
437 if !exists('g:miniBufExplVSplit')
438   let g:miniBufExplVSplit = 0
439 endif
440
441 " }}}
442 " TabWrap? {{{
443 " By default line wrap is used (possibly breaking a tab name between two
444 " lines.) Turning this option on (setting it to 1) can take more screen
445 " space, but will make sure that each tab is on one and only one line.
446 "
447 if !exists('g:miniBufExplTabWrap')
448   let g:miniBufExplTabWrap = 0
449 endif
450
451 " }}}
452 " Extended window navigation commands? {{{
453 " Global flag to turn extended window navigation commands on or off
454 " enabled = 1, dissabled = 0
455 "
456 if !exists('g:miniBufExplMapWindowNav')
457   " This is for backwards compatibility and may be removed in a
458   " later release, please use the ...NavVim and/or ...NavArrows 
459   " settings.
460   let g:miniBufExplMapWindowNav = 0
461 endif
462 if !exists('g:miniBufExplMapWindowNavVim')
463   let g:miniBufExplMapWindowNavVim = 0
464 endif
465 if !exists('g:miniBufExplMapWindowNavArrows')
466   let g:miniBufExplMapWindowNavArrows = 0
467 endif
468 if !exists('g:miniBufExplMapCTabSwitchBufs')
469   let g:miniBufExplMapCTabSwitchBufs = 0
470 endif
471 " Notice: that if CTabSwitchBufs is turned on then
472 " we turn off CTabSwitchWindows.
473 if g:miniBufExplMapCTabSwitchBufs == 1 || !exists('g:miniBufExplMapCTabSwitchWindows')
474   let g:miniBufExplMapCTabSwitchWindows = 0
475 endif 
476
477 "
478 " If we have enabled control + vim direction key remapping
479 " then perform the remapping
480 "
481 " Notice: I left g:miniBufExplMapWindowNav in for backward
482 " compatibility. Eventually this mapping will be removed so
483 " please use the newer g:miniBufExplMapWindowNavVim setting.
484 if g:miniBufExplMapWindowNavVim || g:miniBufExplMapWindowNav
485   noremap <C-J> <C-W>j
486   noremap <C-K> <C-W>k
487   noremap <C-H> <C-W>h
488   noremap <C-L> <C-W>l
489 endif
490
491 "
492 " If we have enabled control + arrow key remapping
493 " then perform the remapping
494 "
495 if g:miniBufExplMapWindowNavArrows
496   noremap <C-Down>  <C-W>j
497   noremap <C-Up>    <C-W>k
498   noremap <C-Left>  <C-W>h
499   noremap <C-Right> <C-W>l
500 endif
501
502 " If we have enabled <C-TAB> and <C-S-TAB> to switch buffers
503 " in the current window then perform the remapping
504 "
505 if g:miniBufExplMapCTabSwitchBufs
506   noremap <C-TAB>   :call <SID>CycleBuffer(1)<CR>:<BS>
507   noremap <C-S-TAB> :call <SID>CycleBuffer(0)<CR>:<BS>
508 endif
509
510 "
511 " If we have enabled <C-TAB> and <C-S-TAB> to switch windows
512 " then perform the remapping
513 "
514 if g:miniBufExplMapCTabSwitchWindows
515   noremap <C-TAB>   <C-W>w
516   noremap <C-S-TAB> <C-W>W
517 endif
518
519 " }}}
520 " Modifiable Select Target {{{
521 "
522 if !exists('g:miniBufExplModSelTarget')
523   let g:miniBufExplModSelTarget = 0
524 endif
525
526 "}}}
527 " Force Syntax Enable {{{
528 "
529 if !exists('g:miniBufExplForceSyntaxEnable')
530   let g:miniBufExplForceSyntaxEnable = 0
531 endif
532
533 " }}}
534 " Single/Double Click? {{{
535 " flag that can be set to 1 in a users .vimrc to allow 
536 " single click switching of tabs. By default we use
537 " double click for tab selection.
538 "
539 if !exists('g:miniBufExplUseSingleClick')
540   let g:miniBufExplUseSingleClick = 0
541 endif 
542
543 "
544 " attempt to perform single click mapping, it would be much
545 " nicer if we could nnoremap <buffer> ... however vim does
546 " not fire the <buffer> <leftmouse> when you use the mouse
547 " to enter a buffer.
548 "
549 if g:miniBufExplUseSingleClick == 1
550   let s:clickmap = ':if bufname("%") == "-MiniBufExplorer-" <bar> call <SID>MBEClick() <bar> endif <CR>'
551   if maparg('<LEFTMOUSE>', 'n') == '' 
552     " no mapping for leftmouse
553     exec ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>' . s:clickmap
554   else
555     " we have a mapping
556     let  g:miniBufExplDoneClickSave = 1
557     let  s:m = ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>'
558     let  s:m = s:m . substitute(substitute(maparg('<LEFTMOUSE>', 'n'), '|', '<bar>', 'g'), '\c^<LEFTMOUSE>', '', '')
559     let  s:m = s:m . s:clickmap
560     exec s:m
561   endif
562 endif " }}}
563
564 " Variables used internally
565 "
566 " Script/Global variables {{{
567 " Global used to store the buffer list so we don't update the
568 " UI unless the list has changed.
569 if !exists('g:miniBufExplBufList')
570   let g:miniBufExplBufList = ''
571 endif
572
573 " Variable used as a mutex so that we don't do lots
574 " of AutoUpdates at the same time.
575 if !exists('g:miniBufExplInAutoUpdate')
576   let g:miniBufExplInAutoUpdate = 0
577 endif
578
579 " In debug mode 3 this variable will hold the debug output
580 if !exists('g:miniBufExplorerDebugOutput')
581   let g:miniBufExplorerDebugOutput = ''
582 endif
583
584 " In debug mode 3 this variable will hold the debug output
585 if !exists('g:miniBufExplForceDisplay')
586   let g:miniBufExplForceDisplay = 0
587 endif
588
589 " Variable used to pass maxTabWidth info between functions
590 let s:maxTabWidth = 0 
591
592 " Variable used to count debug output lines
593 let s:debugIndex = 0 
594
595   
596 " }}}
597 " Setup an autocommand group and some autocommands {{{
598 " that keep our explorer updated automatically.
599 "
600 augroup MiniBufExplorer
601 autocmd MiniBufExplorer BufDelete   * call <SID>DEBUG('-=> BufDelete AutoCmd', 10) |call <SID>AutoUpdate(expand('<abuf>'))
602 autocmd MiniBufExplorer BufEnter    * call <SID>DEBUG('-=> BufEnter  AutoCmd', 10) |call <SID>AutoUpdate(-1)
603 autocmd MiniBufExplorer VimEnter    * call <SID>DEBUG('-=> VimEnter  AutoCmd', 10) |let g:miniBufExplorerAutoUpdate = 1 |call <SID>AutoUpdate(-1)
604 " }}}
605
606 " Functions
607 "
608 " StartExplorer - Sets up our explorer and causes it to be displayed {{{
609 "
610 function! <SID>StartExplorer(sticky, delBufNum)
611   call <SID>DEBUG('===========================',10)
612   call <SID>DEBUG('Entering StartExplorer()'   ,10)
613   call <SID>DEBUG('===========================',10)
614
615   if a:sticky == 1
616     let g:miniBufExplorerAutoUpdate = 1
617   endif
618
619   " Store the current buffer
620   let l:curBuf = bufnr('%')
621
622   " Prevent a report of our actions from showing up.
623   let l:save_rep = &report
624   let l:save_sc  = &showcmd
625   let &report    = 10000
626   set noshowcmd 
627
628   call <SID>FindCreateWindow('-MiniBufExplorer-', -1, 1, 1)
629
630   " Make sure we are in our window
631   if bufname('%') != '-MiniBufExplorer-'
632     call <SID>DEBUG('StartExplorer called in invalid window',1)
633     let &report  = l:save_rep
634     let &showcmd = l:save_sc
635     return
636   endif
637
638   " !!! We may want to make the following optional -- Bindu
639   " New windows don't cause all windows to be resized to equal sizes
640   set noequalalways
641   " !!! We may want to make the following optional -- Bindu
642   " We don't want the mouse to change focus without a click
643   set nomousefocus
644
645   " If folks turn numbering and columns on by default we will turn 
646   " them off for the MBE window
647   setlocal foldcolumn=0
648   setlocal nonumber
649  
650   if has("syntax")
651     syn clear
652     syn match MBENormal             '\[[^\]]*\]'
653     syn match MBEChanged            '\[[^\]]*\]+'
654     syn match MBEVisibleNormal      '\[[^\]]*\]\*+\='
655     syn match MBEVisibleChanged     '\[[^\]]*\]\*+'
656     
657     if !exists("g:did_minibufexplorer_syntax_inits")
658       let g:did_minibufexplorer_syntax_inits = 1
659       hi def link MBENormal         Comment
660       hi def link MBEChanged        String
661       hi def link MBEVisibleNormal  Special
662       hi def link MBEVisibleChanged Special
663     endif
664   endif
665
666   " If you press return in the -MiniBufExplorer- then try
667   " to open the selected buffer in the previous window.
668   nnoremap <buffer> <CR> :call <SID>MBESelectBuffer()<CR>:<BS>
669   " If you DoubleClick in the -MiniBufExplorer- then try
670   " to open the selected buffer in the previous window.
671   nnoremap <buffer> <2-LEFTMOUSE> :call <SID>MBEDoubleClick()<CR>:<BS>
672   " If you press d in the -MiniBufExplorer- then try to
673   " delete the selected buffer.
674   nnoremap <buffer> d :call <SID>MBEDeleteBuffer()<CR>:<BS>
675   " If you press w in the -MiniBufExplorer- then switch back
676   " to the previous window.
677   nnoremap <buffer> p :wincmd p<CR>:<BS>
678   " The following allow us to use regular movement keys to 
679   " scroll in a wrapped single line buffer
680   nnoremap <buffer> j gj
681   nnoremap <buffer> k gk
682   nnoremap <buffer> <down> gj
683   nnoremap <buffer> <up> gk
684   " The following allows for quicker moving between buffer
685   " names in the [MBE] window it also saves the last-pattern
686   " and restores it.
687   nnoremap <buffer> <TAB>   :call search('\[[0-9]*:[^\]]*\]')<CR>:<BS>
688   nnoremap <buffer> <S-TAB> :call search('\[[0-9]*:[^\]]*\]','b')<CR>:<BS>
689  
690   call <SID>DisplayBuffers(a:delBufNum)
691
692   if (l:curBuf != -1)
693     call search('\['.l:curBuf.':'.expand('#'.l:curBuf.':t').'\]')
694   else
695     call <SID>DEBUG('No current buffer to search for',9)
696   endif
697
698   let &report  = l:save_rep
699   let &showcmd = l:save_sc
700
701   call <SID>DEBUG('===========================',10)
702   call <SID>DEBUG('Completed StartExplorer()'  ,10)
703   call <SID>DEBUG('===========================',10)
704
705 endfunction 
706
707 " }}}
708 " StopExplorer - Looks for our explorer and closes the window if it is open {{{
709 "
710 function! <SID>StopExplorer(sticky)
711   call <SID>DEBUG('===========================',10)
712   call <SID>DEBUG('Entering StopExplorer()'    ,10)
713   call <SID>DEBUG('===========================',10)
714
715   if a:sticky == 1
716     let g:miniBufExplorerAutoUpdate = 0
717   endif
718
719   let l:winNum = <SID>FindWindow('-MiniBufExplorer-', 1)
720
721   if l:winNum != -1 
722     exec l:winNum.' wincmd w'
723     silent! close
724     wincmd p
725   endif
726
727   call <SID>DEBUG('===========================',10)
728   call <SID>DEBUG('Completed StopExplorer()'   ,10)
729   call <SID>DEBUG('===========================',10)
730
731 endfunction
732
733 " }}}
734 " ToggleExplorer - Looks for our explorer and opens/closes the window {{{
735 "
736 function! <SID>ToggleExplorer()
737   call <SID>DEBUG('===========================',10)
738   call <SID>DEBUG('Entering ToggleExplorer()'  ,10)
739   call <SID>DEBUG('===========================',10)
740
741   let g:miniBufExplorerAutoUpdate = 0
742
743   let l:winNum = <SID>FindWindow('-MiniBufExplorer-', 1)
744
745   if l:winNum != -1 
746     call <SID>StopExplorer(1)
747   else
748     call <SID>StartExplorer(1, -1)
749     wincmd p
750   endif
751
752   call <SID>DEBUG('===========================',10)
753   call <SID>DEBUG('Completed ToggleExplorer()' ,10)
754   call <SID>DEBUG('===========================',10)
755
756 endfunction
757
758 " }}}
759 " FindWindow - Return the window number of a named buffer {{{
760 " If none is found then returns -1. 
761 "
762 function! <SID>FindWindow(bufName, doDebug)
763   if a:doDebug
764     call <SID>DEBUG('Entering FindWindow()',10)
765   endif
766
767   " Try to find an existing window that contains 
768   " our buffer.
769   let l:bufNum = bufnr(a:bufName)
770   if l:bufNum != -1
771     if a:doDebug
772       call <SID>DEBUG('Found buffer ('.a:bufName.'): '.l:bufNum,9)
773     endif
774     let l:winNum = bufwinnr(l:bufNum)
775   else
776     let l:winNum = -1
777   endif
778
779   return l:winNum
780
781 endfunction
782
783 " }}}
784 " FindCreateWindow - Attempts to find a window for a named buffer. {{{
785 "
786 " If it is found then moves there. Otherwise creates a new window and 
787 " configures it and moves there.
788 "
789 " forceEdge, -1 use defaults, 0 below, 1 above
790 " isExplorer, 0 no, 1 yes 
791 " doDebug, 0 no, 1 yes
792 "
793 function! <SID>FindCreateWindow(bufName, forceEdge, isExplorer, doDebug)
794   if a:doDebug
795     call <SID>DEBUG('Entering FindCreateWindow('.a:bufName.')',10)
796   endif
797
798   " Save the user's split setting.
799   let l:saveSplitBelow = &splitbelow
800
801   " Set to our new values.
802   let &splitbelow = g:miniBufExplSplitBelow
803
804   " Try to find an existing explorer window
805   let l:winNum = <SID>FindWindow(a:bufName, a:doDebug)
806
807   " If found goto the existing window, otherwise 
808   " split open a new window.
809   if l:winNum != -1
810     if a:doDebug
811       call <SID>DEBUG('Found window ('.a:bufName.'): '.l:winNum,9)
812     endif
813     exec l:winNum.' wincmd w'
814     let l:winFound = 1
815   else
816
817     if g:miniBufExplSplitToEdge == 1 || a:forceEdge >= 0
818
819         let l:edge = &splitbelow
820         if a:forceEdge >= 0
821             let l:edge = a:forceEdge
822         endif
823
824         if l:edge
825             if g:miniBufExplVSplit == 0
826               exec 'bo sp '.a:bufName
827             else
828               exec 'bo vsp '.a:bufName
829             endif
830         else
831             if g:miniBufExplVSplit == 0
832               exec 'to sp '.a:bufName
833             else
834               exec 'to vsp '.a:bufName
835             endif
836         endif
837     else
838         if g:miniBufExplVSplit == 0
839           exec 'sp '.a:bufName
840         else
841           " &splitbelow doesn't affect vertical splits
842           " so we have to do this explicitly.. ugh.
843           if &splitbelow
844             exec 'rightb vsp '.a:bufName
845           else
846             exec 'vsp '.a:bufName
847           endif
848         endif
849     endif
850
851     let g:miniBufExplForceDisplay = 1
852
853     " Try to find an existing explorer window
854     let l:winNum = <SID>FindWindow(a:bufName, a:doDebug)
855     if l:winNum != -1
856       if a:doDebug
857         call <SID>DEBUG('Created and then found window ('.a:bufName.'): '.l:winNum,9)
858       endif
859       exec l:winNum.' wincmd w'
860     else
861       if a:doDebug
862         call <SID>DEBUG('FindCreateWindow failed to create window ('.a:bufName.').',1)
863       endif
864       return
865     endif
866
867     if a:isExplorer
868       " Turn off the swapfile, set the buffer type so that it won't get written,
869       " and so that it will get deleted when it gets hidden and turn on word wrap.
870       setlocal noswapfile
871       setlocal buftype=nofile
872       setlocal bufhidden=delete
873       if g:miniBufExplVSplit == 0
874         setlocal wrap
875       else
876         setlocal nowrap
877         exec('setlocal winwidth='.g:miniBufExplMinSize)
878       endif
879     endif
880
881     if a:doDebug
882       call <SID>DEBUG('Window ('.a:bufName.') created: '.winnr(),9)
883     endif
884
885   endif
886
887   " Restore the user's split setting.
888   let &splitbelow = l:saveSplitBelow
889
890 endfunction
891
892 " }}}
893 " DisplayBuffers - Wrapper for getting MBE window shown {{{
894 "
895 " Makes sure we are in our explorer, then erases the current buffer and turns 
896 " it into a mini buffer explorer window.
897 "
898 function! <SID>DisplayBuffers(delBufNum)
899   call <SID>DEBUG('Entering DisplayBuffers()',10)
900   
901   " Make sure we are in our window
902   if bufname('%') != '-MiniBufExplorer-'
903     call <SID>DEBUG('DisplayBuffers called in invalid window',1)
904     return
905   endif
906
907   " We need to be able to modify the buffer
908   setlocal modifiable
909
910   call <SID>ShowBuffers(a:delBufNum)
911   call <SID>ResizeWindow()
912   
913   normal! zz
914   
915   " Prevent the buffer from being modified.
916   setlocal nomodifiable
917   set nobuflisted
918
919 endfunction
920
921 " }}}
922 " Resize Window - Set width/height of MBE window {{{
923
924 " Makes sure we are in our explorer, then sets the height/width for our explorer 
925 " window so that we can fit all of our information without taking extra lines.
926 "
927 function! <SID>ResizeWindow()
928   call <SID>DEBUG('Entering ResizeWindow()',10)
929
930   " Make sure we are in our window
931   if bufname('%') != '-MiniBufExplorer-'
932     call <SID>DEBUG('ResizeWindow called in invalid window',1)
933     return
934   endif
935
936   let l:width  = winwidth('.')
937
938   " Horizontal Resize
939   if g:miniBufExplVSplit == 0
940
941     if g:miniBufExplTabWrap == 0
942       let l:length = strlen(getline('.'))
943       let l:height = 0
944       if (l:width == 0)
945         let l:height = winheight('.')
946       else
947         let l:height = (l:length / l:width) 
948         " handle truncation from div
949         if (l:length % l:width) != 0
950           let l:height = l:height + 1
951         endif
952       endif
953     else
954       exec("setlocal textwidth=".l:width)
955       normal gg
956       normal gq}
957       normal G
958       let l:height = line('.')
959       normal gg
960     endif
961   
962     " enforce max window height
963     if g:miniBufExplMaxSize != 0
964       if g:miniBufExplMaxSize < l:height
965         let l:height = g:miniBufExplMaxSize
966       endif
967     endif
968   
969     " enfore min window height
970     if l:height < g:miniBufExplMinSize || l:height == 0
971       let l:height = g:miniBufExplMinSize
972     endif
973   
974     call <SID>DEBUG('ResizeWindow to '.l:height.' lines',9)
975   
976     exec('resize '.l:height)
977   
978   " Vertical Resize
979   else 
980
981     if g:miniBufExplMaxSize != 0
982       let l:newWidth = s:maxTabWidth
983       if l:newWidth > g:miniBufExplMaxSize 
984           let l:newWidth = g:miniBufExplMaxSize
985       endif
986       if l:newWidth < g:miniBufExplMinSize
987           let l:newWidth = g:miniBufExplMinSize
988       endif
989     else
990       let l:newWidth = g:miniBufExplVSplit
991     endif
992
993     if l:width != l:newWidth
994       call <SID>DEBUG('ResizeWindow to '.l:newWidth.' columns',9)
995       exec('vertical resize '.l:newWidth)
996     endif
997
998   endif
999   
1000 endfunction
1001
1002 " }}}
1003 " ShowBuffers - Clear current buffer and put the MBE text into it {{{
1004
1005 " Makes sure we are in our explorer, then adds a list of all modifiable 
1006 " buffers to the current buffer. Special marks are added for buffers that 
1007 " are in one or more windows (*) and buffers that have been modified (+)
1008 "
1009 function! <SID>ShowBuffers(delBufNum)
1010   call <SID>DEBUG('Entering ShowBuffers()',10)
1011
1012   let l:ListChanged = <SID>BuildBufferList(a:delBufNum, 1)
1013
1014   if (l:ListChanged == 1 || g:miniBufExplForceDisplay)
1015     let l:save_rep = &report
1016     let l:save_sc = &showcmd
1017     let &report = 10000
1018     set noshowcmd 
1019
1020     " Delete all lines in buffer.
1021     1,$d _
1022   
1023     " Goto the end of the buffer put the buffer list 
1024     " and then delete the extra trailing blank line
1025     $
1026     put! =g:miniBufExplBufList
1027     $ d _
1028
1029     let g:miniBufExplForceDisplay = 0
1030
1031     let &report  = l:save_rep
1032     let &showcmd = l:save_sc
1033   else
1034     call <SID>DEBUG('Buffer list not update since there was no change',9)
1035   endif
1036   
1037 endfunction
1038
1039 " }}}
1040 " Max - Returns the max of two numbers {{{
1041 "
1042 function! <SID>Max(argOne, argTwo)
1043   if a:argOne > a:argTwo
1044     return a:argOne
1045   else
1046     return a:argTwo
1047   endif
1048 endfunction
1049
1050 " }}}
1051 " BuildBufferList - Build the text for the MBE window {{{
1052
1053 " Creates the buffer list string and returns 1 if it is different than
1054 " last time this was called and 0 otherwise.
1055 "
1056 function! <SID>BuildBufferList(delBufNum, updateBufList)
1057   call <SID>DEBUG('Entering BuildBufferList()',10)
1058
1059   let l:NBuffers = bufnr('$')     " Get the number of the last buffer.
1060   let l:i = 0                     " Set the buffer index to zero.
1061
1062   let l:fileNames = ''
1063   let l:maxTabWidth = 0
1064
1065   " Loop through every buffer less than the total number of buffers.
1066   while(l:i <= l:NBuffers)
1067     let l:i = l:i + 1
1068    
1069     " If we have a delBufNum and it is the current
1070     " buffer then ignore the current buffer. 
1071     " Otherwise, continue.
1072     if (a:delBufNum == -1 || l:i != a:delBufNum)
1073       " Make sure the buffer in question is listed.
1074       if(getbufvar(l:i, '&buflisted') == 1)
1075         " Get the name of the buffer.
1076         let l:BufName = bufname(l:i)
1077         " Check to see if the buffer is a blank or not. If the buffer does have
1078         " a name, process it.
1079         if(strlen(l:BufName))
1080           " Only show modifiable buffers (The idea is that we don't 
1081           " want to show Explorers)
1082           if (getbufvar(l:i, '&modifiable') == 1 && BufName != '-MiniBufExplorer-')
1083             
1084             " Get filename & Remove []'s & ()'s
1085             let l:shortBufName = fnamemodify(l:BufName, ":t")                  
1086             let l:shortBufName = substitute(l:shortBufName, '[][()]', '', 'g') 
1087             let l:tab = '['.l:i.':'.l:shortBufName.']'
1088
1089             " If the buffer is open in a window mark it
1090             if bufwinnr(l:i) != -1
1091               let l:tab = l:tab . '*'
1092             endif
1093
1094             " If the buffer is modified then mark it
1095             if(getbufvar(l:i, '&modified') == 1)
1096               let l:tab = l:tab . '+'
1097             endif
1098
1099             let l:maxTabWidth = <SID>Max(strlen(l:tab), l:maxTabWidth)
1100             let l:fileNames = l:fileNames.l:tab
1101
1102             " If horizontal and tab wrap is turned on we need to add spaces
1103             if g:miniBufExplVSplit == 0
1104               if g:miniBufExplTabWrap != 0
1105                 let l:fileNames = l:fileNames.' '
1106               endif
1107             " If not horizontal we need a newline
1108             else
1109               let l:fileNames = l:fileNames . "\n"
1110             endif
1111           endif
1112         endif
1113       endif
1114     endif
1115   endwhile
1116
1117   if (g:miniBufExplBufList != l:fileNames)
1118     if (a:updateBufList)
1119       let g:miniBufExplBufList = l:fileNames
1120       let s:maxTabWidth = l:maxTabWidth
1121     endif
1122     return 1
1123   else
1124     return 0
1125   endif
1126
1127 endfunction
1128
1129 " }}}
1130 " HasEligibleBuffers - Are there enough MBE eligible buffers to open the MBE window? {{{
1131
1132 " Returns 1 if there are any buffers that can be displayed in a 
1133 " mini buffer explorer. Otherwise returns 0. If delBufNum is
1134 " any non -1 value then don't include that buffer in the list
1135 " of eligible buffers.
1136 "
1137 function! <SID>HasEligibleBuffers(delBufNum)
1138   call <SID>DEBUG('Entering HasEligibleBuffers()',10)
1139
1140   let l:save_rep = &report
1141   let l:save_sc = &showcmd
1142   let &report = 10000
1143   set noshowcmd 
1144   
1145   let l:NBuffers = bufnr('$')     " Get the number of the last buffer.
1146   let l:i        = 0              " Set the buffer index to zero.
1147   let l:found    = 0              " No buffer found
1148
1149   if (g:miniBufExplorerMoreThanOne > 1)
1150     call <SID>DEBUG('More Than One mode turned on',6)
1151   endif
1152   let l:needed = g:miniBufExplorerMoreThanOne
1153
1154   " Loop through every buffer less than the total number of buffers.
1155   while(l:i <= l:NBuffers && l:found < l:needed)
1156     let l:i = l:i + 1
1157    
1158     " If we have a delBufNum and it is the current
1159     " buffer then ignore the current buffer. 
1160     " Otherwise, continue.
1161     if (a:delBufNum == -1 || l:i != a:delBufNum)
1162       " Make sure the buffer in question is listed.
1163       if (getbufvar(l:i, '&buflisted') == 1)
1164         " Get the name of the buffer.
1165         let l:BufName = bufname(l:i)
1166         " Check to see if the buffer is a blank or not. If the buffer does have
1167         " a name, process it.
1168         if (strlen(l:BufName))
1169           " Only show modifiable buffers (The idea is that we don't 
1170           " want to show Explorers)
1171           if ((getbufvar(l:i, '&modifiable') == 1) && (BufName != '-MiniBufExplorer-'))
1172             
1173               let l:found = l:found + 1
1174   
1175           endif
1176         endif
1177       endif
1178     endif
1179   endwhile
1180
1181   let &report  = l:save_rep
1182   let &showcmd = l:save_sc
1183
1184   call <SID>DEBUG('HasEligibleBuffers found '.l:found.' eligible buffers of '.l:needed.' needed',6)
1185
1186   return (l:found >= l:needed)
1187   
1188 endfunction
1189
1190 " }}}
1191 " Auto Update - Function called by auto commands for auto updating the MBE {{{
1192 "
1193 " IF auto update is turned on        AND
1194 "    we are in a real buffer         AND
1195 "    we have enough eligible buffers THEN
1196 " Update our explorer and get back to the current window
1197 "
1198 " If we get a buffer number for a buffer that 
1199 " is being deleted, we need to make sure and 
1200 " remove the buffer from the list of eligible 
1201 " buffers in case we are down to one eligible
1202 " buffer, in which case we will want to close
1203 " the MBE window.
1204 "
1205 function! <SID>AutoUpdate(delBufNum)
1206   call <SID>DEBUG('===========================',10)
1207   call <SID>DEBUG('Entering AutoUpdate('.a:delBufNum.') : '.bufnr('%').' : '.bufname('%'),10)
1208   call <SID>DEBUG('===========================',10)
1209
1210   if (g:miniBufExplInAutoUpdate == 1)
1211     call <SID>DEBUG('AutoUpdate recursion stopped',9)
1212     call <SID>DEBUG('===========================',10)
1213     call <SID>DEBUG('Terminated AutoUpdate()'    ,10)
1214     call <SID>DEBUG('===========================',10)
1215     return
1216   else
1217     let g:miniBufExplInAutoUpdate = 1
1218   endif
1219
1220   " Don't bother autoupdating the MBE window
1221   if (bufname('%') == '-MiniBufExplorer-')
1222     " If this is the only buffer left then toggle the buffer
1223     if (winbufnr(2) == -1)
1224         call <SID>CycleBuffer(1)
1225         call <SID>DEBUG('AutoUpdate does not run for cycled windows', 9)
1226     else
1227       call <SID>DEBUG('AutoUpdate does not run for the MBE window', 9)
1228     endif
1229
1230     call <SID>DEBUG('===========================',10)
1231     call <SID>DEBUG('Terminated AutoUpdate()'    ,10)
1232     call <SID>DEBUG('===========================',10)
1233
1234     let g:miniBufExplInAutoUpdate = 0
1235     return
1236
1237   endif
1238
1239   if (a:delBufNum != -1)
1240     call <SID>DEBUG('AutoUpdate will make sure that buffer '.a:delBufNum.' is not included in the buffer list.', 5)
1241   endif
1242   
1243   " Only allow updates when the AutoUpdate flag is set
1244   " this allows us to stop updates on startup.
1245   if g:miniBufExplorerAutoUpdate == 1
1246     " Only show MiniBufExplorer if we have a real buffer
1247     if ((g:miniBufExplorerMoreThanOne == 0) || (bufnr('%') != -1 && bufname('%') != ""))
1248       if <SID>HasEligibleBuffers(a:delBufNum) == 1
1249         " if we don't have a window then create one
1250         let l:bufnr = <SID>FindWindow('-MiniBufExplorer-', 0)
1251         if (l:bufnr == -1)
1252           call <SID>DEBUG('About to call StartExplorer (Create MBE)', 9)
1253           call <SID>StartExplorer(0, a:delBufNum)
1254         else
1255         " otherwise only update the window if the contents have
1256         " changed
1257           let l:ListChanged = <SID>BuildBufferList(a:delBufNum, 0)
1258           if (l:ListChanged)
1259             call <SID>DEBUG('About to call StartExplorer (Update MBE)', 9) 
1260             call <SID>StartExplorer(0, a:delBufNum)
1261           endif
1262         endif
1263
1264         " go back to the working buffer
1265         if (bufname('%') == '-MiniBufExplorer-')
1266           wincmd p
1267         endif
1268       else
1269         call <SID>DEBUG('Failed in eligible check', 9)
1270         call <SID>StopExplorer(0)
1271       endif
1272
1273           " VIM sometimes turns syntax highlighting off,
1274           " we can force it on, but this may cause weird
1275           " behavior so this is an optional hack to force
1276           " syntax back on when we enter a buffer
1277           if g:miniBufExplForceSyntaxEnable
1278                 call <SID>DEBUG('Enable Syntax', 9)
1279                 exec 'syntax enable'
1280           endif
1281
1282     else
1283       call <SID>DEBUG('No buffers loaded...',9)
1284     endif
1285   else
1286     call <SID>DEBUG('AutoUpdates are turned off, terminating',9)
1287   endif
1288
1289   call <SID>DEBUG('===========================',10)
1290   call <SID>DEBUG('Completed AutoUpdate()'     ,10)
1291   call <SID>DEBUG('===========================',10)
1292
1293   let g:miniBufExplInAutoUpdate = 0
1294
1295 endfunction
1296
1297 " }}}
1298 " GetSelectedBuffer - From the MBE window, return the bufnum for buf under cursor {{{
1299
1300 " If we are in our explorer window then return the buffer number
1301 " for the buffer under the cursor.
1302 "
1303 function! <SID>GetSelectedBuffer()
1304   call <SID>DEBUG('Entering GetSelectedBuffer()',10)
1305
1306   " Make sure we are in our window
1307   if bufname('%') != '-MiniBufExplorer-'
1308     call <SID>DEBUG('GetSelectedBuffer called in invalid window',1)
1309     return -1
1310   endif
1311
1312   let l:save_reg = @"
1313   let @" = ""
1314   normal ""yi[
1315   if @" != ""
1316     let l:retv = substitute(@",'\([0-9]*\):.*', '\1', '') + 0
1317     let @" = l:save_reg
1318     return l:retv
1319   else
1320     let @" = l:save_reg
1321     return -1
1322   endif
1323
1324 endfunction
1325
1326 " }}}
1327 " MBESelectBuffer - From the MBE window, open buffer under the cursor {{{
1328
1329 " If we are in our explorer, then we attempt to open the buffer under the
1330 " cursor in the previous window.
1331 "
1332 function! <SID>MBESelectBuffer()
1333   call <SID>DEBUG('===========================',10)
1334   call <SID>DEBUG('Entering MBESelectBuffer()' ,10)
1335   call <SID>DEBUG('===========================',10)
1336
1337   " Make sure we are in our window
1338   if bufname('%') != '-MiniBufExplorer-'
1339     call <SID>DEBUG('MBESelectBuffer called in invalid window',1)
1340     return 
1341   endif
1342
1343   let l:save_rep = &report
1344   let l:save_sc  = &showcmd
1345   let &report    = 10000
1346   set noshowcmd 
1347   
1348   let l:bufnr  = <SID>GetSelectedBuffer()
1349   let l:resize = 0
1350
1351   if(l:bufnr != -1)             " If the buffer exists.
1352
1353     let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate
1354     let g:miniBufExplorerAutoUpdate = 0
1355     " Switch to the previous window
1356     wincmd p
1357
1358     " If we are in the buffer explorer or in a nonmodifiable buffer with
1359     " g:miniBufExplModSelTarget set then try another window (a few times)
1360     if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
1361       wincmd w
1362       if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
1363         wincmd w
1364         if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
1365           wincmd w
1366           " The following handles the case where -MiniBufExplorer-
1367           " is the only window left. We need to resize so we don't
1368           " end up with a 1 or two line buffer.
1369           if bufname('%') == '-MiniBufExplorer-'
1370             let l:resize = 1
1371           endif
1372         endif
1373       endif
1374     endif
1375
1376     exec('b! '.l:bufnr)
1377     if (l:resize)
1378       resize
1379     endif
1380     let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate
1381     call <SID>AutoUpdate(-1)
1382
1383   endif
1384
1385   let &report  = l:save_rep
1386   let &showcmd = l:save_sc
1387
1388   call <SID>DEBUG('===========================',10)
1389   call <SID>DEBUG('Completed MBESelectBuffer()',10)
1390   call <SID>DEBUG('===========================',10)
1391
1392 endfunction
1393
1394 " }}}
1395 " MBEDeleteBuffer - From the MBE window, delete selected buffer from list {{{
1396
1397 " After making sure that we are in our explorer, This will delete the buffer 
1398 " under the cursor. If the buffer under the cursor is being displayed in a
1399 " window, this routine will attempt to get different buffers into the 
1400 " windows that will be affected so that windows don't get removed.
1401 "
1402 function! <SID>MBEDeleteBuffer()
1403   call <SID>DEBUG('===========================',10)
1404   call <SID>DEBUG('Entering MBEDeleteBuffer()' ,10)
1405   call <SID>DEBUG('===========================',10)
1406
1407   " Make sure we are in our window
1408   if bufname('%') != '-MiniBufExplorer-'
1409     call <SID>DEBUG('MBEDeleteBuffer called in invalid window',1)
1410     return 
1411   endif
1412
1413   let l:curLine    = line('.')
1414   let l:curCol     = virtcol('.')
1415   let l:selBuf     = <SID>GetSelectedBuffer()
1416   let l:selBufName = bufname(l:selBuf)
1417
1418   if l:selBufName == 'MiniBufExplorer.DBG' && g:miniBufExplorerDebugLevel > 0
1419     call <SID>DEBUG('MBEDeleteBuffer will not delete the debug window, when debugging is turned on.',1)
1420     return
1421   endif
1422
1423   let l:save_rep = &report
1424   let l:save_sc  = &showcmd
1425   let &report    = 10000
1426   set noshowcmd 
1427   
1428   
1429   if l:selBuf != -1 
1430
1431     " Don't want auto updates while we are processing a delete
1432     " request.
1433     let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate
1434     let g:miniBufExplorerAutoUpdate = 0
1435
1436     " Save previous window so that if we show a buffer after
1437     " deleting. The show will come up in the correct window.
1438     wincmd p
1439     let l:prevWin    = winnr()
1440     let l:prevWinBuf = winbufnr(winnr())
1441
1442     call <SID>DEBUG('Previous window: '.l:prevWin.' buffer in window: '.l:prevWinBuf,5)
1443     call <SID>DEBUG('Selected buffer is <'.l:selBufName.'>['.l:selBuf.']',5)
1444
1445     " If buffer is being displayed in a window then 
1446     " move window to a different buffer before 
1447     " deleting this one. 
1448     let l:winNum = (bufwinnr(l:selBufName) + 0)
1449     " while we have windows that contain our buffer
1450     while l:winNum != -1 
1451         call <SID>DEBUG('Buffer '.l:selBuf.' is being displayed in window: '.l:winNum,5)
1452
1453         " move to window that contains our selected buffer
1454         exec l:winNum.' wincmd w'
1455
1456         call <SID>DEBUG('We are now in window: '.winnr().' which contains buffer: '.bufnr('%').' and should contain buffer: '.l:selBuf,5)
1457
1458         let l:origBuf = bufnr('%')
1459         call <SID>CycleBuffer(1)
1460         let l:curBuf  = bufnr('%')
1461
1462         call <SID>DEBUG('Window now contains buffer: '.bufnr('%').' which should not be: '.l:selBuf,5)
1463
1464         if l:origBuf == l:curBuf
1465             " we wrapped so we are going to have to delete a buffer 
1466             " that is in an open window.
1467             let l:winNum = -1
1468         else
1469             " see if we have anymore windows with our selected buffer
1470             let l:winNum = (bufwinnr(l:selBufName) + 0)
1471         endif
1472     endwhile
1473
1474     " Attempt to restore previous window
1475     call <SID>DEBUG('Restoring previous window to: '.l:prevWin,5)
1476     exec l:prevWin.' wincmd w'
1477
1478     " Try to get back to the -MiniBufExplorer- window 
1479     let l:winNum = bufwinnr(bufnr('-MiniBufExplorer-'))
1480     if l:winNum != -1
1481         exec l:winNum.' wincmd w'
1482         call <SID>DEBUG('Got to -MiniBufExplorer- window: '.winnr(),5)
1483     else
1484         call <SID>DEBUG('Unable to get to -MiniBufExplorer- window',1)
1485     endif
1486   
1487     " Delete the buffer selected.
1488     call <SID>DEBUG('About to delete buffer: '.l:selBuf,5)
1489     exec('silent! bd '.l:selBuf)
1490
1491     let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate 
1492     call <SID>DisplayBuffers(-1)
1493     call cursor(l:curLine, l:curCol)
1494
1495   endif
1496
1497   let &report  = l:save_rep
1498   let &showcmd = l:save_sc
1499
1500   call <SID>DEBUG('===========================',10)
1501   call <SID>DEBUG('Completed MBEDeleteBuffer()',10)
1502   call <SID>DEBUG('===========================',10)
1503
1504 endfunction
1505
1506 " }}}
1507 " MBEClick - Handle mouse double click {{{
1508 "
1509 function! s:MBEClick()
1510   call <SID>DEBUG('Entering MBEClick()',10)
1511   call <SID>MBESelectBuffer()
1512 endfunction
1513
1514 "
1515 " MBEDoubleClick - Double click with the mouse.
1516 "
1517 function! s:MBEDoubleClick()
1518   call <SID>DEBUG('Entering MBEDoubleClick()',10)
1519   call <SID>MBESelectBuffer()
1520 endfunction
1521
1522 " }}}
1523 " CycleBuffer - Cycle Through Buffers {{{
1524 "
1525 " Move to next or previous buffer in the current window. If there 
1526 " are no more modifiable buffers then stay on the current buffer.
1527 " can be called with no parameters in which case the buffers are
1528 " cycled forward. Otherwise a single argument is accepted, if 
1529 " it's 0 then the buffers are cycled backwards, otherwise they
1530 " are cycled forward.
1531 "
1532 function! <SID>CycleBuffer(forward)
1533
1534   " The following hack handles the case where we only have one
1535   " window open and it is too small
1536   let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate
1537   if (winbufnr(2) == -1)
1538     resize
1539     let g:miniBufExplorerAutoUpdate = 0
1540   endif
1541   
1542   " Change buffer (keeping track of before and after buffers)
1543   let l:origBuf = bufnr('%')
1544   if (a:forward == 1)
1545     bn!
1546   else
1547     bp!
1548   endif
1549   let l:curBuf  = bufnr('%')
1550
1551   " Skip any non-modifiable buffers, but don't cycle forever
1552   " This should stop us from stopping in any of the [Explorers]
1553   while getbufvar(l:curBuf, '&modifiable') == 0 && l:origBuf != l:curBuf
1554     if (a:forward == 1)
1555         bn!
1556     else
1557         bp!
1558     endif
1559     let l:curBuf = bufnr('%')
1560   endwhile
1561
1562   let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate
1563   if (l:saveAutoUpdate == 1)
1564     call <SID>AutoUpdate(-1)
1565   endif
1566
1567 endfunction
1568
1569 " }}}
1570 " DEBUG - Display debug output when debugging is turned on {{{
1571 "
1572 " Thanks to Charles E. Campbell, Jr. PhD <cec@NgrOyphSon.gPsfAc.nMasa.gov> 
1573 " for Decho.vim which was the inspiration for this enhanced debugging 
1574 " capability.
1575 "
1576 function! <SID>DEBUG(msg, level)
1577
1578   if g:miniBufExplorerDebugLevel >= a:level
1579
1580     " Prevent a report of our actions from showing up.
1581     let l:save_rep    = &report
1582     let l:save_sc     = &showcmd
1583     let &report       = 10000
1584     set noshowcmd 
1585
1586     " Debug output to a buffer
1587     if g:miniBufExplorerDebugMode == 0
1588         " Save the current window number so we can come back here
1589         let l:prevWin     = winnr()
1590         wincmd p
1591         let l:prevPrevWin = winnr()
1592         wincmd p
1593
1594         " Get into the debug window or create it if needed
1595         call <SID>FindCreateWindow('MiniBufExplorer.DBG', 1, 0, 0)
1596     
1597         " Make sure we really got to our window, if not we 
1598         " will display a confirm dialog and turn debugging
1599         " off so that we won't break things even more.
1600         if bufname('%') != 'MiniBufExplorer.DBG'
1601             call confirm('Error in window debugging code. Dissabling MiniBufExplorer debugging.', 'OK')
1602             let g:miniBufExplorerDebugLevel = 0
1603         endif
1604
1605         " Write Message to DBG buffer
1606         let res=append("$",s:debugIndex.':'.a:level.':'.a:msg)
1607         norm G
1608         "set nomodified
1609
1610         " Return to original window
1611         exec l:prevPrevWin.' wincmd w'
1612         exec l:prevWin.' wincmd w'
1613     " Debug output using VIM's echo facility
1614     elseif g:miniBufExplorerDebugMode == 1
1615       echo s:debugIndex.':'.a:level.':'.a:msg
1616     " Debug output to a file -- VERY SLOW!!!
1617     " should be OK on UNIX and Win32 (not the 95/98 variants)
1618     elseif g:miniBufExplorerDebugMode == 2
1619         if has('system') || has('fork')
1620             if has('win32') && !has('win95')
1621                 let l:result = system("cmd /c 'echo ".s:debugIndex.':'.a:level.':'.a:msg." >> MiniBufExplorer.DBG'")
1622             endif
1623             if has('unix')
1624                 let l:result = system("echo '".s:debugIndex.':'.a:level.':'.a:msg." >> MiniBufExplorer.DBG'")
1625             endif
1626         else
1627             call confirm('Error in file writing version of the debugging code, vim not compiled with system or fork. Dissabling MiniBufExplorer debugging.', 'OK')
1628             let g:miniBufExplorerDebugLevel = 0
1629         endif
1630     elseif g:miniBufExplorerDebugMode == 3
1631         let g:miniBufExplorerDebugOutput = g:miniBufExplorerDebugOutput."\n".s:debugIndex.':'.a:level.':'.a:msg
1632     endif
1633     let s:debugIndex = s:debugIndex + 1
1634
1635     let &report  = l:save_rep
1636     let &showcmd = l:save_sc
1637
1638   endif
1639
1640 endfunc " }}}
1641
1642 " MBE Script History {{{
1643 "=============================================================================
1644 "
1645 "      History: 6.3.2 o For some reason there was still a call to StopExplorer
1646 "                       with 2 params. Very old bug. I know I fixed before, 
1647 "                       any way many thanks to Jason Mills for reporting this!
1648 "               6.3.1 o Include folds in source so that it's easier to 
1649 "                       navigate.
1650 "                     o Added g:miniBufExplForceSyntaxEnable setting for folks
1651 "                       that want a :syntax enable to be called when we enter 
1652 "                       buffers. This can resolve issues caused by a vim bug
1653 "                       where buffers show up without highlighting when another 
1654 "                       buffer has been closed, quit, wiped or deleted.
1655 "               6.3.0 o Added an option to allow single click (rather than
1656 "                       the default double click) to select buffers in the
1657 "                       MBE window. This feature was requested by AW Law
1658 "                       and was inspired by taglist.vim. Note that you will 
1659 "                       need the latest version of taglist.vim if you want to 
1660 "                       use MBE and taglist both with singleclick turned on.
1661 "                       Also thanks to AW Law for pointing out that you can
1662 "                       make an Explorer not be listed in a standard :ls.
1663 "                     o Added the ability to have your tabs show up in a
1664 "                       vertical window rather than the standard horizontal
1665 "                       one. Just let g:miniBufExplVSplit = <width> in your
1666 "                       .vimrc and your will get this functionality.
1667 "                     o If you use the vertical explorer and you want it to
1668 "                       autosize then let g:miniBufExplMaxSize = <max width>
1669 "                       in your .vimrc. You may use the MinSize letting in
1670 "                       addition to the MaxLetting if you don't want a super
1671 "                       thin window.
1672 "                     o g:miniBufExplMaxHeight was renamed g:miniBufExplMaxSize
1673 "                       g:miniBufExplMinHeight was renamed g:miniBufExplMinSize
1674 "                       the old settings are backwards compatible if you don't
1675 "                       use the new settings, but they are depreciated.
1676 "               6.2.8 o Add an option to stop MBE from targeting non-modifiable
1677 "                       buffers when switching buffers. Thanks to AW Law for
1678 "                       the inspiration for this. This may not work if a user
1679 "                       has lots of explorer/help windows open.
1680 "               6.2.7 o Very minor bug fix for people who want to set
1681 "                       loaded_minibufexplorer in their .vimrc in order to
1682 "                       stop MBE from loading. 99.99% of users do not need
1683 "                       this update.
1684 "               6.2.6 o Moved history to end of source file
1685 "                     o Updated highlighting documentation
1686 "                     o Created global commands MBEbn and MBEbp that can be 
1687 "                       used in mappings if folks want to cycle buffers while 
1688 "                       skipping non-eligible buffers.
1689 "               6.2.5 o Added <Leader>mbt key mapping which will toggle
1690 "                       the MBE window. I map this to F3 in my .vimrc
1691 "                       with "map <F3> :TMiniBufExplorer<CR>" which 
1692 "                       means I can easily close the MBE window when I'm 
1693 "                       not using it and get it back when I want it.
1694 "                     o Changed default debug mode to 3 (write to global
1695 "                       g:miniBufExplorerDebugOutput)
1696 "                     o Made a pass through the documentation to clarify 
1697 "                       serveral issues and provide more complete docs
1698 "                       for mappings and commands.
1699 "               6.2.4 o Because of the autocommand switch (see 6.2.0) it 
1700 "                       was possible to remove the restriction on the
1701 "                       :set hidden option. It is now possible to use
1702 "                       this option with MBE.
1703 "               6.2.3 o Added miniBufExplTabWrap option. It is turned 
1704 "                       off by default. When turned on spaces are added
1705 "                       between tabs and gq} is issued to perform line
1706 "                       formatting. This won't work very well if filenames
1707 "                       contain spaces. It would be pretty easy to write
1708 "                       my own formatter, but I'm too lazy, so if someone
1709 "                       really needs that feature I'll add it :)
1710 "               6.2.2 o Changed the way the g:miniBufExplorerMoreThanOne
1711 "                       global is handled. You can set this to the number
1712 "                       of eligible buffers you want to be loaded before
1713 "                       the MBE window is loaded. Setting it to 0 causes
1714 "                       the MBE window to be opened even if there are no
1715 "                       buffers. Setting it to 4 causes the window to stay
1716 "                       closed until the 4th eligible buffer is loaded.
1717 "                     o Added a MinHeight option. This is nice if you want
1718 "                       the MBE window to always take the same amount of
1719 "                       space. For example set MaxSize and MinSize to 2
1720 "                       and set MoreThanOne to 0 and you will always have
1721 "                       a 2 row (plus the ruler :) MBE window.
1722 "                       NOTE: in 6.3.0 we started using MinSize instead of
1723 "                       Minheight. This will still work if MinSize is not
1724 "                       specified, but it is depreciated. Use MinSize instead.
1725 "                     o I now setlocal foldcomun=0 and nonumber in the MBE 
1726 "                       window. This is for those of you that like to have
1727 "                       these options turned on locally. I'm assuming noone
1728 "                       outthere wants foldcolumns and line numbers in the
1729 "                       MBE window? :)
1730 "                     o Fixed a bug where an empty MBE window was taking half
1731 "                       of the screen (partly why the MinHeight option was 
1732 "                       added.)
1733 "               6.2.1 o If MBE is the only window (because of :bd for example)
1734 "                       and there are still eligible buffers then one of them
1735 "                       will be displayed.
1736 "                     o The <Leader>mbe mapping now highlights the buffer from
1737 "                       the current window.
1738 "                     o The delete ('d') binding in the MBE window now restors
1739 "                       the cursor position, which can help if you want to 
1740 "                       delete several buffers in a row that are not at the
1741 "                       beginning of the buffer list.
1742 "                     o Added a new key binding ('p') in the MBE window to 
1743 "                       switch to the previous window (last edit window)
1744 "               6.2.0 o Major overhaul of autocommand and list updating code,
1745 "                       we now have much better handling of :bd (which is the 
1746 "                       most requested feature.) As well as resolving other
1747 "                       issues where the buffer list would not be updated
1748 "                       automatically. The old version tried to trap specific
1749 "                       events, this one just updates frequently, but it keeps
1750 "                       track and only changes the screen if there has been
1751 "                       a change.
1752 "                     o Added g:miniBufExplMaxHeight variable so you can keep
1753 "                       the -MiniBufExplorer- window small when you have lots
1754 "                       of buffers (or buffers with long names :)
1755 "                       NOTE: in 6.3.0 we started using MaxSize instead of
1756 "                       MaxHeight. This will still work if MaxSize is not
1757 "                       specified, but it is depreciated. Use MaxSize instead.
1758 "                     o Improvement to internal syntax highlighting code
1759 "                       I renamed the syntax group names. Anyone who has 
1760 "                       figured out how to use them already shouldn't have
1761 "                       any trouble with the new Nameing :)
1762 "                     o Added debug mode 3 which writes to a global variable
1763 "                       this is fast and doesn't mess with the buffer/window
1764 "                       lists.
1765 "               6.1.0 o <Leader>mbc was failing because I was calling one of
1766 "                       my own functions with the wrong number of args. :(
1767 "                       Thanks to Gerry Patterson for finding this!
1768 "                       This code is very stable (although it has some
1769 "                       idiocyncracies.)
1770 "               6.0.9 o Double clicking tabs was overwriting the cliboard 
1771 "                       register on MS Windows.  Thanks to Shoeb Bhinderwala 
1772 "                       for reporting this issue.
1773 "               6.0.8 o Apparently some VIM builds are having a hard time with
1774 "                       line continuation in scripts so the few that were here
1775 "                       have been removed.
1776 "                     o Generalized FindExplorer and FindCreateExplorer so
1777 "                       that they can be used for the debug window. Renaming
1778 "                       to FindWindow and FindCreateWindow.
1779 "                     o Updated debugging code so that debug output is put into
1780 "                       a buffer which can then be written to disk or emailed
1781 "                       to me when someone is having a major issue. Can also
1782 "                       write directly to a file (VERY SLOWLY) on UNIX or Win32
1783 "                       (not 95 or 98 at the moment) or use VIM's echo function 
1784 "                       to display the output to the screen.
1785 "                     o Several people have had issues when the hidden option 
1786 "                       is turned on. So I have put in several checks to make
1787 "                       sure folks know this if they try to use MBE with this
1788 "                       option set.
1789 "               6.0.7 o Handling BufDelete autocmd so that the UI updates 
1790 "                       properly when using :bd (rather than going through 
1791 "                       the MBE UI.)
1792 "                     o The AutoUpdate code will now close the MBE window when 
1793 "                       there is a single eligible buffer available.
1794 "                       This has the usefull side effect of stopping the MBE
1795 "                       window from blocking the VIM session open when you close 
1796 "                       the last buffer.
1797 "                     o Added functions, commands and maps to close & update
1798 "                       the MBE window (<leader>mbc and <leader>mbu.)
1799 "                     o Made MBE open/close state be sticky if set through
1800 "                       StartExplorer(1) or StopExplorer(1), which are 
1801 "                       called from the standard mappings. So if you close
1802 "                       the mbe window with \mbc it won't be automatically 
1803 "                       opened again unless you do a \mbe (or restart VIM).
1804 "                     o Removed spaces between "tabs" (even more mini :)
1805 "                     o Simplified MBE tab processing 
1806 "               6.0.6 o Fixed register overwrite bug found by S├ębastien Pierre
1807 "               6.0.5 o Fixed an issue with window sizing when we run out of 
1808 "                       buffers.  
1809 "                     o Fixed some weird commenting bugs.  
1810 "                     o Added more optional fancy window/buffer navigation:
1811 "                     o You can turn on the capability to use control and the 
1812 "                       arrow keys to move between windows.
1813 "                     o You can turn on the ability to use <C-TAB> and 
1814 "                       <C-S-TAB> to open the next and previous (respectively) 
1815 "                       buffer in the current window.
1816 "                     o You can turn on the ability to use <C-TAB> and 
1817 "                       <C-S-TAB> to switch windows (forward and backwards 
1818 "                       respectively.)
1819 "               6.0.4 o Added optional fancy window navigation: 
1820 "                     o Holding down control and pressing a vim direction 
1821 "                       [hjkl] will switch windows in the indicated direction.
1822 "               6.0.3 o Changed buffer name to -MiniBufExplorer- to resolve
1823 "                       Issue in filename pattern matching on Windows.
1824 "               6.0.2 o 2 Changes requested by Suresh Govindachar:
1825 "                     o Added SplitToEdge option and set it on by default
1826 "                     o Added tab and shift-tab mappings in [MBE] window
1827 "               6.0.1 o Added MoreThanOne option and set it on by default
1828 "                       MiniBufExplorer will not automatically open until
1829 "                       more than one eligible buffers are opened. This
1830 "                       reduces cluter when you are only working on a
1831 "                       single file. 
1832 "                       NOTE: See change log for 6.2.2 for more details about 
1833 "                             this feature
1834 "               6.0.0 o Initial Release on November 20, 2001
1835 "
1836 "=============================================================================
1837 " }}}
1838 " vim:ft=vim:fdm=marker:ff=unix:nowrap:tabstop=4:shiftwidth=4:softtabstop=4:smarttab:shiftround:expandtab