From 616a093f1251903a51db0e1247888f5614ca2ed8 Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Mon, 14 Jan 2013 11:12:47 -0200 Subject: Updating bufexplorer vim plugin --- modules/vim/vim/doc/bufexplorer.txt | 147 ++- modules/vim/vim/plugin/bufexplorer.vim | 1628 +++++++++++++++++++------------- 2 files changed, 1084 insertions(+), 691 deletions(-) (limited to 'modules/vim') diff --git a/modules/vim/vim/doc/bufexplorer.txt b/modules/vim/vim/doc/bufexplorer.txt index 9af0682..5d2fbcf 100644 --- a/modules/vim/vim/doc/bufexplorer.txt +++ b/modules/vim/vim/doc/bufexplorer.txt @@ -1,12 +1,13 @@ -*bufexplorer.txt* Buffer Explorer Last Change: 19 Nov 2008 +*bufexplorer.txt* Buffer Explorer Last Change: 23 Dec 2012 Buffer Explorer *buffer-explorer* *bufexplorer* - Version 7.2.2 + Version 7.3.2 Plugin for easily exploring (or browsing) Vim |:buffers|. -|bufexplorer-usage| Usage |bufexplorer-installation| Installation +|bufexplorer-usage| Usage +|bufexplorer-windowlayout| Window Layout |bufexplorer-customization| Customization |bufexplorer-changelog| Change Log |bufexplorer-todo| Todo @@ -27,7 +28,7 @@ To install: - Start Vim or goto an existing instance of Vim. - Execute the following command: > - :helptag /doc < This will generate all the help tags for any file located in the doc directory. @@ -36,11 +37,11 @@ To install: USAGE *bufexplorer-usage* To start exploring in the current window, use: > - \be OR :BufExplorer + \be or :BufExplorer or Your custom key mapping To start exploring in a newly split horizontal window, use: > - \bs or :HSBufExplorer + \bs or :BufExplorerHorizontalSplit or Your custom key mapping To start exploring in a newly split vertical window, use: > - \bv or :VSBufExplorer + \bv or :BufExplorerVerticalSplit or Your custom key mapping If you would like to use something other than '\', you may simply change the leader (see |mapleader|). @@ -51,27 +52,36 @@ Note: If the current buffer is modified when bufexplorer started, the current Commands to use once exploring: + Toggle help information. Opens the buffer that is under the cursor into the current window. - Toggle help information. Opens the buffer that is under the cursor into the current window. 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. + B Works in association with the|ShowTabBuffer|option. If + |ShowTabBuffer|is set to 1, this toggles if BufExplorer is to + only store the most recent tab for this buffer or not. + 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. + 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. f Toggles whether you are taken to the active window when selecting a buffer or not. + o Opens the buffer that is under the cursor into the current + window. p Toggles the showing of a split filename/pathname. - q Quit exploring. + q Exit/Close bufexplorer. 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 + s Cycle thru how the buffers are listed. Either by buffer number, file name, file extension, most recently used (MRU), or full path. + S Cycle thru how the buffers are listed, in reverse order. + Either by buffer number, file name, file extension, most + recently used (MRU), or full path. + T Toggles to show only buffers for this tab or not. t Opens the buffer that is under the cursor in another tab. u Toggles the showing of "unlisted" buffers. @@ -82,9 +92,38 @@ 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... +=============================================================================== +WINDOW LAYOUT *bufexplorer-windowlayout* + +------------------------------------------------------------------------------- +" Press for Help +" Sorted by mru | Locate buffer | Absolute Split path +"= + 01 %a bufexplorer.txt C:\Vim\vimfiles\doc line 87 + 02 # bufexplorer.vim c:\Vim\vimfiles\plugin line 1 +------------------------------------------------------------------------------- + | | | | | + | | | | +-- Current Line #. + | | | +-- Relative/Full Path + | | +-- Buffer Name. + | +-- Buffer Attributes. See|:buffers|for more information. + +-- Buffer Number. See|:buffers|for more information. + =============================================================================== CUSTOMIZATION *bufexplorer-customization* +If you do not like the default key mappings of \be, \bs, and \bv, you can +override bufexplorer's default mappings by setting up something like the +following in your vimrc file: + + noremap :BufExplorer + noremap :BufExplorerHorizontalSplit + noremap :BufExplorerVerticalSplit + + *g:bufExplorerChgWin* +If set, bufexplorer will bring up the selected buffer in the window specified +by g:bufExplorerChgWin. + *g:bufExplorerDefaultHelp* To control whether the default help is displayed or not, use: > let g:bufExplorerDefaultHelp=0 " Do not show default help. @@ -104,6 +143,10 @@ use: > let g:bufExplorerFindActive=1 " Go to active window. The default is to be taken to the active window. + *g:bufExplorerFuncRef* +When a buffer is selected, the functions specified either singly or as a list +will be called. + *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. @@ -124,6 +167,12 @@ directory, use: > let g:bufExplorerShowRelativePath=1 " Show relative paths. The default is to show absolute paths. + *g:bufExplorerShowTabBuffer* +To control weither or not to show buffers on for the specific tab or not, use: > + let g:bufExplorerShowTabBuffer=0 " No. + let g:bufExplorerShowTabBuffer=1 " Yes. +The default is not to show. + *g:bufExplorerShowUnlisted* To control whether to show unlisted buffer or not, use: > let g:bufExplorerShowUnlisted=0 " Do not show unlisted buffers. @@ -164,11 +213,68 @@ The default is to use the global &splitright. =============================================================================== CHANGE LOG *bufexplorer-changelog* -7.2.2 - Fix: +7.3.2 - Fix: + * Thanks go out to Michael Henry for pointing out that I completely + missed yet another function, ReverseSortSelect(), during the + refactoring. This function has now returned. +7.3.1 - Fix: + * Thanks go out to Brett Rasmussen for pointing out that the feature + added way back in version 7.2.3 by Yuriy Ershov to automatically + reposition the cursor to the line containing the active buffer, was + no longer in the plugin. That bit of code has been re-added and + all is well. +7.3.0 - It has been quite a while since I published a new version and this + is the first version since Vim 7.3 was released. + * Thanks to Tim Johnson for testing out this new version. + * I have put some time into reworking and cleaning up the code as + * well as various bug fixes. + * I have hopefully allowed for better mapping of the main public + methods as is explained in the|bufexplorer-customization|section + of the documentation. + * Add new 'B', 'o', and 'S' key mappings. + * Overall, I am hopeful that I not forgotten or lost a feature. +7.2.8 - Enhancements: + * Thanks to Charles Campbell for integrating bufexplorer with GDBMGR. + http://mysite.verizon.net/astronaut/vim/index.html#GDBMGR +7.2.7 - Fix: + * My 1st attempt to fix the "cache" issue where buffers information + has changed but the cache/display does not reflect those changes. + More work still needs to be done. +7.2.6 - Fix: + * Thanks to Michael Henry for pointing out that I totally forgot to + update the inline help to reflect the previous change to the 'd' + and 'D' keys. Opps! +7.2.5 - Fix: + * Philip Morant suggested switching the command (bwipe) associated + with the 'd' key with the command (bdelete) associated with the 'D' + key. This made sense since the 'd' key is more likely to be used + compared to the 'D' key. +7.2.4 - Fix: + * I did not implement the patch provided by Godefroid Chapelle + correctly. I missed one line which happened to be the most + important one :) +7.2.3 - Enhancements: + * Thanks to David Fishburn for helping me out with a much needed + code overhaul as well as some awesome performance enhancements. + He also reworked the handling of tabs. + * Thanks to Vladimir Dobriakov for making the suggestions on + enhancing the documentation to include a better explaination of + what is contained in the main bufexplorer window. + * Thanks to Yuriy Ershov for added code that when the bufexplorer + window is opened, the cursor is now positioned at the line with the + active buffer (useful in non-MRU sort modes). + * Yuriy also added the abiltiy to cycle through the sort fields in + reverse order. + Fixes: + * Thanks to Michael Henry for supplying a patch that allows + bufexplorer to be opened even when there is one buffer or less. + * Thanks to Godefroid Chapelle for supplying a patch that fixed + MRU sort order after loading a session. +7.2.2 - Fixes: * 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: +7.2.1 - Fixes: * 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 @@ -419,14 +525,13 @@ CHANGE LOG *bufexplorer-changelog* *compliant*, adding default keymappings of be and 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.2 - Can't remember. (2001-07-25) 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. +- Nothing as of now, buf if you have any suggestions, drop me an email. =============================================================================== CREDITS *bufexplorer-credits* diff --git a/modules/vim/vim/plugin/bufexplorer.vim b/modules/vim/vim/plugin/bufexplorer.vim index fb7aea9..de957d8 100644 --- a/modules/vim/vim/plugin/bufexplorer.vim +++ b/modules/vim/vim/plugin/bufexplorer.vim @@ -1,5 +1,5 @@ "============================================================================= -" Copyright: Copyright (C) 2001-2008 Jeff Lanzarotta +" Copyright: Copyright (C) 2001-2012 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, @@ -10,7 +10,7 @@ " 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 +" Last Changed: Sunday, 23 Dec 2012 " Version: See g:bufexplorer_version for version number. " Usage: This file should reside in the plugin directory and be " automatically sourced. @@ -21,849 +21,1137 @@ " bs - Opens horizontally split window BufExplorer " bv - Opens vertically split window BufExplorer " +" Or you can override the defaults and define your own mapping +" in your vimrc file, for example: +" +" noremap :BufExplorer +" noremap :BufExplorerHorizontalSplit +" noremap :BufExplorerVerticalSplit +" " Or you can use " -" ":BufExplorer" - Opens BufExplorer -" ":HSBufExplorer" - Opens horizontally window BufExplorer -" ":VSBufExplorer" - Opens vertically split window BufExplorer +" ":BufExplorer" - Opens BufExplorer +" ":BufExplorerHorizontalSplit" - Opens horizontally window BufExplorer +" ":BufExplorerVerticalSplit" - Opens vertically split window BufExplorer " " For more help see supplied documentation. " History: See supplied documentation. +" Issues: 'D' and 'd' remove the buffer from the list but the list is not +" displayed correctly. +" - Add ability to open a buffer in a new split when \be is used. "============================================================================= -" Exit quickly if already running or when 'compatible' is set. {{{1 +" Plugin Code {{{1 +" Exit quickly if already running or when 'compatible' is set. {{{2 if exists("g:bufexplorer_version") || &cp - finish + finish endif -"1}}} +"2}}} " Version number -let g:bufexplorer_version = "7.2.2" +let g:bufexplorer_version = "7.3.2" -" Check for Vim version 700 or greater {{{1 +" Check for Vim version {{{2 if v:version < 700 - echo "Sorry, bufexplorer ".g:bufexplorer_version."\nONLY runs with Vim 7.0 and greater." - finish + echohl WarningMsg + echo "Sorry, bufexplorer ".g:bufexplorer_version." required Vim 7.0 and greater." + echohl None + finish endif -" Public Interface {{{1 -nmap be :BufExplorer -nmap bs :HSBufExplorer -nmap bv :VSBufExplorer - -" 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 +" Create commands {{{2 +command! BufExplorer :call BufExplorer(has ("gui") ? "drop" : "hide edit") +command! BufExplorerHorizontalSplit :call BufExplorerHorizontalSplit() +command! BufExplorerVerticalSplit :call BufExplorerVerticalSplit() - return 1 - endif +" Set {{{2 +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 0 -endfunction + return 1 + endif -" 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? + return 0 +endfunction -" Global variables {{{1 +" Script variables {{{2 +let s:MRU_Exclude_List = ["[BufExplorer]","__MRU_Files__"] let s:MRUList = [] +let s:name = '[BufExplorer]' +let s:originBuffer = 0 let s:running = 0 let s:sort_by = ["number", "name", "fullpath", "mru", "extension"] +let s:splitMode = "" 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 +" Setup the autocommands that handle the MRUList and other stuff. {{{2 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) +" Setup {{{2 +function! s:Setup() + call s:Reset() + + " Now that the MRUList is created, add the other autocmds. + augroup BufExplorer + autocmd! + 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() + autocmd BufWinEnter \[BufExplorer\] call s:Initialize() + autocmd BufWinLeave \[BufExplorer\] call s:Cleanup() + + autocmd TabEnter * call s:TabEnter() + + autocmd SessionLoadPost * call s:Reset() + augroup END endfunction -" ActivateBuffer {{{1 -function s:ActivateBuffer() - let b = bufnr("%") - let l = get(s:tabSpace, tabpagenr(), []) +" Reset {{{2 +function! s:Reset() + " Build initial MRUList. This makes sure all the files specified on the + " command line are picked up correctly. + let s:MRUList = range(1, bufnr('$')) + + " Initialize one tab space array, ignore zero-based tabpagenr + " since all tabpagenr's start at 1. + " -1 signifies this is the first time we are referencing this + " tabpagenr. + " If Vim has been loaded with mksession, then it is possible for + " more tabs to exist. So use tabpagenr() to determine how large + " to make the array. If there are 4 tabs, there should be 5 + " elements in this array. + " Each element will hold a CSV list of buffers viewed in + " that tab. So on the 3rd tab, if there user has viewed + " 4 different buffers in that tab, the value would be: + " echo s:tabSpace[3] + " [4, 9, 1, 10] + " echo s:tabSpace + " [[-1], [-1], [-1], [4, 9, 1, 10], [-1]] + let s:tabSpace = [] + let i = 0 + + while( tabpagenr('$') > 0 && i <= tabpagenr('$') ) + call add(s:tabSpace, [-1]) + let i = i + 1 + endwhile +endfunction - if empty(l) || index(l, b) == -1 - call add(l, b) - let s:tabSpace[tabpagenr()] = l - endif +" ActivateBuffer {{{2 +function! s:ActivateBuffer() + " Verify the current tabpage exists in the + " current s:tabSpace array. This can be missing + " entries when restoring sessions. + let i = 0 + while( tabpagenr('$') > 0 && i <= tabpagenr() ) + " Number: 0 + " String: 1 + " Funcref: 2 + " List: 3 + " Dictionary: 4 + " Float: 5 + if type(get(s:tabSpace, i)) == 0 + call add(s:tabSpace, [-1]) + endif + + let i = i + 1 + endwhile + + let _bufnr = bufnr("%") + let list = get(s:tabSpace, tabpagenr(), [-1]) + + if !empty(list) && list[0] == '-1' + " The first time we add a tab, Vim uses the current buffer + " as it's starting page. Even though we are about to + " edit a new page (BufEnter is triggered after), so + " remove the -1 entry indicating we have covered this case. + let list = [] + call add(list, _bufnr) + let s:tabSpace[tabpagenr()] = list + elseif empty(list) || index(list, _bufnr) == -1 + " Add new buffer to this tab's buffer list. + call add(list, _bufnr) + let s:tabSpace[tabpagenr()] = list + + if g:bufExplorerOnlyOneTab == 1 + " If a buffer can only be available in 1 tab page ensure this + " buffer is not present in any other tabs + let tabidx = 1 + while tabidx < len(s:tabSpace) + if tabidx != tabpagenr() + let bufidx = index(s:tabSpace[tabidx], _bufnr) + if bufidx != -1 + call remove(s:tabSpace[tabidx], bufidx) + endif + endif + let tabidx = tabidx + 1 + endwhile + endif + endif + + call s:MRUPush(_bufnr) +endfunction + +" DeactivateBuffer {{{2 +function! s:DeactivateBuffer(remove) + let _bufnr = str2nr(expand("")) + call s:MRUPop(_bufnr) +endfunction - call s:MRUPush(b) +" TabEnter {{{2 +function! s:TabEnter() + " Make s:tabSpace 1-based + if empty(s:tabSpace) || len(s:tabSpace) < (tabpagenr() + 1) + call add(s:tabSpace, [-1]) + endif endfunction -" DeactivateBuffer {{{1 -function s:DeactivateBuffer(remove) - "echom "afile:" expand("") - "echom "bufnr, afile:" bufnr(expand("")) - "echom "buffers:" string(tabpagebuflist()) - "echom "MRU before:" string(s:MRUList) +" MRUPop {{{2 +function! s:MRUPop(bufnr) + call filter(s:MRUList, 'v:val != '.a:bufnr) +endfunction - let _bufnr = bufnr(expand("")) - let _buftype = getbufvar(_bufnr, "&buftype") +" MRUPush {{{2 +function! s:MRUPush(buf) + " Skip temporary buffer with buftype set. Don't add the BufExplorer window to the + " list. + if s:ShouldIgnore(a:buf) == 1 + return + endif - if empty(_buftype) || _buftype == "nofile" || !buflisted(_bufnr) || empty(bufname(_bufnr)) || fnamemodify(bufname(_bufnr), ":t") == "[BufExplorer]" - return - end + " Remove the buffer number from the list if it already exists. + call s:MRUPop(a:buf) - if a:remove - call s:MRUPop(bufnr(expand(""))) - end + " Add the buffer number to the head of the list. + call insert(s:MRUList, a:buf) endfunction -" MRUPop {{{1 -function s:MRUPop(buf) - call filter(s:MRUList, 'v:val != '.a:buf) +" ShouldIgnore {{{2 +function! s:ShouldIgnore(buf) + " Ignore temporary buffers with buftype set. + if empty(getbufvar(a:buf, "&buftype") == 0) + return 1 + endif + + " Ignore unlisted buffers. + if buflisted(a:buf) == 0 + return 1 + endif + + " Ignore buffers with no name. + if empty(bufname(a:buf)) == 1 + return 1 + endif + + " Ignore the BufExplorer buffer. + if fnamemodify(bufname(a:buf), ":t") == s:name + return 1 + endif + + " Ignore any buffers in the exclude list. + if index(s:MRU_Exclude_List, bufname(a:buf)) >= 0 + return 1 + endif + + " Else return 0 to indicate that the buffer was not ignored. + return 0 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) +" Initialize {{{2 +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 + + setlocal nobuflisted + + let s:running = 1 endfunction -" Initialize {{{1 -function s:Initialize() - let s:_insertmode = &insertmode - set noinsertmode +" Cleanup {{{2 +function! s:Cleanup() + if exists("s:_insertmode") + let &insertmode = s:_insertmode + endif + + if exists("s:_showcmd") + let &showcmd = s:_showcmd + endif - let s:_showcmd = &showcmd - set noshowcmd + if exists("s:_cpo") + let &cpo = s:_cpo + endif - let s:_cpo = &cpo - set cpo&vim + if exists("s:_report") + let &report = s:_report + endif - let s:_report = &report - let &report = 10000 + if exists("s:_list") + let &list = s:_list + endif - let s:_list = &list - set nolist + let s:running = 0 + let s:splitMode = "" - setlocal nonumber - setlocal foldcolumn=0 - setlocal nofoldenable - setlocal cursorline - setlocal nospell + delmarks! +endfunction - set nobuflisted +" BufExplorerHorizontalSplit {{{2 +function! BufExplorerHorizontalSplit() + let s:splitMode = "sp" + exec "BufExplorer" +endfunction - let s:running = 1 +" BufExplorerVerticalSplit {{{2 +function! BufExplorerVerticalSplit() + let s:splitMode = "vsp" + exec "BufExplorer" 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 = "" +" BufExplorer {{{2 +function! BufExplorer(open) + let name = s:name + + 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 + + " Add zero to ensure the variable is treated as a number. + let s:originBuffer = bufnr("%") + 0 + + silent let s:raw_buffer_listing = s:GetBufferInfo(0) + + let buffer_listing_copy = copy(s:raw_buffer_listing) + + if (g:bufExplorerShowUnlisted == 0) + call filter(buffer_listing_copy, 'v:val.attributes !~ "u"') + endif + + if (!empty(buffer_listing_copy)) + call filter(buffer_listing_copy, 'v:val.shortname !~ "\\\[No Name\\\]"') + endif + +" if len(buffer_listing_copy) <= 1 +" 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 'keepalt '.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 - delmarks! + call s:DisplayBufferList() + + " Position the cursor in the newly displayed list on the line representing + " the active buffer. The active buffer is the line with the '%' character + " in it. + execute search("%") endfunction -" HorizontalSplitBufExplorer {{{1 -function HorizontalSplitBufExplorer() - let s:splitMode = "sp" - exec "BufExplorer" +" DisplayBufferList {{{2 +function! s:DisplayBufferList() + " Do not set bufhidden since it wipes out the data if we switch away from + " the buffer using CTRL-^. + 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 -" 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 :call SelectBuffer("tab") - endif - - nnoremap :call ToggleHelp() - nnoremap <2-leftmouse> :call SelectBuffer() - nnoremap :call SelectBuffer() - nnoremap t :call SelectBuffer("tab") - nnoremap :call SelectBuffer("tab") - nnoremap d :call RemoveBuffer("wipe") - nnoremap D :call RemoveBuffer("delete") - nnoremap m :call MRUListShow() - nnoremap p :call ToggleSplitOutPathName() - nnoremap q :call Close() - nnoremap r :call SortReverse() - nnoremap R :call ToggleShowRelativePath() - nnoremap s :call SortSelect() - nnoremap u :call ToggleShowUnlisted() - nnoremap f :call ToggleFindActive() - - for k in ["G", "n", "N", "L", "M", "H"] - exec "nnoremap " k ":keepjumps normal!" k."" - 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, '" : toggle this help') - call add(header, '" or Mouse-Double-Click : open buffer under cursor') - call add(header, '" 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 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) +" MapKeys {{{2 +function! s:MapKeys() + if exists("b:displayMode") && b:displayMode == "winmanager" + nnoremap :call SelectBuffer() + endif + + nnoremap