" Mini Buffer Explorer <minibufexpl.vim> " " HINT: Type zR if you don't know how to use folds " " Script Info and Documentation {{{ "============================================================================= " Copyright: Copyright (C) 2002 & 2003 Bindu Wavell " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, " minibufexplorer.vim is provided *as is* and comes with no " warranty of any kind, either expressed or implied. In no " event will the copyright holder be liable for any damamges " resulting from the use of this software. " " Name Of File: minibufexpl.vim " Description: Mini Buffer Explorer Vim Plugin " Maintainer: Bindu Wavell <bindu@wavell.net> " URL: http://vim.sourceforge.net/scripts/script.php?script_id=159 " Last Change: Sunday, June 21, 2004 " Version: 6.3.2 " Derived from Jeff Lanzarotta's bufexplorer.vim version 6.0.7 " Jeff can be reached at (jefflanzarotta@yahoo.com) and the " original plugin can be found at: " http://lanzarotta.tripod.com/vim/plugin/6/bufexplorer.vim.zip " " Usage: Normally, this file should reside in the plugins " directory and be automatically sourced. If not, you must " manually source this file using ':source minibufexplorer.vim'. " " You may use the default keymappings of " " <Leader>mbe - Opens MiniBufExplorer " " or you may want to add something like the following " key mapping to your _vimrc/.vimrc file. " " map <Leader>b :MiniBufExplorer<cr> " " However, in most cases you won't need any key-bindings at all. " " <Leader> is usually backslash so type "\mbe" (quickly) to open " the -MiniBufExplorer- window. " " Other keymappings include: <Leader>mbc to close the Explorer " window, <Leader>mbu to force the Explorer to Update and " <Leader>mbt to toggle the Explorer window; it will open if " closed or close if open. Each of these key bindings can be " overridden (see the notes on <Leader>mbe above.) " " You can map these additional commands as follows: " " map <Leader>c :CMiniBufExplorer<cr> " map <Leader>u :UMiniBufExplorer<cr> " map <Leader>t :TMiniBufExplorer<cr> " " NOTE: you can change the key binding used in these mappings " so that they fit with your configuration of vim. " " You can also call each of these features by typing the " following in command mode: " " :MiniBufExplorer " Open and/or goto Explorer " :CMiniBufExplorer " Close the Explorer if it's open " :UMiniBufExplorer " Update Explorer without navigating " :TMiniBufExplorer " Toggle the Explorer window open and " closed. " " To control where the new split window goes relative to the " current window, use the setting: " " let g:miniBufExplSplitBelow=0 " Put new window above " " current or on the " " left for vertical split " let g:miniBufExplSplitBelow=1 " Put new window below " " current or on the " " right for vertical split " " The default for this is read from the &splitbelow VIM option. " " By default we are now (as of 6.0.2) forcing the -MiniBufExplorer- " window to open up at the edge of the screen. You can turn this " off by setting the following variable in your .vimrc: " " let g:miniBufExplSplitToEdge = 0 " " If you would like a vertical explorer you can assign the column " width (in characters) you want for your explorer window with the " following .vimrc variable (this was introduced in 6.3.0): " " let g:miniBufExplVSplit = 20 " column width in chars " " IN HORIZONTAL MODE: " It is now (as of 6.1.1) possible to set a maximum height for " the -MiniBufExplorer- window. You can set the max height by " letting the following variable in your .vimrc: " " let g:miniBufExplMaxSize = <max lines: defualt 0> " " setting this to 0 will mean the window gets as big as " needed to fit all your buffers. " " NOTE: This was g:miniBufExplMaxHeight before 6.3.0; the old " setting is backwards compatible if you don't use MaxSize. " " As of 6.2.2 it is possible to set a minimum height for the " -MiniBufExplorer- window. You can set the min height by " letting the following variable in your .vimrc: " " let g:miniBufExplMinSize = <min height: default 1> " " NOTE: This was g:miniBufExplMinHeight before 6.3.0; the old " setting is backwards compatible if you don't use MinSize. " " IN VERTICAL MODE: (as of 6.3.0) " By default the vertical explorer has a fixed width. If you put: " " let g:miniBufExplMaxSize = <max width: default 0> " " into your .vimrc then MBE will attempt to set the width of the " MBE window to be as wide as your widest tab. The width will not " exceed MaxSize even if you have wider tabs. " " Accepting the default value of 0 for this will give you a fixed " width MBE window. " " You can specify a MinSize for the vertical explorer window by " putting the following in your .vimrc: " " let g:miniBufExplMinSize = <min width: default 1> " " This will have no effect unless you also specivy MaxSize. " " By default we are now (as of 6.0.1) turning on the MoreThanOne " option. This stops the -MiniBufExplorer- from opening " automatically until more than one eligible buffer is available. " You can turn this feature off by setting the following variable " in your .vimrc: " " let g:miniBufExplorerMoreThanOne=1 " " (The following enhancement is as of 6.2.2) " Setting this to 0 will cause the MBE window to be loaded even " if no buffers are available. Setting it to 1 causes the MBE " window to be loaded as soon as an eligible buffer is read. You " can also set it to larger numbers. So if you set it to 4 for " example the MBE window wouldn't auto-open until 4 eligibles " buffers had been loaded. This is nice for folks that don't " want an MBE window unless they are editing more than two or " three buffers. " " To enable the optional mapping of Control + Vim Direction Keys " [hjkl] to window movement commands, you can put the following into " your .vimrc: " " let g:miniBufExplMapWindowNavVim = 1 " " To enable the optional mapping of Control + Arrow Keys to window " movement commands, you can put the following into your .vimrc: " " let g:miniBufExplMapWindowNavArrows = 1 " " To enable the optional mapping of <C-TAB> and <C-S-TAB> to a " function that will bring up the next or previous buffer in the " current window, you can put the following into your .vimrc: " " let g:miniBufExplMapCTabSwitchBufs = 1 " " To enable the optional mapping of <C-TAB> and <C-S-TAB> to mappings " that will move to the next and previous (respectively) window, you " can put the following into your .vimrc: " " let g:miniBufExplMapCTabSwitchWindows = 1 " " " NOTE: If you set the ...TabSwitchBufs AND ...TabSwitchWindows, " ...TabSwitchBufs will be enabled and ...TabSwitchWindows " will not. " " As of MBE 6.3.0, you can put the following into your .vimrc: " " let g:miniBufExplUseSingleClick = 1 " " If you would like to single click on tabs rather than double " clicking on them to goto the selected buffer. " " NOTE: If you use the single click option in taglist.vim you may " need to get an updated version that includes a patch I " provided to allow both explorers to provide single click " buffer selection. " " It is possible to customize the the highlighting for the tabs in " the MBE by configuring the following highlighting groups: " " MBENormal - for buffers that have NOT CHANGED and " are NOT VISIBLE. " MBEChanged - for buffers that HAVE CHANGED and are " NOT VISIBLE " MBEVisibleNormal - buffers that have NOT CHANGED and are " VISIBLE " MBEVisibleChanged - buffers that have CHANGED and are VISIBLE " " You can either link to an existing highlighting group by " adding a command like: " " hi link MBEVisibleChanged Error " " to your .vimrc or you can specify exact foreground and background " colors using the following syntax: " " hi MBEChanged guibg=darkblue ctermbg=darkblue termbg=white " " NOTE: If you set a colorscheme in your .vimrc you should do it " BEFORE updating the MBE highlighting groups. " " If you use other explorers like TagList you can (As of 6.2.8) put: " " let g:miniBufExplModSelTarget = 1 " " into your .vimrc in order to force MBE to try to place selected " buffers into a window that does not have a nonmodifiable buffer. " The upshot of this should be that if you go into MBE and select " a buffer, the buffer should not show up in a window that is " hosting an explorer. " " There is a VIM bug that can cause buffers to show up without " their highlighting. The following setting will cause MBE to " try and turn highlighting back on (introduced in 6.3.1): " " let g:miniBufExplForceSyntaxEnable = 1 " " MBE has had a basic debugging capability for quite some time. " However, it has not been very friendly in the past. As of 6.0.8, " you can put one of each of the following into your .vimrc: " " let g:miniBufExplorerDebugLevel = 0 " MBE serious errors output " let g:miniBufExplorerDebugLevel = 4 " MBE all errors output " let g:miniBufExplorerDebugLevel = 10 " MBE reports everything " " You can also set a DebugMode to cause output to be target as " follows (default is mode 3): " " let g:miniBufExplorerDebugMode = 0 " Errors will show up in " " a vim window " let g:miniBufExplorerDebugMode = 1 " Uses VIM's echo function " " to display on the screen " let g:miniBufExplorerDebugMode = 2 " Writes to a file " " MiniBufExplorer.DBG " let g:miniBufExplorerDebugMode = 3 " Store output in global: " " g:miniBufExplorerDebugOutput " " Or if you are able to start VIM, you might just perform these " at a command prompt right before you do the operation that is " failing. " " History: Moved to end of file " " Known Issues: When debugging is turned on and set to output to a window, there " are some cases where the window is opened more than once, there " are other cases where an old debug window can be lost. " " Several MBE commands can break the window history so <C-W>[pnw] " might not take you to the expected window. " " Todo: Add the ability to specify a regexp for eligible buffers " allowing the ability to filter out certain buffers that " you don't want to control from MBE " "============================================================================= " }}} " Startup Check " " Has this plugin already been loaded? {{{ " if exists('loaded_minibufexplorer') finish endif let loaded_minibufexplorer = 1 " }}} " Mappings and Commands " " MBE Keyboard Mappings {{{ " If we don't already have keyboard mappings for MBE then create them " if !hasmapto('<Plug>MiniBufExplorer') map <unique> <Leader>mbe <Plug>MiniBufExplorer endif if !hasmapto('<Plug>CMiniBufExplorer') map <unique> <Leader>mbc <Plug>CMiniBufExplorer endif if !hasmapto('<Plug>UMiniBufExplorer') map <unique> <Leader>mbu <Plug>UMiniBufExplorer endif if !hasmapto('<Plug>TMiniBufExplorer') map <unique> <Leader>mbt <Plug>TMiniBufExplorer endif " }}} " MBE <Script> internal map {{{ " noremap <unique> <script> <Plug>MiniBufExplorer :call <SID>StartExplorer(1, -1)<CR>:<BS> noremap <unique> <script> <Plug>CMiniBufExplorer :call <SID>StopExplorer(1)<CR>:<BS> noremap <unique> <script> <Plug>UMiniBufExplorer :call <SID>AutoUpdate(-1)<CR>:<BS> noremap <unique> <script> <Plug>TMiniBufExplorer :call <SID>ToggleExplorer()<CR>:<BS> " }}} " MBE commands {{{ " if !exists(':MiniBufExplorer') command! MiniBufExplorer call <SID>StartExplorer(1, -1) endif if !exists(':CMiniBufExplorer') command! CMiniBufExplorer call <SID>StopExplorer(1) endif if !exists(':UMiniBufExplorer') command! UMiniBufExplorer call <SID>AutoUpdate(-1) endif if !exists(':TMiniBufExplorer') command! TMiniBufExplorer call <SID>ToggleExplorer() endif if !exists(':MBEbn') command! MBEbn call <SID>CycleBuffer(1) endif if !exists(':MBEbp') command! MBEbp call <SID>CycleBuffer(0) endif " }}} " Global Configuration Variables " " Debug Level {{{ " " 0 = no logging " 1=5 = errors ; 1 is the most important " 5-9 = info ; 5 is the most important " 10 = Entry/Exit if !exists('g:miniBufExplorerDebugLevel') let g:miniBufExplorerDebugLevel = 0 endif " }}} " Debug Mode {{{ " " 0 = debug to a window " 1 = use vim's echo facility " 2 = write to a file named MiniBufExplorer.DBG " in the directory where vim was started " THIS IS VERY SLOW " 3 = Write into g:miniBufExplorerDebugOutput " global variable [This is the default] if !exists('g:miniBufExplorerDebugMode') let g:miniBufExplorerDebugMode = 3 endif " }}} " Allow auto update? {{{ " " We start out with this off for startup, but once vim is running we " turn this on. if !exists('g:miniBufExplorerAutoUpdate') let g:miniBufExplorerAutoUpdate = 0 endif " }}} " MoreThanOne? {{{ " Display Mini Buf Explorer when there are 'More Than One' eligible buffers " if !exists('g:miniBufExplorerMoreThanOne') let g:miniBufExplorerMoreThanOne = 2 endif " }}} " Split below/above/left/right? {{{ " When opening a new -MiniBufExplorer- window, split the new windows below or " above the current window? 1 = below, 0 = above. " if !exists('g:miniBufExplSplitBelow') let g:miniBufExplSplitBelow = &splitbelow endif " }}} " Split to edge? {{{ " When opening a new -MiniBufExplorer- window, split the new windows to the " full edge? 1 = yes, 0 = no. " if !exists('g:miniBufExplSplitToEdge') let g:miniBufExplSplitToEdge = 1 endif " }}} " MaxHeight (depreciated) {{{ " When sizing the -MiniBufExplorer- window, assign a maximum window height. " 0 = size to fit all buffers, otherwise the value is number of lines for " buffer. [Depreciated use g:miniBufExplMaxSize] " if !exists('g:miniBufExplMaxHeight') let g:miniBufExplMaxHeight = 0 endif " }}} " MaxSize {{{ " Same as MaxHeight but also works for vertical splits if specified with a " vertical split then vertical resizing will be performed. If left at 0 " then the number of columns in g:miniBufExplVSplit will be used as a " static window width. if !exists('g:miniBufExplMaxSize') let g:miniBufExplMaxSize = g:miniBufExplMaxHeight endif " }}} " MinHeight (depreciated) {{{ " When sizing the -MiniBufExplorer- window, assign a minumum window height. " the value is minimum number of lines for buffer. Setting this to zero can " cause strange height behavior. The default value is 1 [Depreciated use " g:miniBufExplMinSize] " if !exists('g:miniBufExplMinHeight') let g:miniBufExplMinHeight = 1 endif " }}} " MinSize {{{ " Same as MinHeight but also works for vertical splits. For vertical splits, " this is ignored unless g:miniBufExplMax(Size|Height) are specified. if !exists('g:miniBufExplMinSize') let g:miniBufExplMinSize = g:miniBufExplMinHeight endif " }}} " Horizontal or Vertical explorer? {{{ " For folks that like vertical explorers, I'm caving in and providing for " veritcal splits. If this is set to 0 then the current horizontal " splitting logic will be run. If however you want a vertical split, " assign the width (in characters) you wish to assign to the MBE window. " if !exists('g:miniBufExplVSplit') let g:miniBufExplVSplit = 0 endif " }}} " TabWrap? {{{ " By default line wrap is used (possibly breaking a tab name between two " lines.) Turning this option on (setting it to 1) can take more screen " space, but will make sure that each tab is on one and only one line. " if !exists('g:miniBufExplTabWrap') let g:miniBufExplTabWrap = 0 endif " }}} " Extended window navigation commands? {{{ " Global flag to turn extended window navigation commands on or off " enabled = 1, dissabled = 0 " if !exists('g:miniBufExplMapWindowNav') " This is for backwards compatibility and may be removed in a " later release, please use the ...NavVim and/or ...NavArrows " settings. let g:miniBufExplMapWindowNav = 0 endif if !exists('g:miniBufExplMapWindowNavVim') let g:miniBufExplMapWindowNavVim = 0 endif if !exists('g:miniBufExplMapWindowNavArrows') let g:miniBufExplMapWindowNavArrows = 0 endif if !exists('g:miniBufExplMapCTabSwitchBufs') let g:miniBufExplMapCTabSwitchBufs = 0 endif " Notice: that if CTabSwitchBufs is turned on then " we turn off CTabSwitchWindows. if g:miniBufExplMapCTabSwitchBufs == 1 || !exists('g:miniBufExplMapCTabSwitchWindows') let g:miniBufExplMapCTabSwitchWindows = 0 endif " " If we have enabled control + vim direction key remapping " then perform the remapping " " Notice: I left g:miniBufExplMapWindowNav in for backward " compatibility. Eventually this mapping will be removed so " please use the newer g:miniBufExplMapWindowNavVim setting. if g:miniBufExplMapWindowNavVim || g:miniBufExplMapWindowNav noremap <C-J> <C-W>j noremap <C-K> <C-W>k noremap <C-H> <C-W>h noremap <C-L> <C-W>l endif " " If we have enabled control + arrow key remapping " then perform the remapping " if g:miniBufExplMapWindowNavArrows noremap <C-Down> <C-W>j noremap <C-Up> <C-W>k noremap <C-Left> <C-W>h noremap <C-Right> <C-W>l endif " If we have enabled <C-TAB> and <C-S-TAB> to switch buffers " in the current window then perform the remapping " if g:miniBufExplMapCTabSwitchBufs noremap <C-TAB> :call <SID>CycleBuffer(1)<CR>:<BS> noremap <C-S-TAB> :call <SID>CycleBuffer(0)<CR>:<BS> endif " " If we have enabled <C-TAB> and <C-S-TAB> to switch windows " then perform the remapping " if g:miniBufExplMapCTabSwitchWindows noremap <C-TAB> <C-W>w noremap <C-S-TAB> <C-W>W endif " }}} " Modifiable Select Target {{{ " if !exists('g:miniBufExplModSelTarget') let g:miniBufExplModSelTarget = 0 endif "}}} " Force Syntax Enable {{{ " if !exists('g:miniBufExplForceSyntaxEnable') let g:miniBufExplForceSyntaxEnable = 0 endif " }}} " Single/Double Click? {{{ " flag that can be set to 1 in a users .vimrc to allow " single click switching of tabs. By default we use " double click for tab selection. " if !exists('g:miniBufExplUseSingleClick') let g:miniBufExplUseSingleClick = 0 endif " " attempt to perform single click mapping, it would be much " nicer if we could nnoremap <buffer> ... however vim does " not fire the <buffer> <leftmouse> when you use the mouse " to enter a buffer. " if g:miniBufExplUseSingleClick == 1 let s:clickmap = ':if bufname("%") == "-MiniBufExplorer-" <bar> call <SID>MBEClick() <bar> endif <CR>' if maparg('<LEFTMOUSE>', 'n') == '' " no mapping for leftmouse exec ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>' . s:clickmap else " we have a mapping let g:miniBufExplDoneClickSave = 1 let s:m = ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>' let s:m = s:m . substitute(substitute(maparg('<LEFTMOUSE>', 'n'), '|', '<bar>', 'g'), '\c^<LEFTMOUSE>', '', '') let s:m = s:m . s:clickmap exec s:m endif endif " }}} " Variables used internally " " Script/Global variables {{{ " Global used to store the buffer list so we don't update the " UI unless the list has changed. if !exists('g:miniBufExplBufList') let g:miniBufExplBufList = '' endif " Variable used as a mutex so that we don't do lots " of AutoUpdates at the same time. if !exists('g:miniBufExplInAutoUpdate') let g:miniBufExplInAutoUpdate = 0 endif " In debug mode 3 this variable will hold the debug output if !exists('g:miniBufExplorerDebugOutput') let g:miniBufExplorerDebugOutput = '' endif " In debug mode 3 this variable will hold the debug output if !exists('g:miniBufExplForceDisplay') let g:miniBufExplForceDisplay = 0 endif " Variable used to pass maxTabWidth info between functions let s:maxTabWidth = 0 " Variable used to count debug output lines let s:debugIndex = 0 " }}} " Setup an autocommand group and some autocommands {{{ " that keep our explorer updated automatically. " augroup MiniBufExplorer autocmd MiniBufExplorer BufDelete * call <SID>DEBUG('-=> BufDelete AutoCmd', 10) |call <SID>AutoUpdate(expand('<abuf>')) autocmd MiniBufExplorer BufEnter * call <SID>DEBUG('-=> BufEnter AutoCmd', 10) |call <SID>AutoUpdate(-1) autocmd MiniBufExplorer VimEnter * call <SID>DEBUG('-=> VimEnter AutoCmd', 10) |let g:miniBufExplorerAutoUpdate = 1 |call <SID>AutoUpdate(-1) " }}} " Functions " " StartExplorer - Sets up our explorer and causes it to be displayed {{{ " function! <SID>StartExplorer(sticky, delBufNum) call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering StartExplorer()' ,10) call <SID>DEBUG('===========================',10) if a:sticky == 1 let g:miniBufExplorerAutoUpdate = 1 endif " Store the current buffer let l:curBuf = bufnr('%') " Prevent a report of our actions from showing up. let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd call <SID>FindCreateWindow('-MiniBufExplorer-', -1, 1, 1) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('StartExplorer called in invalid window',1) let &report = l:save_rep let &showcmd = l:save_sc return endif " !!! We may want to make the following optional -- Bindu " New windows don't cause all windows to be resized to equal sizes set noequalalways " !!! We may want to make the following optional -- Bindu " We don't want the mouse to change focus without a click set nomousefocus " If folks turn numbering and columns on by default we will turn " them off for the MBE window setlocal foldcolumn=0 setlocal nonumber if has("syntax") syn clear syn match MBENormal '\[[^\]]*\]' syn match MBEChanged '\[[^\]]*\]+' syn match MBEVisibleNormal '\[[^\]]*\]\*+\=' syn match MBEVisibleChanged '\[[^\]]*\]\*+' if !exists("g:did_minibufexplorer_syntax_inits") let g:did_minibufexplorer_syntax_inits = 1 hi def link MBENormal Comment hi def link MBEChanged String hi def link MBEVisibleNormal Special hi def link MBEVisibleChanged Special endif endif " If you press return in the -MiniBufExplorer- then try " to open the selected buffer in the previous window. nnoremap <buffer> <CR> :call <SID>MBESelectBuffer()<CR>:<BS> " If you DoubleClick in the -MiniBufExplorer- then try " to open the selected buffer in the previous window. nnoremap <buffer> <2-LEFTMOUSE> :call <SID>MBEDoubleClick()<CR>:<BS> " If you press d in the -MiniBufExplorer- then try to " delete the selected buffer. nnoremap <buffer> d :call <SID>MBEDeleteBuffer()<CR>:<BS> " If you press w in the -MiniBufExplorer- then switch back " to the previous window. nnoremap <buffer> p :wincmd p<CR>:<BS> " The following allow us to use regular movement keys to " scroll in a wrapped single line buffer nnoremap <buffer> j gj nnoremap <buffer> k gk nnoremap <buffer> <down> gj nnoremap <buffer> <up> gk " The following allows for quicker moving between buffer " names in the [MBE] window it also saves the last-pattern " and restores it. nnoremap <buffer> <TAB> :call search('\[[0-9]*:[^\]]*\]')<CR>:<BS> nnoremap <buffer> <S-TAB> :call search('\[[0-9]*:[^\]]*\]','b')<CR>:<BS> call <SID>DisplayBuffers(a:delBufNum) if (l:curBuf != -1) call search('\['.l:curBuf.':'.expand('#'.l:curBuf.':t').'\]') else call <SID>DEBUG('No current buffer to search for',9) endif let &report = l:save_rep let &showcmd = l:save_sc call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed StartExplorer()' ,10) call <SID>DEBUG('===========================',10) endfunction " }}} " StopExplorer - Looks for our explorer and closes the window if it is open {{{ " function! <SID>StopExplorer(sticky) call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering StopExplorer()' ,10) call <SID>DEBUG('===========================',10) if a:sticky == 1 let g:miniBufExplorerAutoUpdate = 0 endif let l:winNum = <SID>FindWindow('-MiniBufExplorer-', 1) if l:winNum != -1 exec l:winNum.' wincmd w' silent! close wincmd p endif call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed StopExplorer()' ,10) call <SID>DEBUG('===========================',10) endfunction " }}} " ToggleExplorer - Looks for our explorer and opens/closes the window {{{ " function! <SID>ToggleExplorer() call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering ToggleExplorer()' ,10) call <SID>DEBUG('===========================',10) let g:miniBufExplorerAutoUpdate = 0 let l:winNum = <SID>FindWindow('-MiniBufExplorer-', 1) if l:winNum != -1 call <SID>StopExplorer(1) else call <SID>StartExplorer(1, -1) wincmd p endif call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed ToggleExplorer()' ,10) call <SID>DEBUG('===========================',10) endfunction " }}} " FindWindow - Return the window number of a named buffer {{{ " If none is found then returns -1. " function! <SID>FindWindow(bufName, doDebug) if a:doDebug call <SID>DEBUG('Entering FindWindow()',10) endif " Try to find an existing window that contains " our buffer. let l:bufNum = bufnr(a:bufName) if l:bufNum != -1 if a:doDebug call <SID>DEBUG('Found buffer ('.a:bufName.'): '.l:bufNum,9) endif let l:winNum = bufwinnr(l:bufNum) else let l:winNum = -1 endif return l:winNum endfunction " }}} " FindCreateWindow - Attempts to find a window for a named buffer. {{{ " " If it is found then moves there. Otherwise creates a new window and " configures it and moves there. " " forceEdge, -1 use defaults, 0 below, 1 above " isExplorer, 0 no, 1 yes " doDebug, 0 no, 1 yes " function! <SID>FindCreateWindow(bufName, forceEdge, isExplorer, doDebug) if a:doDebug call <SID>DEBUG('Entering FindCreateWindow('.a:bufName.')',10) endif " Save the user's split setting. let l:saveSplitBelow = &splitbelow " Set to our new values. let &splitbelow = g:miniBufExplSplitBelow " Try to find an existing explorer window let l:winNum = <SID>FindWindow(a:bufName, a:doDebug) " If found goto the existing window, otherwise " split open a new window. if l:winNum != -1 if a:doDebug call <SID>DEBUG('Found window ('.a:bufName.'): '.l:winNum,9) endif exec l:winNum.' wincmd w' let l:winFound = 1 else if g:miniBufExplSplitToEdge == 1 || a:forceEdge >= 0 let l:edge = &splitbelow if a:forceEdge >= 0 let l:edge = a:forceEdge endif if l:edge if g:miniBufExplVSplit == 0 exec 'bo sp '.a:bufName else exec 'bo vsp '.a:bufName endif else if g:miniBufExplVSplit == 0 exec 'to sp '.a:bufName else exec 'to vsp '.a:bufName endif endif else if g:miniBufExplVSplit == 0 exec 'sp '.a:bufName else " &splitbelow doesn't affect vertical splits " so we have to do this explicitly.. ugh. if &splitbelow exec 'rightb vsp '.a:bufName else exec 'vsp '.a:bufName endif endif endif let g:miniBufExplForceDisplay = 1 " Try to find an existing explorer window let l:winNum = <SID>FindWindow(a:bufName, a:doDebug) if l:winNum != -1 if a:doDebug call <SID>DEBUG('Created and then found window ('.a:bufName.'): '.l:winNum,9) endif exec l:winNum.' wincmd w' else if a:doDebug call <SID>DEBUG('FindCreateWindow failed to create window ('.a:bufName.').',1) endif return endif if a:isExplorer " Turn off the swapfile, set the buffer type so that it won't get written, " and so that it will get deleted when it gets hidden and turn on word wrap. setlocal noswapfile setlocal buftype=nofile setlocal bufhidden=delete if g:miniBufExplVSplit == 0 setlocal wrap else setlocal nowrap exec('setlocal winwidth='.g:miniBufExplMinSize) endif endif if a:doDebug call <SID>DEBUG('Window ('.a:bufName.') created: '.winnr(),9) endif endif " Restore the user's split setting. let &splitbelow = l:saveSplitBelow endfunction " }}} " DisplayBuffers - Wrapper for getting MBE window shown {{{ " " Makes sure we are in our explorer, then erases the current buffer and turns " it into a mini buffer explorer window. " function! <SID>DisplayBuffers(delBufNum) call <SID>DEBUG('Entering DisplayBuffers()',10) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('DisplayBuffers called in invalid window',1) return endif " We need to be able to modify the buffer setlocal modifiable call <SID>ShowBuffers(a:delBufNum) call <SID>ResizeWindow() normal! zz " Prevent the buffer from being modified. setlocal nomodifiable set nobuflisted endfunction " }}} " Resize Window - Set width/height of MBE window {{{ " " Makes sure we are in our explorer, then sets the height/width for our explorer " window so that we can fit all of our information without taking extra lines. " function! <SID>ResizeWindow() call <SID>DEBUG('Entering ResizeWindow()',10) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('ResizeWindow called in invalid window',1) return endif let l:width = winwidth('.') " Horizontal Resize if g:miniBufExplVSplit == 0 if g:miniBufExplTabWrap == 0 let l:length = strlen(getline('.')) let l:height = 0 if (l:width == 0) let l:height = winheight('.') else let l:height = (l:length / l:width) " handle truncation from div if (l:length % l:width) != 0 let l:height = l:height + 1 endif endif else exec("setlocal textwidth=".l:width) normal gg normal gq} normal G let l:height = line('.') normal gg endif " enforce max window height if g:miniBufExplMaxSize != 0 if g:miniBufExplMaxSize < l:height let l:height = g:miniBufExplMaxSize endif endif " enfore min window height if l:height < g:miniBufExplMinSize || l:height == 0 let l:height = g:miniBufExplMinSize endif call <SID>DEBUG('ResizeWindow to '.l:height.' lines',9) exec('resize '.l:height) " Vertical Resize else if g:miniBufExplMaxSize != 0 let l:newWidth = s:maxTabWidth if l:newWidth > g:miniBufExplMaxSize let l:newWidth = g:miniBufExplMaxSize endif if l:newWidth < g:miniBufExplMinSize let l:newWidth = g:miniBufExplMinSize endif else let l:newWidth = g:miniBufExplVSplit endif if l:width != l:newWidth call <SID>DEBUG('ResizeWindow to '.l:newWidth.' columns',9) exec('vertical resize '.l:newWidth) endif endif endfunction " }}} " ShowBuffers - Clear current buffer and put the MBE text into it {{{ " " Makes sure we are in our explorer, then adds a list of all modifiable " buffers to the current buffer. Special marks are added for buffers that " are in one or more windows (*) and buffers that have been modified (+) " function! <SID>ShowBuffers(delBufNum) call <SID>DEBUG('Entering ShowBuffers()',10) let l:ListChanged = <SID>BuildBufferList(a:delBufNum, 1) if (l:ListChanged == 1 || g:miniBufExplForceDisplay) let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd " Delete all lines in buffer. 1,$d _ " Goto the end of the buffer put the buffer list " and then delete the extra trailing blank line $ put! =g:miniBufExplBufList $ d _ let g:miniBufExplForceDisplay = 0 let &report = l:save_rep let &showcmd = l:save_sc else call <SID>DEBUG('Buffer list not update since there was no change',9) endif endfunction " }}} " Max - Returns the max of two numbers {{{ " function! <SID>Max(argOne, argTwo) if a:argOne > a:argTwo return a:argOne else return a:argTwo endif endfunction " }}} " BuildBufferList - Build the text for the MBE window {{{ " " Creates the buffer list string and returns 1 if it is different than " last time this was called and 0 otherwise. " function! <SID>BuildBufferList(delBufNum, updateBufList) call <SID>DEBUG('Entering BuildBufferList()',10) let l:NBuffers = bufnr('$') " Get the number of the last buffer. let l:i = 0 " Set the buffer index to zero. let l:fileNames = '' let l:maxTabWidth = 0 " Loop through every buffer less than the total number of buffers. while(l:i <= l:NBuffers) let l:i = l:i + 1 " If we have a delBufNum and it is the current " buffer then ignore the current buffer. " Otherwise, continue. if (a:delBufNum == -1 || l:i != a:delBufNum) " Make sure the buffer in question is listed. if(getbufvar(l:i, '&buflisted') == 1) " Get the name of the buffer. let l:BufName = bufname(l:i) " Check to see if the buffer is a blank or not. If the buffer does have " a name, process it. if(strlen(l:BufName)) " Only show modifiable buffers (The idea is that we don't " want to show Explorers) if (getbufvar(l:i, '&modifiable') == 1 && BufName != '-MiniBufExplorer-') " Get filename & Remove []'s & ()'s let l:shortBufName = fnamemodify(l:BufName, ":t") let l:shortBufName = substitute(l:shortBufName, '[][()]', '', 'g') let l:tab = '['.l:i.':'.l:shortBufName.']' " If the buffer is open in a window mark it if bufwinnr(l:i) != -1 let l:tab = l:tab . '*' endif " If the buffer is modified then mark it if(getbufvar(l:i, '&modified') == 1) let l:tab = l:tab . '+' endif let l:maxTabWidth = <SID>Max(strlen(l:tab), l:maxTabWidth) let l:fileNames = l:fileNames.l:tab " If horizontal and tab wrap is turned on we need to add spaces if g:miniBufExplVSplit == 0 if g:miniBufExplTabWrap != 0 let l:fileNames = l:fileNames.' ' endif " If not horizontal we need a newline else let l:fileNames = l:fileNames . "\n" endif endif endif endif endif endwhile if (g:miniBufExplBufList != l:fileNames) if (a:updateBufList) let g:miniBufExplBufList = l:fileNames let s:maxTabWidth = l:maxTabWidth endif return 1 else return 0 endif endfunction " }}} " HasEligibleBuffers - Are there enough MBE eligible buffers to open the MBE window? {{{ " " Returns 1 if there are any buffers that can be displayed in a " mini buffer explorer. Otherwise returns 0. If delBufNum is " any non -1 value then don't include that buffer in the list " of eligible buffers. " function! <SID>HasEligibleBuffers(delBufNum) call <SID>DEBUG('Entering HasEligibleBuffers()',10) let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd let l:NBuffers = bufnr('$') " Get the number of the last buffer. let l:i = 0 " Set the buffer index to zero. let l:found = 0 " No buffer found if (g:miniBufExplorerMoreThanOne > 1) call <SID>DEBUG('More Than One mode turned on',6) endif let l:needed = g:miniBufExplorerMoreThanOne " Loop through every buffer less than the total number of buffers. while(l:i <= l:NBuffers && l:found < l:needed) let l:i = l:i + 1 " If we have a delBufNum and it is the current " buffer then ignore the current buffer. " Otherwise, continue. if (a:delBufNum == -1 || l:i != a:delBufNum) " Make sure the buffer in question is listed. if (getbufvar(l:i, '&buflisted') == 1) " Get the name of the buffer. let l:BufName = bufname(l:i) " Check to see if the buffer is a blank or not. If the buffer does have " a name, process it. if (strlen(l:BufName)) " Only show modifiable buffers (The idea is that we don't " want to show Explorers) if ((getbufvar(l:i, '&modifiable') == 1) && (BufName != '-MiniBufExplorer-')) let l:found = l:found + 1 endif endif endif endif endwhile let &report = l:save_rep let &showcmd = l:save_sc call <SID>DEBUG('HasEligibleBuffers found '.l:found.' eligible buffers of '.l:needed.' needed',6) return (l:found >= l:needed) endfunction " }}} " Auto Update - Function called by auto commands for auto updating the MBE {{{ " " IF auto update is turned on AND " we are in a real buffer AND " we have enough eligible buffers THEN " Update our explorer and get back to the current window " " If we get a buffer number for a buffer that " is being deleted, we need to make sure and " remove the buffer from the list of eligible " buffers in case we are down to one eligible " buffer, in which case we will want to close " the MBE window. " function! <SID>AutoUpdate(delBufNum) call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering AutoUpdate('.a:delBufNum.') : '.bufnr('%').' : '.bufname('%'),10) call <SID>DEBUG('===========================',10) if (g:miniBufExplInAutoUpdate == 1) call <SID>DEBUG('AutoUpdate recursion stopped',9) call <SID>DEBUG('===========================',10) call <SID>DEBUG('Terminated AutoUpdate()' ,10) call <SID>DEBUG('===========================',10) return else let g:miniBufExplInAutoUpdate = 1 endif " Don't bother autoupdating the MBE window if (bufname('%') == '-MiniBufExplorer-') " If this is the only buffer left then toggle the buffer if (winbufnr(2) == -1) call <SID>CycleBuffer(1) call <SID>DEBUG('AutoUpdate does not run for cycled windows', 9) else call <SID>DEBUG('AutoUpdate does not run for the MBE window', 9) endif call <SID>DEBUG('===========================',10) call <SID>DEBUG('Terminated AutoUpdate()' ,10) call <SID>DEBUG('===========================',10) let g:miniBufExplInAutoUpdate = 0 return endif if (a:delBufNum != -1) call <SID>DEBUG('AutoUpdate will make sure that buffer '.a:delBufNum.' is not included in the buffer list.', 5) endif " Only allow updates when the AutoUpdate flag is set " this allows us to stop updates on startup. if g:miniBufExplorerAutoUpdate == 1 " Only show MiniBufExplorer if we have a real buffer if ((g:miniBufExplorerMoreThanOne == 0) || (bufnr('%') != -1 && bufname('%') != "")) if <SID>HasEligibleBuffers(a:delBufNum) == 1 " if we don't have a window then create one let l:bufnr = <SID>FindWindow('-MiniBufExplorer-', 0) if (l:bufnr == -1) call <SID>DEBUG('About to call StartExplorer (Create MBE)', 9) call <SID>StartExplorer(0, a:delBufNum) else " otherwise only update the window if the contents have " changed let l:ListChanged = <SID>BuildBufferList(a:delBufNum, 0) if (l:ListChanged) call <SID>DEBUG('About to call StartExplorer (Update MBE)', 9) call <SID>StartExplorer(0, a:delBufNum) endif endif " go back to the working buffer if (bufname('%') == '-MiniBufExplorer-') wincmd p endif else call <SID>DEBUG('Failed in eligible check', 9) call <SID>StopExplorer(0) endif " VIM sometimes turns syntax highlighting off, " we can force it on, but this may cause weird " behavior so this is an optional hack to force " syntax back on when we enter a buffer if g:miniBufExplForceSyntaxEnable call <SID>DEBUG('Enable Syntax', 9) exec 'syntax enable' endif else call <SID>DEBUG('No buffers loaded...',9) endif else call <SID>DEBUG('AutoUpdates are turned off, terminating',9) endif call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed AutoUpdate()' ,10) call <SID>DEBUG('===========================',10) let g:miniBufExplInAutoUpdate = 0 endfunction " }}} " GetSelectedBuffer - From the MBE window, return the bufnum for buf under cursor {{{ " " If we are in our explorer window then return the buffer number " for the buffer under the cursor. " function! <SID>GetSelectedBuffer() call <SID>DEBUG('Entering GetSelectedBuffer()',10) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('GetSelectedBuffer called in invalid window',1) return -1 endif let l:save_reg = @" let @" = "" normal ""yi[ if @" != "" let l:retv = substitute(@",'\([0-9]*\):.*', '\1', '') + 0 let @" = l:save_reg return l:retv else let @" = l:save_reg return -1 endif endfunction " }}} " MBESelectBuffer - From the MBE window, open buffer under the cursor {{{ " " If we are in our explorer, then we attempt to open the buffer under the " cursor in the previous window. " function! <SID>MBESelectBuffer() call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering MBESelectBuffer()' ,10) call <SID>DEBUG('===========================',10) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('MBESelectBuffer called in invalid window',1) return endif let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd let l:bufnr = <SID>GetSelectedBuffer() let l:resize = 0 if(l:bufnr != -1) " If the buffer exists. let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate let g:miniBufExplorerAutoUpdate = 0 " Switch to the previous window wincmd p " If we are in the buffer explorer or in a nonmodifiable buffer with " g:miniBufExplModSelTarget set then try another window (a few times) if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0) wincmd w if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0) wincmd w if bufname('%') == '-MiniBufExplorer-' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0) wincmd w " The following handles the case where -MiniBufExplorer- " is the only window left. We need to resize so we don't " end up with a 1 or two line buffer. if bufname('%') == '-MiniBufExplorer-' let l:resize = 1 endif endif endif endif exec('b! '.l:bufnr) if (l:resize) resize endif let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate call <SID>AutoUpdate(-1) endif let &report = l:save_rep let &showcmd = l:save_sc call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed MBESelectBuffer()',10) call <SID>DEBUG('===========================',10) endfunction " }}} " MBEDeleteBuffer - From the MBE window, delete selected buffer from list {{{ " " After making sure that we are in our explorer, This will delete the buffer " under the cursor. If the buffer under the cursor is being displayed in a " window, this routine will attempt to get different buffers into the " windows that will be affected so that windows don't get removed. " function! <SID>MBEDeleteBuffer() call <SID>DEBUG('===========================',10) call <SID>DEBUG('Entering MBEDeleteBuffer()' ,10) call <SID>DEBUG('===========================',10) " Make sure we are in our window if bufname('%') != '-MiniBufExplorer-' call <SID>DEBUG('MBEDeleteBuffer called in invalid window',1) return endif let l:curLine = line('.') let l:curCol = virtcol('.') let l:selBuf = <SID>GetSelectedBuffer() let l:selBufName = bufname(l:selBuf) if l:selBufName == 'MiniBufExplorer.DBG' && g:miniBufExplorerDebugLevel > 0 call <SID>DEBUG('MBEDeleteBuffer will not delete the debug window, when debugging is turned on.',1) return endif let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd if l:selBuf != -1 " Don't want auto updates while we are processing a delete " request. let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate let g:miniBufExplorerAutoUpdate = 0 " Save previous window so that if we show a buffer after " deleting. The show will come up in the correct window. wincmd p let l:prevWin = winnr() let l:prevWinBuf = winbufnr(winnr()) call <SID>DEBUG('Previous window: '.l:prevWin.' buffer in window: '.l:prevWinBuf,5) call <SID>DEBUG('Selected buffer is <'.l:selBufName.'>['.l:selBuf.']',5) " If buffer is being displayed in a window then " move window to a different buffer before " deleting this one. let l:winNum = (bufwinnr(l:selBufName) + 0) " while we have windows that contain our buffer while l:winNum != -1 call <SID>DEBUG('Buffer '.l:selBuf.' is being displayed in window: '.l:winNum,5) " move to window that contains our selected buffer exec l:winNum.' wincmd w' call <SID>DEBUG('We are now in window: '.winnr().' which contains buffer: '.bufnr('%').' and should contain buffer: '.l:selBuf,5) let l:origBuf = bufnr('%') call <SID>CycleBuffer(1) let l:curBuf = bufnr('%') call <SID>DEBUG('Window now contains buffer: '.bufnr('%').' which should not be: '.l:selBuf,5) if l:origBuf == l:curBuf " we wrapped so we are going to have to delete a buffer " that is in an open window. let l:winNum = -1 else " see if we have anymore windows with our selected buffer let l:winNum = (bufwinnr(l:selBufName) + 0) endif endwhile " Attempt to restore previous window call <SID>DEBUG('Restoring previous window to: '.l:prevWin,5) exec l:prevWin.' wincmd w' " Try to get back to the -MiniBufExplorer- window let l:winNum = bufwinnr(bufnr('-MiniBufExplorer-')) if l:winNum != -1 exec l:winNum.' wincmd w' call <SID>DEBUG('Got to -MiniBufExplorer- window: '.winnr(),5) else call <SID>DEBUG('Unable to get to -MiniBufExplorer- window',1) endif " Delete the buffer selected. call <SID>DEBUG('About to delete buffer: '.l:selBuf,5) exec('silent! bd '.l:selBuf) let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate call <SID>DisplayBuffers(-1) call cursor(l:curLine, l:curCol) endif let &report = l:save_rep let &showcmd = l:save_sc call <SID>DEBUG('===========================',10) call <SID>DEBUG('Completed MBEDeleteBuffer()',10) call <SID>DEBUG('===========================',10) endfunction " }}} " MBEClick - Handle mouse double click {{{ " function! s:MBEClick() call <SID>DEBUG('Entering MBEClick()',10) call <SID>MBESelectBuffer() endfunction " " MBEDoubleClick - Double click with the mouse. " function! s:MBEDoubleClick() call <SID>DEBUG('Entering MBEDoubleClick()',10) call <SID>MBESelectBuffer() endfunction " }}} " CycleBuffer - Cycle Through Buffers {{{ " " Move to next or previous buffer in the current window. If there " are no more modifiable buffers then stay on the current buffer. " can be called with no parameters in which case the buffers are " cycled forward. Otherwise a single argument is accepted, if " it's 0 then the buffers are cycled backwards, otherwise they " are cycled forward. " function! <SID>CycleBuffer(forward) " The following hack handles the case where we only have one " window open and it is too small let l:saveAutoUpdate = g:miniBufExplorerAutoUpdate if (winbufnr(2) == -1) resize let g:miniBufExplorerAutoUpdate = 0 endif " Change buffer (keeping track of before and after buffers) let l:origBuf = bufnr('%') if (a:forward == 1) bn! else bp! endif let l:curBuf = bufnr('%') " Skip any non-modifiable buffers, but don't cycle forever " This should stop us from stopping in any of the [Explorers] while getbufvar(l:curBuf, '&modifiable') == 0 && l:origBuf != l:curBuf if (a:forward == 1) bn! else bp! endif let l:curBuf = bufnr('%') endwhile let g:miniBufExplorerAutoUpdate = l:saveAutoUpdate if (l:saveAutoUpdate == 1) call <SID>AutoUpdate(-1) endif endfunction " }}} " DEBUG - Display debug output when debugging is turned on {{{ " " Thanks to Charles E. Campbell, Jr. PhD <cec@NgrOyphSon.gPsfAc.nMasa.gov> " for Decho.vim which was the inspiration for this enhanced debugging " capability. " function! <SID>DEBUG(msg, level) if g:miniBufExplorerDebugLevel >= a:level " Prevent a report of our actions from showing up. let l:save_rep = &report let l:save_sc = &showcmd let &report = 10000 set noshowcmd " Debug output to a buffer if g:miniBufExplorerDebugMode == 0 " Save the current window number so we can come back here let l:prevWin = winnr() wincmd p let l:prevPrevWin = winnr() wincmd p " Get into the debug window or create it if needed call <SID>FindCreateWindow('MiniBufExplorer.DBG', 1, 0, 0) " Make sure we really got to our window, if not we " will display a confirm dialog and turn debugging " off so that we won't break things even more. if bufname('%') != 'MiniBufExplorer.DBG' call confirm('Error in window debugging code. Dissabling MiniBufExplorer debugging.', 'OK') let g:miniBufExplorerDebugLevel = 0 endif " Write Message to DBG buffer let res=append("$",s:debugIndex.':'.a:level.':'.a:msg) norm G "set nomodified " Return to original window exec l:prevPrevWin.' wincmd w' exec l:prevWin.' wincmd w' " Debug output using VIM's echo facility elseif g:miniBufExplorerDebugMode == 1 echo s:debugIndex.':'.a:level.':'.a:msg " Debug output to a file -- VERY SLOW!!! " should be OK on UNIX and Win32 (not the 95/98 variants) elseif g:miniBufExplorerDebugMode == 2 if has('system') || has('fork') if has('win32') && !has('win95') let l:result = system("cmd /c 'echo ".s:debugIndex.':'.a:level.':'.a:msg." >> MiniBufExplorer.DBG'") endif if has('unix') let l:result = system("echo '".s:debugIndex.':'.a:level.':'.a:msg." >> MiniBufExplorer.DBG'") endif else call confirm('Error in file writing version of the debugging code, vim not compiled with system or fork. Dissabling MiniBufExplorer debugging.', 'OK') let g:miniBufExplorerDebugLevel = 0 endif elseif g:miniBufExplorerDebugMode == 3 let g:miniBufExplorerDebugOutput = g:miniBufExplorerDebugOutput."\n".s:debugIndex.':'.a:level.':'.a:msg endif let s:debugIndex = s:debugIndex + 1 let &report = l:save_rep let &showcmd = l:save_sc endif endfunc " }}} " MBE Script History {{{ "============================================================================= " " History: 6.3.2 o For some reason there was still a call to StopExplorer " with 2 params. Very old bug. I know I fixed before, " any way many thanks to Jason Mills for reporting this! " 6.3.1 o Include folds in source so that it's easier to " navigate. " o Added g:miniBufExplForceSyntaxEnable setting for folks " that want a :syntax enable to be called when we enter " buffers. This can resolve issues caused by a vim bug " where buffers show up without highlighting when another " buffer has been closed, quit, wiped or deleted. " 6.3.0 o Added an option to allow single click (rather than " the default double click) to select buffers in the " MBE window. This feature was requested by AW Law " and was inspired by taglist.vim. Note that you will " need the latest version of taglist.vim if you want to " use MBE and taglist both with singleclick turned on. " Also thanks to AW Law for pointing out that you can " make an Explorer not be listed in a standard :ls. " o Added the ability to have your tabs show up in a " vertical window rather than the standard horizontal " one. Just let g:miniBufExplVSplit = <width> in your " .vimrc and your will get this functionality. " o If you use the vertical explorer and you want it to " autosize then let g:miniBufExplMaxSize = <max width> " in your .vimrc. You may use the MinSize letting in " addition to the MaxLetting if you don't want a super " thin window. " o g:miniBufExplMaxHeight was renamed g:miniBufExplMaxSize " g:miniBufExplMinHeight was renamed g:miniBufExplMinSize " the old settings are backwards compatible if you don't " use the new settings, but they are depreciated. " 6.2.8 o Add an option to stop MBE from targeting non-modifiable " buffers when switching buffers. Thanks to AW Law for " the inspiration for this. This may not work if a user " has lots of explorer/help windows open. " 6.2.7 o Very minor bug fix for people who want to set " loaded_minibufexplorer in their .vimrc in order to " stop MBE from loading. 99.99% of users do not need " this update. " 6.2.6 o Moved history to end of source file " o Updated highlighting documentation " o Created global commands MBEbn and MBEbp that can be " used in mappings if folks want to cycle buffers while " skipping non-eligible buffers. " 6.2.5 o Added <Leader>mbt key mapping which will toggle " the MBE window. I map this to F3 in my .vimrc " with "map <F3> :TMiniBufExplorer<CR>" which " means I can easily close the MBE window when I'm " not using it and get it back when I want it. " o Changed default debug mode to 3 (write to global " g:miniBufExplorerDebugOutput) " o Made a pass through the documentation to clarify " serveral issues and provide more complete docs " for mappings and commands. " 6.2.4 o Because of the autocommand switch (see 6.2.0) it " was possible to remove the restriction on the " :set hidden option. It is now possible to use " this option with MBE. " 6.2.3 o Added miniBufExplTabWrap option. It is turned " off by default. When turned on spaces are added " between tabs and gq} is issued to perform line " formatting. This won't work very well if filenames " contain spaces. It would be pretty easy to write " my own formatter, but I'm too lazy, so if someone " really needs that feature I'll add it :) " 6.2.2 o Changed the way the g:miniBufExplorerMoreThanOne " global is handled. You can set this to the number " of eligible buffers you want to be loaded before " the MBE window is loaded. Setting it to 0 causes " the MBE window to be opened even if there are no " buffers. Setting it to 4 causes the window to stay " closed until the 4th eligible buffer is loaded. " o Added a MinHeight option. This is nice if you want " the MBE window to always take the same amount of " space. For example set MaxSize and MinSize to 2 " and set MoreThanOne to 0 and you will always have " a 2 row (plus the ruler :) MBE window. " NOTE: in 6.3.0 we started using MinSize instead of " Minheight. This will still work if MinSize is not " specified, but it is depreciated. Use MinSize instead. " o I now setlocal foldcomun=0 and nonumber in the MBE " window. This is for those of you that like to have " these options turned on locally. I'm assuming noone " outthere wants foldcolumns and line numbers in the " MBE window? :) " o Fixed a bug where an empty MBE window was taking half " of the screen (partly why the MinHeight option was " added.) " 6.2.1 o If MBE is the only window (because of :bd for example) " and there are still eligible buffers then one of them " will be displayed. " o The <Leader>mbe mapping now highlights the buffer from " the current window. " o The delete ('d') binding in the MBE window now restors " the cursor position, which can help if you want to " delete several buffers in a row that are not at the " beginning of the buffer list. " o Added a new key binding ('p') in the MBE window to " switch to the previous window (last edit window) " 6.2.0 o Major overhaul of autocommand and list updating code, " we now have much better handling of :bd (which is the " most requested feature.) As well as resolving other " issues where the buffer list would not be updated " automatically. The old version tried to trap specific " events, this one just updates frequently, but it keeps " track and only changes the screen if there has been " a change. " o Added g:miniBufExplMaxHeight variable so you can keep " the -MiniBufExplorer- window small when you have lots " of buffers (or buffers with long names :) " NOTE: in 6.3.0 we started using MaxSize instead of " MaxHeight. This will still work if MaxSize is not " specified, but it is depreciated. Use MaxSize instead. " o Improvement to internal syntax highlighting code " I renamed the syntax group names. Anyone who has " figured out how to use them already shouldn't have " any trouble with the new Nameing :) " o Added debug mode 3 which writes to a global variable " this is fast and doesn't mess with the buffer/window " lists. " 6.1.0 o <Leader>mbc was failing because I was calling one of " my own functions with the wrong number of args. :( " Thanks to Gerry Patterson for finding this! " This code is very stable (although it has some " idiocyncracies.) " 6.0.9 o Double clicking tabs was overwriting the cliboard " register on MS Windows. Thanks to Shoeb Bhinderwala " for reporting this issue. " 6.0.8 o Apparently some VIM builds are having a hard time with " line continuation in scripts so the few that were here " have been removed. " o Generalized FindExplorer and FindCreateExplorer so " that they can be used for the debug window. Renaming " to FindWindow and FindCreateWindow. " o Updated debugging code so that debug output is put into " a buffer which can then be written to disk or emailed " to me when someone is having a major issue. Can also " write directly to a file (VERY SLOWLY) on UNIX or Win32 " (not 95 or 98 at the moment) or use VIM's echo function " to display the output to the screen. " o Several people have had issues when the hidden option " is turned on. So I have put in several checks to make " sure folks know this if they try to use MBE with this " option set. " 6.0.7 o Handling BufDelete autocmd so that the UI updates " properly when using :bd (rather than going through " the MBE UI.) " o The AutoUpdate code will now close the MBE window when " there is a single eligible buffer available. " This has the usefull side effect of stopping the MBE " window from blocking the VIM session open when you close " the last buffer. " o Added functions, commands and maps to close & update " the MBE window (<leader>mbc and <leader>mbu.) " o Made MBE open/close state be sticky if set through " StartExplorer(1) or StopExplorer(1), which are " called from the standard mappings. So if you close " the mbe window with \mbc it won't be automatically " opened again unless you do a \mbe (or restart VIM). " o Removed spaces between "tabs" (even more mini :) " o Simplified MBE tab processing " 6.0.6 o Fixed register overwrite bug found by S�bastien Pierre " 6.0.5 o Fixed an issue with window sizing when we run out of " buffers. " o Fixed some weird commenting bugs. " o Added more optional fancy window/buffer navigation: " o You can turn on the capability to use control and the " arrow keys to move between windows. " o You can turn on the ability to use <C-TAB> and " <C-S-TAB> to open the next and previous (respectively) " buffer in the current window. " o You can turn on the ability to use <C-TAB> and " <C-S-TAB> to switch windows (forward and backwards " respectively.) " 6.0.4 o Added optional fancy window navigation: " o Holding down control and pressing a vim direction " [hjkl] will switch windows in the indicated direction. " 6.0.3 o Changed buffer name to -MiniBufExplorer- to resolve " Issue in filename pattern matching on Windows. " 6.0.2 o 2 Changes requested by Suresh Govindachar: " o Added SplitToEdge option and set it on by default " o Added tab and shift-tab mappings in [MBE] window " 6.0.1 o Added MoreThanOne option and set it on by default " MiniBufExplorer will not automatically open until " more than one eligible buffers are opened. This " reduces cluter when you are only working on a " single file. " NOTE: See change log for 6.2.2 for more details about " this feature " 6.0.0 o Initial Release on November 20, 2001 " "============================================================================= " }}} " vim:ft=vim:fdm=marker:ff=unix:nowrap:tabstop=4:shiftwidth=4:softtabstop=4:smarttab:shiftround:expandtab