--- /dev/null
+*bufexplorer.txt* Buffer Explorer Last Change: 19 Nov 2008
+
+Buffer Explorer *buffer-explorer* *bufexplorer*
+ Version 7.2.2
+
+Plugin for easily exploring (or browsing) Vim |:buffers|.
+
+|bufexplorer-usage| Usage
+|bufexplorer-installation| Installation
+|bufexplorer-customization| Customization
+|bufexplorer-changelog| Change Log
+|bufexplorer-todo| Todo
+|bufexplorer-credits| Credits
+
+For Vim version 7.0 and above.
+This plugin is only available if 'compatible' is not set.
+
+{Vi does not have any of this}
+
+==============================================================================
+INSTALLATION *bufexplorer-installation*
+
+To install:
+ - Download the bufexplorer.zip.
+ - Extract the zip archive into your runtime directory.
+ The archive contains plugin/bufexplorer.vim, and doc/bufexplorer.txt.
+ - Start Vim or goto an existing instance of Vim.
+ - Execute the following command:
+>
+ :helptag <your runtime directory/doc
+<
+ This will generate all the help tags for any file located in the doc
+ directory.
+
+==============================================================================
+USAGE *bufexplorer-usage*
+
+To start exploring in the current window, use: >
+ \be OR :BufExplorer
+To start exploring in a newly split horizontal window, use: >
+ \bs or :HSBufExplorer
+To start exploring in a newly split vertical window, use: >
+ \bv or :VSBufExplorer
+
+If you would like to use something other than '\', you may simply change the
+leader (see |mapleader|).
+
+Note: If the current buffer is modified when bufexplorer started, the current
+ window is always split and the new bufexplorer is displayed in that new
+ window.
+
+Commands to use once exploring:
+
+ <enter> Opens the buffer that is under the cursor into the current
+ window.
+ <F1> Toggle help information.
+ <leftmouse> Opens the buffer that is under the cursor into the current
+ window.
+ <shift-enter> Opens the buffer that is under the cursor in another tab.
+ d |:wipeout| the buffer under the cursor from the list.
+ When a buffers is wiped, it will not be shown when unlisted
+ buffer are displayed.
+ D |:delete| the buffer under the cursor from the list.
+ The buffer's 'buflisted' is cleared. This allows for the buffer
+ to be displayed again using the 'show unlisted' command.
+ f Toggles whether you are taken to the active window when
+ selecting a buffer or not.
+ p Toggles the showing of a split filename/pathname.
+ q Quit exploring.
+ r Reverses the order the buffers are listed in.
+ R Toggles relative path/absolute path.
+ s Selects the order the buffers are listed in. Either by buffer
+ number, file name, file extension, most recently used (MRU), or
+ full path.
+ t Opens the buffer that is under the cursor in another tab.
+ u Toggles the showing of "unlisted" buffers.
+
+Once invoked, Buffer Explorer displays a sorted list (MRU is the default
+sort method) of all the buffers that are currently opened. You are then
+able to move the cursor to the line containing the buffer's name you are
+wanting to act upon. Once you have selected the buffer you would like,
+you can then either open it, close it(delete), resort the list, reverse
+the sort, quit exploring and so on...
+
+===============================================================================
+CUSTOMIZATION *bufexplorer-customization*
+
+ *g:bufExplorerDefaultHelp*
+To control whether the default help is displayed or not, use: >
+ let g:bufExplorerDefaultHelp=0 " Do not show default help.
+ let g:bufExplorerDefaultHelp=1 " Show default help.
+The default is to show the default help.
+
+ *g:bufExplorerDetailedHelp*
+To control whether detailed help is display by, use: >
+ let g:bufExplorerDetailedHelp=0 " Do not show detailed help.
+ let g:bufExplorerDetailedHelp=1 " Show detailed help.
+The default is NOT to show detailed help.
+
+ *g:bufExplorerFindActive*
+To control whether you are taken to the active window when selecting a buffer,
+use: >
+ let g:bufExplorerFindActive=0 " Do not go to active window.
+ let g:bufExplorerFindActive=1 " Go to active window.
+The default is to be taken to the active window.
+
+ *g:bufExplorerReverseSort*
+To control whether to sort the buffer in reverse order or not, use: >
+ let g:bufExplorerReverseSort=0 " Do not sort in reverse order.
+ let g:bufExplorerReverseSort=1 " Sort in reverse order.
+The default is NOT to sort in reverse order.
+
+ *g:bufExplorerShowDirectories*
+Directories usually show up in the list from using a command like ":e .".
+To control whether to show directories in the buffer list or not, use: >
+ let g:bufExplorerShowDirectories=1 " Show directories.
+ let g:bufExplorerShowDirectories=0 " Don't show directories.
+The default is to show directories.
+
+ *g:bufExplorerShowRelativePath*
+To control whether to show absolute paths or relative to the current
+directory, use: >
+ let g:bufExplorerShowRelativePath=0 " Show absolute paths.
+ let g:bufExplorerShowRelativePath=1 " Show relative paths.
+The default is to show absolute paths.
+
+ *g:bufExplorerShowUnlisted*
+To control whether to show unlisted buffer or not, use: >
+ let g:bufExplorerShowUnlisted=0 " Do not show unlisted buffers.
+ let g:bufExplorerShowUnlisted=1 " Show unlisted buffers.
+The default is to NOT show unlisted buffers.
+
+ *g:bufExplorerSortBy*
+To control what field the buffers are sorted by, use: >
+ let g:bufExplorerSortBy='extension' " Sort by file extension.
+ let g:bufExplorerSortBy='fullpath' " Sort by full file path name.
+ let g:bufExplorerSortBy='mru' " Sort by most recently used.
+ let g:bufExplorerSortBy='name' " Sort by the buffer's name.
+ let g:bufExplorerSortBy='number' " Sort by the buffer's number.
+The default is to sort by mru.
+
+ *g:bufExplorerSplitBelow*
+To control where the new split window will be placed above or below the
+current window, use: >
+ let g:bufExplorerSplitBelow=1 " Split new window below current.
+ let g:bufExplorerSplitBelow=0 " Split new window above current.
+The default is to use what ever is set by the global &splitbelow
+variable.
+
+ *g:bufExplorerSplitOutPathName*
+To control whether to split out the path and file name or not, use: >
+ let g:bufExplorerSplitOutPathName=1 " Split the path and file name.
+ let g:bufExplorerSplitOutPathName=0 " Don't split the path and file
+ " name.
+The default is to split the path and file name.
+
+ *g:bufExplorerSplitRight*
+To control where the new vsplit window will be placed to the left or right of
+current window, use: >
+ let g:bufExplorerSplitRight=0 " Split left.
+ let g:bufExplorerSplitRight=1 " Split right.
+The default is to use the global &splitright.
+
+===============================================================================
+CHANGE LOG *bufexplorer-changelog*
+
+7.2.2 - Fix:
+ * Thanks to David L. Dight for spotting and fixing an issue when
+ using ctrl^. bufexplorer would incorrectly handle the previous
+ buffer so that when ctrl^ was pressed the incorrect file was opened.
+7.2.1 - Fix:
+ * Thanks to Dimitar for spotting and fixing a feature that was
+ inadvertently left out of the previous version. The feature was
+ when bufexplorer was used together with WinManager, you could use
+ the tab key to open a buffer in a split window.
+7.2.0 - Enhancements:
+ * For all those missing the \bs and \bv commands, these have now
+ returned. Thanks to Phil O'Connell for asking for the return of
+ these missing features and helping test out this version.
+ Fixes:
+ * Fixed problem with the bufExplorerFindActive code not working
+ correctly.
+ * Fixed an incompatibility between bufexplorer and netrw that caused
+ buffers to be incorrectly removed from the MRU list.
+7.1.7 - Fixes:
+ * TaCahiroy fixed several issues related to opening a buffer in a
+ tab.
+7.1.6 - Fixes:
+ * Removed ff=unix from modeline in bufexplorer.txt. Found by Bill
+ McCarthy.
+7.1.5 - Fixes:
+ * Could not open unnamed buffers. Fixed by TaCahiroy.
+7.1.4 - Fixes:
+ * Sometimes when a file's path has 'white space' in it, extra buffers
+ would be created containing each piece of the path. i.e:
+ opening c:\document and settings\test.txt would create a buffer
+ named "and" and a buffer named "Documents". This was reported and
+ fixed by TaCa Yoss.
+7.1.3 - Fixes:
+ * Added code to allow only one instance of the plugin to run at a
+ time. Thanks Dennis Hostetler.
+7.1.2 - Fixes:
+ * Fixed a jumplist issue spotted by JiangJun. I overlooked the
+ 'jumplist' and with a couple calls to 'keepjumps', everything is
+ fine again.
+ * Went back to just having a plugin file, no autoload file. By having
+ the autoload, WinManager was no longer working and without really
+ digging into the cause, it was easier to go back to using just a
+ plugin file.
+7.1.1 - Fixes:
+ * A problem spotted by Thomas Arendsen Hein.
+ When running Vim (7.1.94), error E493 was being thrown.
+ Enhancements:
+ * Added 'D' for 'delete' buffer as the 'd' command was a 'wipe'
+ buffer.
+7.1.0 - Another 'major' update, some by Dave Larson, some by me.
+ * Making use of 'autoload' now to make the plugin load quicker.
+ * Removed '\bs' and '\bv'. These are now controlled by the user. The
+ user can issue a ':sp' or ':vs' to create a horizontal or vertical
+ split window and then issue a '\be'
+ * Added handling of tabs.
+7.0.17 - Fixed issue with 'drop' command.
+ Various enhancements and improvements.
+7.0.16 - Fixed issue reported by Liu Jiaping on non Windows systems, which was
+ ...
+ Open file1, open file2, modify file1, open bufexplorer, you get the
+ following error:
+
+ --------8<--------
+ Error detected while processing function
+ <SNR>14_StartBufExplorer..<SNR>14_SplitOpen:
+ line 4:
+ E37: No write since last change (add ! to override)
+
+ But the worse thing is, when I want to save the current buffer and
+ type ':w', I get another error message:
+ E382: Cannot write, 'buftype' option is set
+ --------8<--------
+
+7.0.15 - Thanks to Mark Smithfield for suggesting bufexplorer needed to handle
+ the ':args' command.
+7.0.14 - Thanks to Randall Hansen for removing the requirement of terminal
+ versions to be recompiled with 'gui' support so the 'drop' command
+ would work. The 'drop' command is really not needed in terminal
+ versions.
+7.0.13 - Fixed integration with WinManager.
+ Thanks to Dave Eggum for another update.
+ - Fix: The detailed help didn't display the mapping for toggling
+ the split type, even though the split type is displayed.
+ - Fixed incorrect description in the detailed help for toggling
+ relative or full paths.
+ - Deprecated s:ExtractBufferNbr(). Vim's str2nr() does the same
+ thing.
+ - Created a s:Set() function that sets a variable only if it hasn't
+ already been defined. It's useful for initializing all those
+ default settings.
+ - Removed checks for repetitive command definitions. They were
+ unnecessary.
+ - Made the help highlighting a little more fancy.
+ - Minor reverse compatibility issue: Changed ambiguous setting
+ names to be more descriptive of what they do (also makes the code
+ easier to follow):
+ Changed bufExplorerSortDirection to bufExplorerReverseSort
+ Changed bufExplorerSplitType to bufExplorerSplitVertical
+ Changed bufExplorerOpenMode to bufExplorerUseCurrentWindow
+ - When the BufExplorer window closes, all the file-local marks are
+ now deleted. This may have the benefit of cleaning up some of the
+ jumplist.
+ - Changed the name of the parameter for StartBufExplorer from
+ "split" to "open". The parameter is a string which specifies how
+ the buffer will be open, not if it is split or not.
+ - Deprecated DoAnyMoreBuffersExist() - it is a one line function
+ only used in one spot.
+ - Created four functions (SplitOpen(), RebuildBufferList(),
+ UpdateHelpStatus() and ReSortListing()) all with one purpose - to
+ reduce repeated code.
+ - Changed the name of AddHeader() to CreateHelp() to be more
+ descriptive of what it does. It now returns an array instead of
+ updating the window directly. This has the benefit of making the
+ code more efficient since the text the function returns is used a
+ little differently in the two places the function is called.
+ - Other minor simplifications.
+7.0.12 - MAJOR Update.
+ This version will ONLY run with Vim version 7.0 or greater.
+ Dave Eggum has made some 'significant' updates to this latest
+ version:
+ - Added BufExplorerGetAltBuf() global function to be used in the
+ user\92s rulerformat.
+ - Added g:bufExplorerSplitRight option.
+ - Added g:bufExplorerShowRelativePath option with mapping.
+ - Added current line highlighting.
+ - The split type can now be changed whether bufexplorer is opened
+ in split mode or not.
+ - Various major and minor bug fixes and speed improvements.
+ - Sort by extension.
+ Other improvements/changes:
+ - Changed the help key from '?' to <F1> to be more 'standard'.
+ - Fixed splitting of vertical bufexplorer window.
+ Hopefully I have not forgot something :)
+7.0.11 - Fixed a couple of highlighting bugs, reported by David Eggum. He also
+ changed passive voice to active on a couple of warning messages.
+7.0.10 - Fixed bug report by Xiangjiang Ma. If the 'ssl' option is set,
+ the slash character used when displaying the path was incorrect.
+7.0.9 - Martin Grenfell found and eliminated an annoying bug in the
+ bufexplorer/winmanager integration. The bug was were an
+ annoying message would be displayed when a window was split or
+ a new file was opened in a new window. Thanks Martin!
+7.0.8 - Thanks to Mike Li for catching a bug in the WinManager integration.
+ The bug was related to the incorrect displaying of the buffer
+ explorer's window title.
+7.0.7 - Thanks to Jeremy Cowgar for adding a new enhancement. This
+ enhancement allows the user to press 'S', that is capital S, which
+ will open the buffer under the cursor in a newly created split
+ window.
+7.0.6 - Thanks to Larry Zhang for finding a bug in the "split" buffer code.
+ If you force set g:bufExplorerSplitType='v' in your vimrc, and if you
+ tried to do a \bs to split the bufexplorer window, it would always
+ split horizontal, not vertical. He also found that I had a typeo in
+ that the variable g:bufExplorerSplitVertSize was all lower case in
+ the documentation which was incorrect.
+7.0.5 - Thanks to Mun Johl for pointing out a bug that if a buffer was
+ modified, the '+' was not showing up correctly.
+7.0.4 - Fixed a problem discovered first by Xiangjiang Ma. Well since I've
+ been using vim 7.0 and not 6.3, I started using a function (getftype)
+ that is not in 6.3. So for backward compatibility, I conditionaly use
+ this function now. Thus, the g:bufExplorerShowDirectories feature is
+ only available when using vim 7.0 and above.
+7.0.3 - Thanks to Erwin Waterlander for finding a problem when the last
+ buffer was deleted. This issue got me to rewrite the buffer display
+ logic (which I've wanted to do for sometime now).
+ Also great thanks to Dave Eggum for coming up with idea for
+ g:bufExplorerShowDirectories. Read the above information about this
+ feature.
+7.0.2 - Thanks to Thomas Arendsen Hein for finding a problem when a user
+ has the default help turned off and then brought up the explorer. An
+ E493 would be displayed.
+7.0.1 - Thanks to Erwin Waterlander for finding a couple problems.
+ The first problem allowed a modified buffer to be deleted. Opps! The
+ second problem occurred when several files were opened, BufExplorer
+ was started, the current buffer was deleted using the 'd' option, and
+ then BufExplorer was exited. The deleted buffer was still visible
+ while it is not in the buffers list. Opps again!
+7.0.0 - Thanks to Shankar R. for suggesting to add the ability to set
+ the fixed width (g:bufExplorerSplitVertSize) of a new window
+ when opening bufexplorer vertically and fixed height
+ (g:bufExplorerSplitHorzSize) of a new window when opening
+ bufexplorer horizontally. By default, the windows are normally
+ split to use half the existing width or height.
+6.3.0 - Added keepjumps so that the jumps list would not get cluttered with
+ bufexplorer related stuff.
+6.2.3 - Thanks to Jay Logan for finding a bug in the vertical split position
+ of the code. When selecting that the window was to be split
+ vertically by doing a '\bv', from then on, all splits, i.e. '\bs',
+ were split vertically, even though g:bufExplorerSplitType was not set
+ to 'v'.
+6.2.2 - Thanks to Patrik Modesto for adding a small improvement. For some
+ reason his bufexplorer window was always showing up folded. He added
+ 'setlocal nofoldenable' and it was fixed.
+6.2.1 - Thanks goes out to Takashi Matsuo for added the 'fullPath' sorting
+ logic and option.
+6.2.0 - Thanks goes out to Simon Johann-Ganter for spotting and fixing a
+ problem in that the last search pattern is overridden by the search
+ pattern for blank lines.
+6.1.6 - Thanks to Artem Chuprina for finding a pesky bug that has been around
+ for sometime now. The <esc> key mapping was causing the buffer
+ explored to close prematurely when vim was run in an xterm. The <esc>
+ key mapping is now removed.
+6.1.5 - Thanks to Khorev Sergey. Added option to show default help or not.
+6.1.4 - Thanks goes out to Valery Kondakoff for suggesting the addition of
+ setlocal nonumber and foldcolumn=0. This allows for line numbering
+ and folding to be turned off temporarily while in the explorer.
+6.1.3 - Added folding. Did some code cleanup. Added the ability to force the
+ newly split window to be temporarily vertical, which was suggested by
+ Thomas Glanzmann.
+6.1.2 - Now pressing the <esc> key will quit, just like 'q'.
+ Added folds to hide winmanager configuration.
+ If anyone had the 'C' option in their cpoptions they would receive
+ a E10 error on startup of BufExplorer. cpo is now saved, updated and
+ restored. Thanks to Charles E Campbell, Jr.
+ Attempted to make sure there can only be one BufExplorer window open
+ at a time.
+6.1.1 - Thanks to Brian D. Goodwin for adding toupper to FileNameCmp. This
+ way buffers sorted by name will be in the correct order regardless of
+ case.
+6.0.16 - Thanks to Andre Pang for the original patch/idea to get bufexplorer
+ to work in insertmode/modeless mode (evim). Added Initialize
+ and Cleanup autocommands to handle commands that need to be
+ performed when starting or leaving bufexplorer.
+6.0.15 - Srinath Avadhanulax added a patch for winmanager.vim.
+6.0.14 - Fix a few more bug that I thought I already had fixed. Thanks
+ to Eric Bloodworth for adding 'Open Mode/Edit in Place'. Added
+ vertical splitting.
+6.0.13 - Thanks to Charles E Campbell, Jr. for pointing out some embarrassing
+ typos that I had in the documentation. I guess I need to run
+ the spell checker more :o)
+6.0.12 - Thanks to Madoka Machitani, for the tip on adding the augroup command
+ around the MRUList autocommands.
+6.0.11 - Fixed bug report by Xiangjiang Ma. '"=' was being added to the
+ search history which messed up hlsearch.
+6.0.10 - Added the necessary hooks so that the Srinath Avadhanula's
+ winmanager.vim script could more easily integrate with this script.
+ Tried to improve performance.
+6.0.9 - Added MRU (Most Recently Used) sort ordering.
+6.0.8 - Was not resetting the showcmd command correctly.
+ Added nifty help file.
+6.0.7 - Thanks to Brett Carlane for some great enhancements. Some are added,
+ some are not, yet. Added highlighting of current and alternate
+ filenames. Added splitting of path/filename toggle. Reworked
+ ShowBuffers().
+ Changed my email address.
+6.0.6 - Copyright notice added. Needed this so that it could be distributed
+ with Debian Linux. Fixed problem with the SortListing() function
+ failing when there was only one buffer to display.
+6.0.5 - Fixed problems reported by David Pascoe, in that you where unable to
+ hit 'd' on a buffer that belonged to a files that no longer existed
+ and that the 'yank' buffer was being overridden by the help text when
+ the bufexplorer was opened.
+6.0.4 - Thanks to Charles Campbell, Jr. for making this plugin more plugin
+ *compliant*, adding default keymappings of <Leader>be and <Leader>bs
+ as well as fixing the 'w:sortDirLabel not being defined' bug.
+6.0.3 - Added sorting capabilities. Sort taken from explorer.vim.
+6.0.2 - Can't remember.
+6.0.1 - Initial release.
+
+===============================================================================
+TODO *bufexplorer-todo*
+
+- The issuing of a ':bd' command does not always remove the buffer number from
+ the MRU list.
+
+===============================================================================
+CREDITS *bufexplorer-credits*
+
+Author: Jeff Lanzarotta <delux256-vim at yahoo dot com>
+
+Credit must go out to Bram Moolenaar and all the Vim developers for
+making the world's best editor (IMHO). I also want to thank everyone who
+helped and gave me suggestions. I wouldn't want to leave anyone out so I
+won't list names.
+
+===============================================================================
+vim:tw=78:noet:wrap:ts=8:ft=help:norl:
--- /dev/null
+"=============================================================================
+" Copyright: Copyright (C) 2001-2008 Jeff Lanzarotta
+" 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,
+" bufexplorer.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 damages
+" resulting from the use of this software.
+" Name Of File: bufexplorer.vim
+" Description: Buffer Explorer Vim Plugin
+" Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com)
+" Last Changed: Wednesday, 19 Nov 2008
+" Version: See g:bufexplorer_version for version number.
+" Usage: This file should reside in the plugin directory and be
+" automatically sourced.
+"
+" You may use the default keymappings of
+"
+" <Leader>be - Opens BufExplorer
+" <Leader>bs - Opens horizontally split window BufExplorer
+" <Leader>bv - Opens vertically split window BufExplorer
+"
+" Or you can use
+"
+" ":BufExplorer" - Opens BufExplorer
+" ":HSBufExplorer" - Opens horizontally window BufExplorer
+" ":VSBufExplorer" - Opens vertically split window BufExplorer
+"
+" For more help see supplied documentation.
+" History: See supplied documentation.
+"=============================================================================
+
+" Exit quickly if already running or when 'compatible' is set. {{{1
+if exists("g:bufexplorer_version") || &cp
+ finish
+endif
+"1}}}
+
+" Version number
+let g:bufexplorer_version = "7.2.2"
+
+" Check for Vim version 700 or greater {{{1
+if v:version < 700
+ "echo "Sorry, bufexplorer ".g:bufexplorer_version."\nONLY runs with Vim 7.0 and greater."
+ finish
+endif
+
+" Public Interface {{{1
+nmap <silent> <unique> <Leader>be :BufExplorer<CR>
+nmap <silent> <unique> <Leader>bs :HSBufExplorer<CR>
+nmap <silent> <unique> <Leader>bv :VSBufExplorer<CR>
+
+" Create commands {{{1
+command BufExplorer :call StartBufExplorer(has ("gui") ? "drop" : "hide edit")
+command HSBufExplorer :call HorizontalSplitBufExplorer()
+command VSBufExplorer :call VerticalSplitBufExplorer()
+
+" Set {{{1
+function s:Set(var, default)
+ if !exists(a:var)
+ if type(a:default)
+ exec "let" a:var "=" string(a:default)
+ else
+ exec "let" a:var "=" a:default
+ endif
+
+ return 1
+ endif
+
+ return 0
+endfunction
+
+" Default values {{{1
+call s:Set("g:bufExplorerDefaultHelp", 1) " Show default help?
+call s:Set("g:bufExplorerDetailedHelp", 0) " Show detailed help?
+call s:Set("g:bufExplorerFindActive", 1) " When selecting an active buffer, take you to the window where it is active?
+call s:Set("g:bufExplorerReverseSort", 0) " sort reverse?
+call s:Set("g:bufExplorerShowDirectories", 1) " (Dir's are added by commands like ':e .')
+call s:Set("g:bufExplorerShowRelativePath", 0) " Show listings with relative or absolute paths?
+call s:Set("g:bufExplorerShowUnlisted", 0) " Show unlisted buffers?
+call s:Set("g:bufExplorerSortBy", "mru") " Sorting methods are in s:sort_by:
+call s:Set("g:bufExplorerSplitOutPathName", 1) " Split out path and file name?
+call s:Set("g:bufExplorerSplitRight", &splitright) " Should vertical splits be on the right or left of current window?
+call s:Set("g:bufExplorerSplitBelow", &splitbelow) " Should horizontal splits be below or above current window?
+
+" Global variables {{{1
+let s:MRUList = []
+let s:running = 0
+let s:sort_by = ["number", "name", "fullpath", "mru", "extension"]
+let s:tabSpace = []
+let s:types = {"fullname": ':p', "path": ':p:h', "relativename": ':~:.', "relativepath": ':~:.:h', "shortname": ':t'}
+let s:originBuffer = 0
+let s:splitMode = ""
+
+" Setup the autocommands that handle the MRUList and other stuff. {{{1
+autocmd VimEnter * call s:Setup()
+
+" Setup {{{1
+function s:Setup()
+ " Build initial MRUList.
+ let s:MRUList = range(1, bufnr('$'))
+ let s:tabSpace = []
+ " Now that the MRUList is created, add the other autocmds.
+ autocmd BufEnter,BufNew * call s:ActivateBuffer()
+ autocmd BufWipeOut * call s:DeactivateBuffer(1)
+ autocmd BufDelete * call s:DeactivateBuffer(0)
+
+ autocmd BufWinEnter \[BufExplorer\] call s:Initialize()
+ autocmd BufWinLeave \[BufExplorer\] call s:Cleanup()
+endfunction
+
+" ActivateBuffer {{{1
+function s:ActivateBuffer()
+ let b = bufnr("%")
+ let l = get(s:tabSpace, tabpagenr(), [])
+
+ if empty(l) || index(l, b) == -1
+ call add(l, b)
+ let s:tabSpace[tabpagenr()] = l
+ endif
+
+ call s:MRUPush(b)
+endfunction
+
+" DeactivateBuffer {{{1
+function s:DeactivateBuffer(remove)
+ "echom "afile:" expand("<afile>")
+ "echom "bufnr, afile:" bufnr(expand("<afile>"))
+ "echom "buffers:" string(tabpagebuflist())
+ "echom "MRU before:" string(s:MRUList)
+
+ let _bufnr = bufnr(expand("<afile>"))
+ let _buftype = getbufvar(_bufnr, "&buftype")
+
+ if empty(_buftype) || _buftype == "nofile" || !buflisted(_bufnr) || empty(bufname(_bufnr)) || fnamemodify(bufname(_bufnr), ":t") == "[BufExplorer]"
+ return
+ end
+
+ if a:remove
+ call s:MRUPop(bufnr(expand("<afile>")))
+ end
+endfunction
+
+" MRUPop {{{1
+function s:MRUPop(buf)
+ call filter(s:MRUList, 'v:val != '.a:buf)
+endfunction
+
+" MRUPush {{{1
+function s:MRUPush(buf)
+ " Skip temporary buffer with buftype set. Don't add the BufExplorer window to the
+ " list.
+ if !empty(getbufvar(a:buf, "&buftype")) ||
+ \ !buflisted(a:buf) || empty(bufname(a:buf)) ||
+ \ fnamemodify(bufname(a:buf), ":t") == "[BufExplorer]"
+ return
+ end
+ " Remove the buffer number from the list if it already exists.
+ call s:MRUPop(a:buf)
+ " Add the buffer number to the head of the list.
+ call insert(s:MRUList,a:buf)
+endfunction
+
+" Initialize {{{1
+function s:Initialize()
+ let s:_insertmode = &insertmode
+ set noinsertmode
+
+ let s:_showcmd = &showcmd
+ set noshowcmd
+
+ let s:_cpo = &cpo
+ set cpo&vim
+
+ let s:_report = &report
+ let &report = 10000
+
+ let s:_list = &list
+ set nolist
+
+ setlocal nonumber
+ setlocal foldcolumn=0
+ setlocal nofoldenable
+ setlocal cursorline
+ setlocal nospell
+
+ set nobuflisted
+
+ let s:running = 1
+endfunction
+
+" Cleanup {{{1
+function s:Cleanup()
+ let &insertmode = s:_insertmode
+ let &showcmd = s:_showcmd
+ let &cpo = s:_cpo
+ let &report = s:_report
+ let &list = s:_list
+ let s:running = 0
+ let s:splitMode = ""
+
+ delmarks!
+endfunction
+
+" HorizontalSplitBufExplorer {{{1
+function HorizontalSplitBufExplorer()
+ let s:splitMode = "sp"
+ exec "BufExplorer"
+endfunction
+
+" VerticalSplitBufExplorer {{{1
+function VerticalSplitBufExplorer()
+ let s:splitMode = "vsp"
+ exec "BufExplorer"
+endfunction
+
+" StartBufExplorer {{{1
+function StartBufExplorer(open)
+ let name = '[BufExplorer]'
+
+ if !has("win32")
+ " On non-Windows boxes, escape the name so that is shows up correctly.
+ let name = escape(name, "[]")
+ endif
+ " Make sure there is only one explorer open at a time.
+ if s:running == 1
+ " Go to the open buffer.
+ if has("gui")
+ exec "drop" name
+ endif
+
+ return
+ endif
+
+ let s:originBuffer = bufnr("%")
+ silent let s:raw_buffer_listing = s:GetBufferInfo()
+
+ let copy = copy(s:raw_buffer_listing)
+
+ if (g:bufExplorerShowUnlisted == 0)
+ call filter(copy, 'v:val.attributes !~ "u"')
+ endif
+
+ if (!empty(copy))
+ call filter(copy, 'v:val.shortname !~ "\\\[No Name\\\]"')
+ endif
+
+ if len(copy) <= 1
+ echo "\r"
+ call s:Warning("Sorry, there are no more buffers to explore")
+
+ return
+ endif
+ " We may have to split the current window.
+ if (s:splitMode != "")
+ " Save off the original settings.
+ let [_splitbelow, _splitright] = [&splitbelow, &splitright]
+ " Set the setting to ours.
+ let [&splitbelow, &splitright] = [g:bufExplorerSplitBelow, g:bufExplorerSplitRight]
+ " Do it.
+ exe s:splitMode
+ " Restore the original settings.
+ let [&splitbelow, &splitright] = [_splitbelow, _splitright]
+ endif
+
+ if !exists("b:displayMode") || b:displayMode != "winmanager"
+ " Do not use keepalt when opening bufexplorer to allow the buffer that we are
+ " leaving to become the new alternate buffer
+ exec "silent keepjumps ".a:open." ".name
+ endif
+
+ call s:DisplayBufferList()
+endfunction
+
+" DisplayBufferList {{{1
+function s:DisplayBufferList()
+ setlocal bufhidden=delete
+ setlocal buftype=nofile
+ setlocal modifiable
+ setlocal noswapfile
+ setlocal nowrap
+
+ call s:SetupSyntax()
+ call s:MapKeys()
+ call setline(1, s:CreateHelp())
+ call s:BuildBufferList()
+ call cursor(s:firstBufferLine, 1)
+
+ if !g:bufExplorerResize
+ normal! zz
+ endif
+
+ setlocal nomodifiable
+endfunction
+
+" MapKeys {{{1
+function s:MapKeys()
+ if exists("b:displayMode") && b:displayMode == "winmanager"
+ nnoremap <buffer> <silent> <tab> :call <SID>SelectBuffer("tab")<cr>
+ endif
+
+ nnoremap <buffer> <silent> <F1> :call <SID>ToggleHelp()<cr>
+ nnoremap <buffer> <silent> <2-leftmouse> :call <SID>SelectBuffer()<cr>
+ nnoremap <buffer> <silent> <cr> :call <SID>SelectBuffer()<cr>
+ nnoremap <buffer> <silent> t :call <SID>SelectBuffer("tab")<cr>
+ nnoremap <buffer> <silent> <s-cr> :call <SID>SelectBuffer("tab")<cr>
+ nnoremap <buffer> <silent> d :call <SID>RemoveBuffer("wipe")<cr>
+ nnoremap <buffer> <silent> D :call <SID>RemoveBuffer("delete")<cr>
+ nnoremap <buffer> <silent> m :call <SID>MRUListShow()<cr>
+ nnoremap <buffer> <silent> p :call <SID>ToggleSplitOutPathName()<cr>
+ nnoremap <buffer> <silent> q :call <SID>Close()<cr>
+ nnoremap <buffer> <silent> r :call <SID>SortReverse()<cr>
+ nnoremap <buffer> <silent> R :call <SID>ToggleShowRelativePath()<cr>
+ nnoremap <buffer> <silent> s :call <SID>SortSelect()<cr>
+ nnoremap <buffer> <silent> u :call <SID>ToggleShowUnlisted()<cr>
+ nnoremap <buffer> <silent> f :call <SID>ToggleFindActive()<cr>
+
+ for k in ["G", "n", "N", "L", "M", "H"]
+ exec "nnoremap <buffer> <silent>" k ":keepjumps normal!" k."<cr>"
+ endfor
+endfunction
+
+" SetupSyntax {{{1
+function s:SetupSyntax()
+ if has("syntax")
+ syn match bufExplorerHelp "^\".*" contains=bufExplorerSortBy,bufExplorerMapping,bufExplorerTitle,bufExplorerSortType,bufExplorerToggleSplit,bufExplorerToggleOpen
+ syn match bufExplorerOpenIn "Open in \w\+ window" contained
+ syn match bufExplorerSplit "\w\+ split" contained
+ syn match bufExplorerSortBy "Sorted by .*" contained contains=bufExplorerOpenIn,bufExplorerSplit
+ syn match bufExplorerMapping "\" \zs.\+\ze :" contained
+ syn match bufExplorerTitle "Buffer Explorer.*" contained
+ syn match bufExplorerSortType "'\w\{-}'" contained
+ syn match bufExplorerBufNbr /^\s*\d\+/
+ syn match bufExplorerToggleSplit "toggle split type" contained
+ syn match bufExplorerToggleOpen "toggle open mode" contained
+
+ syn match bufExplorerModBuf /^\s*\d\+.\{4}+.*/
+ syn match bufExplorerLockedBuf /^\s*\d\+.\{3}[\-=].*/
+ syn match bufExplorerHidBuf /^\s*\d\+.\{2}h.*/
+ syn match bufExplorerActBuf /^\s*\d\+.\{2}a.*/
+ syn match bufExplorerCurBuf /^\s*\d\+.%.*/
+ syn match bufExplorerAltBuf /^\s*\d\+.#.*/
+ syn match bufExplorerUnlBuf /^\s*\d\+u.*/
+
+ hi def link bufExplorerBufNbr Number
+ hi def link bufExplorerMapping NonText
+ hi def link bufExplorerHelp Special
+ hi def link bufExplorerOpenIn Identifier
+ hi def link bufExplorerSortBy String
+ hi def link bufExplorerSplit NonText
+ hi def link bufExplorerTitle NonText
+ hi def link bufExplorerSortType bufExplorerSortBy
+ hi def link bufExplorerToggleSplit bufExplorerSplit
+ hi def link bufExplorerToggleOpen bufExplorerOpenIn
+
+ hi def link bufExplorerActBuf Identifier
+ hi def link bufExplorerAltBuf String
+ hi def link bufExplorerCurBuf Type
+ hi def link bufExplorerHidBuf Constant
+ hi def link bufExplorerLockedBuf Special
+ hi def link bufExplorerModBuf Exception
+ hi def link bufExplorerUnlBuf Comment
+ endif
+endfunction
+
+" ToggleHelp {{{1
+function s:ToggleHelp()
+ let g:bufExplorerDetailedHelp = !g:bufExplorerDetailedHelp
+
+ setlocal modifiable
+ " Save position.
+ normal! ma
+ " Remove old header.
+ if (s:firstBufferLine > 1)
+ exec "keepjumps 1,".(s:firstBufferLine - 1) "d _"
+ endif
+
+ call append(0, s:CreateHelp())
+
+ silent! normal! g`a
+ delmarks a
+
+ setlocal nomodifiable
+
+ if exists("b:displayMode") && b:displayMode == "winmanager"
+ call WinManagerForceReSize("BufExplorer")
+ end
+endfunction
+
+" GetHelpStatus {{{1
+function s:GetHelpStatus()
+ let ret = '" Sorted by '.((g:bufExplorerReverseSort == 1) ? "reverse " : "").g:bufExplorerSortBy
+ let ret .= ' | '.((g:bufExplorerFindActive == 0) ? "Don't " : "")."Locate buffer"
+ let ret .= ((g:bufExplorerShowUnlisted == 0) ? "" : " | Show unlisted")
+ let ret .= ' | '.((g:bufExplorerShowRelativePath == 0) ? "Absolute" : "Relative")
+ let ret .= ' '.((g:bufExplorerSplitOutPathName == 0) ? "Full" : "Split")." path"
+
+ return ret
+endfunction
+
+" CreateHelp {{{1
+function s:CreateHelp()
+ if g:bufExplorerDefaultHelp == 0 && g:bufExplorerDetailedHelp == 0
+ let s:firstBufferLine = 1
+ return []
+ endif
+
+ let header = []
+
+ if g:bufExplorerDetailedHelp == 1
+ call add(header, '" Buffer Explorer ('.g:bufexplorer_version.')')
+ call add(header, '" --------------------------')
+ call add(header, '" <F1> : toggle this help')
+ call add(header, '" <enter> or Mouse-Double-Click : open buffer under cursor')
+ call add(header, '" <shift-enter> or t : open buffer in another tab')
+ call add(header, '" d : wipe buffer')
+ call add(header, '" D : delete buffer')
+ call add(header, '" p : toggle spliting of file and path name')
+ call add(header, '" q : quit')
+ call add(header, '" r : reverse sort')
+ call add(header, '" R : toggle showing relative or full paths')
+ call add(header, '" u : toggle showing unlisted buffers')
+ call add(header, '" s : select sort field '.string(s:sort_by).'')
+ call add(header, '" f : toggle find active buffer')
+ else
+ call add(header, '" Press <F1> for Help')
+ endif
+
+ call add(header, s:GetHelpStatus())
+ call add(header, '"=')
+
+ let s:firstBufferLine = len(header) + 1
+
+ return header
+endfunction
+
+" GetBufferInfo {{{1
+function s:GetBufferInfo()
+ redir => bufoutput
+ buffers!
+ redir END
+
+ let [all, allwidths, listedwidths] = [[], {}, {}]
+
+ for n in keys(s:types)
+ let allwidths[n] = []
+ let listedwidths[n] = []
+ endfor
+
+ for buf in split(bufoutput, '\n')
+ let bits = split(buf, '"')
+ let b = {"attributes": bits[0], "line": substitute(bits[2], '\s*', '', '')}
+
+ for [key, val] in items(s:types)
+ let b[key] = fnamemodify(bits[1], val)
+ endfor
+
+ if getftype(b.fullname) == "dir" && g:bufExplorerShowDirectories == 1
+ let b.shortname = "<DIRECTORY>"
+ end
+
+ call add(all, b)
+
+ for n in keys(s:types)
+ call add(allwidths[n], len(b[n]))
+
+ if b.attributes !~ "u"
+ call add(listedwidths[n], len(b[n]))
+ endif
+ endfor
+ endfor
+
+ let [s:allpads, s:listedpads] = [{}, {}]
+
+ for n in keys(s:types)
+ let s:allpads[n] = repeat(' ', max(allwidths[n]))
+ let s:listedpads[n] = repeat(' ', max(listedwidths[n]))
+ endfor
+
+ return all
+endfunction
+
+" BuildBufferList {{{1
+function s:BuildBufferList()
+ let lines = []
+ " Loop through every buffer.
+ for buf in s:raw_buffer_listing
+ if (!g:bufExplorerShowUnlisted && buf.attributes =~ "u")
+ " Skip unlisted buffers if we are not to show them.
+ continue
+ endif
+
+ let line = buf.attributes." "
+
+ if g:bufExplorerSplitOutPathName
+ let type = (g:bufExplorerShowRelativePath) ? "relativepath" : "path"
+ let path = buf[type]
+ let pad = (g:bufExplorerShowUnlisted) ? s:allpads.shortname : s:listedpads.shortname
+ let line .= buf.shortname." ".strpart(pad.path, len(buf.shortname))
+ else
+ let type = (g:bufExplorerShowRelativePath) ? "relativename" : "fullname"
+ let path = buf[type]
+ let line .= path
+ endif
+
+ let pads = (g:bufExplorerShowUnlisted) ? s:allpads : s:listedpads
+
+ if !empty(pads[type])
+ let line .= strpart(pads[type], len(path))." "
+ endif
+
+ let line .= buf.line
+
+ call add(lines, line)
+ endfor
+
+ call setline(s:firstBufferLine, lines)
+
+ call s:SortListing()
+endfunction
+
+" SelectBuffer {{{1
+function s:SelectBuffer(...)
+ " Sometimes messages are not cleared when we get here so it looks like an error has
+ " occurred when it really has not.
+ echo ""
+ " Are we on a line with a file name?
+ if line('.') < s:firstBufferLine
+ exec "normal! \<cr>"
+ return
+ endif
+
+ let _bufNbr = str2nr(getline('.'))
+
+ if exists("b:displayMode") && b:displayMode == "winmanager"
+ let bufname = expand("#"._bufNbr.":p")
+
+ if (a:0 == 1) && (a:1 == "tab")
+ call WinManagerFileEdit(bufname, 1)
+ else
+ call WinManagerFileEdit(bufname, 0)
+ endif
+
+ return
+ end
+
+ if bufexists(_bufNbr)
+ if bufnr("#") == _bufNbr
+ return s:Close()
+ endif
+
+ if (a:0 == 1) && (a:1 == "tab")
+ " Restore [BufExplorer] buffer.
+ exec "keepjumps silent buffer!".s:originBuffer
+
+ let tabNbr = s:GetTabNbr(_bufNbr)
+
+ if tabNbr == 0
+ " _bufNbr is not opened in any tabs. Open a new tab with the selected buffer in it.
+ exec "999tab split +buffer" . _bufNbr
+ else
+ " The _bufNbr is already opened in tab(s), go to that tab.
+ exec tabNbr . "tabnext"
+ " Focus window.
+ exec s:GetWinNbr(tabNbr, _bufNbr) . "wincmd w"
+ endif
+ else
+ if bufloaded(_bufNbr) && g:bufExplorerFindActive
+ call s:Close()
+
+ let tabNbr = s:GetTabNbr(_bufNbr)
+
+ if tabNbr != 0
+ " The buffer is located in a tab. Go to that tab number.
+ exec tabNbr . "tabnext"
+ else
+ let bufname = expand("#"._bufNbr.":p")
+ exec bufname ? "drop ".escape(bufname, " ") : "buffer "._bufNbr
+ endif
+ endif
+ " Switch to the buffer.
+ exec "keepalt keepjumps silent b!" _bufNbr
+ endif
+ " Make the buffer 'listed' again.
+ call setbufvar(_bufNbr, "&buflisted", "1")
+ else
+ call s:Error("Sorry, that buffer no longer exists, please select another")
+ call s:DeleteBuffer(_bufNbr, "wipe")
+ endif
+endfunction
+
+" RemoveBuffer {{{1
+function s:RemoveBuffer(mode)
+ " Are we on a line with a file name?
+ if line('.') < s:firstBufferLine
+ return
+ endif
+ " Do not allow this buffer to be deleted if it is the last one.
+ if len(s:MRUList) == 1
+ call s:Error("Sorry, you are not allowed to delete the last buffer")
+ return
+ endif
+ " These commands are to temporarily suspend the activity of winmanager.
+ if exists("b:displayMode") && b:displayMode == "winmanager"
+ call WinManagerSuspendAUs()
+ end
+
+ let _bufNbr = str2nr(getline('.'))
+
+ if getbufvar(_bufNbr, '&modified') == 1
+ call s:Error("Sorry, no write since last change for buffer "._bufNbr.", unable to delete")
+ return
+ else
+ " Okay, everything is good, delete or wipe the buffer.
+ call s:DeleteBuffer(_bufNbr, a:mode)
+ endif
+ " Reactivate winmanager autocommand activity.
+ if exists("b:displayMode") && b:displayMode == "winmanager"
+ call WinManagerForceReSize("BufExplorer")
+ call WinManagerResumeAUs()
+ end
+endfunction
+
+" DeleteBuffer {{{1
+function s:DeleteBuffer(buf, mode)
+ " This routine assumes that the buffer to be removed is on the current line.
+ try
+ if a:mode == "wipe"
+ exe "silent bw" a:buf
+ else
+ exe "silent bd" a:buf
+ end
+
+ setlocal modifiable
+ normal! "_dd
+ setlocal nomodifiable
+ " Delete the buffer from the raw buffer list.
+ call filter(s:raw_buffer_listing, 'v:val.attributes !~ " '.a:buf.' "')
+ catch
+ call s:Error(v:exception)
+ endtry
+endfunction
+
+" Close {{{1
+function s:Close()
+ " Get only the listed buffers.
+ let listed = filter(copy(s:MRUList), "buflisted(v:val)")
+ " If we needed to split the main window, close the split one.
+ if (s:splitMode != "")
+ exec "wincmd c"
+ end
+
+ for b in reverse(listed[0:1])
+ exec "keepjumps silent b ".b
+ endfor
+endfunction
+
+" ToggleSplitOutPathName {{{1
+function s:ToggleSplitOutPathName()
+ let g:bufExplorerSplitOutPathName = !g:bufExplorerSplitOutPathName
+ call s:RebuildBufferList()
+ call s:UpdateHelpStatus()
+endfunction
+
+" ToggleShowRelativePath {{{1
+function s:ToggleShowRelativePath()
+ let g:bufExplorerShowRelativePath = !g:bufExplorerShowRelativePath
+ call s:RebuildBufferList()
+ call s:UpdateHelpStatus()
+endfunction
+
+" ToggleShowUnlisted {{{1
+function s:ToggleShowUnlisted()
+ let g:bufExplorerShowUnlisted = !g:bufExplorerShowUnlisted
+ let num_bufs = s:RebuildBufferList(g:bufExplorerShowUnlisted == 0)
+ call s:UpdateHelpStatus()
+endfunction
+
+" ToggleFindActive {{{1
+function s:ToggleFindActive()
+ let g:bufExplorerFindActive = !g:bufExplorerFindActive
+ call s:UpdateHelpStatus()
+endfunction
+
+" RebuildBufferList {{{1
+function s:RebuildBufferList(...)
+ setlocal modifiable
+
+ let curPos = getpos('.')
+
+ if a:0
+ " Clear the list first.
+ exec "keepjumps ".s:firstBufferLine.',$d "_'
+ endif
+
+ let num_bufs = s:BuildBufferList()
+
+ call setpos('.', curPos)
+
+ setlocal nomodifiable
+
+ return num_bufs
+endfunction
+
+" UpdateHelpStatus {{{1
+function s:UpdateHelpStatus()
+ setlocal modifiable
+
+ let text = s:GetHelpStatus()
+ call setline(s:firstBufferLine - 2, text)
+
+ setlocal nomodifiable
+endfunction
+
+" MRUCmp {{{1
+function s:MRUCmp(line1, line2)
+ return index(s:MRUList, str2nr(a:line1)) - index(s:MRUList, str2nr(a:line2))
+endfunction
+
+" SortReverse {{{1
+function s:SortReverse()
+ let g:bufExplorerReverseSort = !g:bufExplorerReverseSort
+
+ call s:ReSortListing()
+endfunction
+
+" SortSelect {{{1
+function s:SortSelect()
+ let g:bufExplorerSortBy = get(s:sort_by, index(s:sort_by, g:bufExplorerSortBy) + 1, s:sort_by[0])
+
+ call s:ReSortListing()
+endfunction
+
+" ReSortListing {{{1
+function s:ReSortListing()
+ setlocal modifiable
+
+ let curPos = getpos('.')
+
+ call s:SortListing()
+ call s:UpdateHelpStatus()
+
+ call setpos('.', curPos)
+
+ setlocal nomodifiable
+endfunction
+
+" SortListing {{{1
+function s:SortListing()
+ let sort = s:firstBufferLine.",$sort".((g:bufExplorerReverseSort == 1) ? "!": "")
+
+ if g:bufExplorerSortBy == "number"
+ " Easiest case.
+ exec sort 'n'
+ elseif g:bufExplorerSortBy == "name"
+ if g:bufExplorerSplitOutPathName
+ exec sort 'ir /\d.\{7}\zs\f\+\ze/'
+ else
+ exec sort 'ir /\zs[^\/\\]\+\ze\s*line/'
+ endif
+ elseif g:bufExplorerSortBy == "fullpath"
+ if g:bufExplorerSplitOutPathName
+ " Sort twice - first on the file name then on the path.
+ exec sort 'ir /\d.\{7}\zs\f\+\ze/'
+ endif
+
+ exec sort 'ir /\zs\f\+\ze\s\+line/'
+ elseif g:bufExplorerSortBy == "extension"
+ exec sort 'ir /\.\zs\w\+\ze\s/'
+ elseif g:bufExplorerSortBy == "mru"
+ let l = getline(s:firstBufferLine, "$")
+
+ call sort(l, "<SID>MRUCmp")
+
+ if g:bufExplorerReverseSort
+ call reverse(l)
+ endif
+
+ call setline(s:firstBufferLine, l)
+ endif
+endfunction
+
+" MRUListShow {{{1
+function s:MRUListShow()
+ echomsg "MRUList=".string(s:MRUList)
+endfunction
+
+" Error {{{1
+function s:Error(msg)
+ echohl ErrorMsg | echo a:msg | echohl none
+endfunction
+
+" Warning {{{1
+function s:Warning(msg)
+ echohl WarningMsg | echo a:msg | echohl none
+endfunction
+
+" GetTabNbr {{{1
+function s:GetTabNbr(bufNbr)
+ " Searching buffer bufno, in tabs.
+ for i in range(tabpagenr("$"))
+ if index(tabpagebuflist(i + 1), a:bufNbr) != -1
+ return i + 1
+ endif
+ endfor
+
+ return 0
+endfunction
+
+" GetWinNbr" {{{1
+function s:GetWinNbr(tabNbr, bufNbr)
+ " window number in tabpage.
+ return index(tabpagebuflist(a:tabNbr), a:bufNbr) + 1
+endfunction
+
+" Winmanager Integration {{{1
+let g:BufExplorer_title = "\[Buf\ List\]"
+call s:Set("g:bufExplorerResize", 1)
+call s:Set("g:bufExplorerMaxHeight", 25) " Handles dynamic resizing of the window.
+
+" Function to start display. Set the mode to 'winmanager' for this buffer.
+" This is to figure out how this plugin was called. In a standalone fashion
+" or by winmanager.
+function BufExplorer_Start()
+ let b:displayMode = "winmanager"
+ call StartBufExplorer("e")
+endfunction
+
+" Returns whether the display is okay or not.
+function BufExplorer_IsValid()
+ return 0
+endfunction
+
+" Handles dynamic refreshing of the window.
+function BufExplorer_Refresh()
+ let b:displayMode = "winmanager"
+ call StartBufExplorer("e")
+endfunction
+
+function BufExplorer_ReSize()
+ if !g:bufExplorerResize
+ return
+ end
+
+ let nlines = min([line("$"), g:bufExplorerMaxHeight])
+
+ exe nlines." wincmd _"
+
+ " The following lines restore the layout so that the last file line is also
+ " the last window line. Sometimes, when a line is deleted, although the
+ " window size is exactly equal to the number of lines in the file, some of
+ " the lines are pushed up and we see some lagging '~'s.
+ let pres = getpos(".")
+
+ exe $
+
+ let _scr = &scrolloff
+ let &scrolloff = 0
+
+ normal! z-
+
+ let &scrolloff = _scr
+
+ call setpos(".", pres)
+endfunction
+"1}}}
+
+" vim:ft=vim foldmethod=marker sw=2