From 4e08b3e94927378bbc3e6510a4880227fc211792 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Mon, 3 Mar 2014 15:38:10 -0800 Subject: [PATCH] update bufexplorer --- config/.vim/plugin/bufexplorer.vim | 1667 +++++++++++++++++----------- 1 file changed, 1028 insertions(+), 639 deletions(-) diff --git a/config/.vim/plugin/bufexplorer.vim b/config/.vim/plugin/bufexplorer.vim index b109e3e..2423744 100644 --- a/config/.vim/plugin/bufexplorer.vim +++ b/config/.vim/plugin/bufexplorer.vim @@ -1,16 +1,42 @@ "============================================================================= -" Copyright: Copyright (C) 2001-2007 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. +" Copyright: Copyright (c) 2001-2013, Jeff Lanzarotta +" All rights reserved. +" +" Redistribution and use in source and binary forms, with or +" without modification, are permitted provided that the +" following conditions are met: +" +" * Redistributions of source code must retain the above +" copyright notice, this list of conditions and the following +" disclaimer. +" +" * Redistributions in binary form must reproduce the above +" copyright notice, this list of conditions and the following +" disclaimer in the documentation and/or other materials +" provided with the distribution. +" +" * Neither the name of the {organization} nor the names of its +" contributors may be used to endorse or promote products +" derived from this software without specific prior written +" permission. +" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +" CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. " Name Of File: bufexplorer.vim " Description: Buffer Explorer Vim Plugin " Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com) -" Last Changed: Friday, 21 December 2007 +" Last Changed: Tuesday, 22 October 2013 " Version: See g:bufexplorer_version for version number. " Usage: This file should reside in the plugin directory and be " automatically sourced. @@ -18,808 +44,1171 @@ " You may use the default keymappings of " " be - Opens BufExplorer +" 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 +" ":BufExplorer" - Opens BufExplorer +" ":BufExplorerHorizontalSplit" - Opens horizontally window BufExplorer +" ":BufExplorerVerticalSplit" - 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 +" 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.1.7" +let g:bufexplorer_version = "7.4.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 bx :BufExplorer - -" Create commands {{{1 -command BufExplorer :call StartBufExplorer(has ("gui") ? "drop" : "hide edit") - -" 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 +" Create commands {{{2 +command! BufExplorer :call BufExplorer() +command! BufExplorerHorizontalSplit :call BufExplorerHorizontalSplit() +command! BufExplorerVerticalSplit :call BufExplorerVerticalSplit() + +" Set {{{2 +function! s:Set(var, default) + if !exists(a:var) + if type(a:default) + execute "let" a:var "=" string(a:default) + else + execute "let" a:var "=" a:default + endif + + return 1 endif - return 1 - endif - - return 0 + 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? - -" 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 -" 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 = [] +" 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 TabEnter * call s:TabEnter() + autocmd SessionLoadPost * call s:Reset() + augroup END +endfunction - " 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) +" 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 - autocmd BufWinEnter \[BufExplorer\] call s:Initialize() - autocmd BufWinLeave \[BufExplorer\] call s:Cleanup() +" 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 -" ActivateBuffer {{{1 -function s:ActivateBuffer() - let b = bufnr("%") - let l = get(s:tabSpace, tabpagenr(), []) +" DeactivateBuffer {{{2 +function! s:DeactivateBuffer(remove) + let _bufnr = str2nr(expand("")) + call s:MRUPop(_bufnr) +endfunction - if empty(l) || index(l, b) == -1 - call add(l, b) - let s:tabSpace[tabpagenr()] = l - endif +" 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 - call s:MRUPush(b) +" MRUPop {{{2 +function! s:MRUPop(bufnr) + call filter(s:MRUList, 'v:val != '.a:bufnr) 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) +" 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 a:remove - call s:MRUPop(bufnr(expand(""))) - end + " Remove the buffer number from the list if it already exists. + call s:MRUPop(a:buf) - "echom "MRU after:" string(s:MRUList) + " 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) -endfunction +" ShouldIgnore {{{2 +function! s:ShouldIgnore(buf) + " Ignore temporary buffers with buftype set. + if empty(getbufvar(a:buf, "&buftype") == 0) + return 1 + endif -" 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 + " 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 - call s:MRUPop(a:buf) - call insert(s:MRUList,a:buf) + " Else return 0 to indicate that the buffer was not ignored. + return 0 endfunction -" Initialize {{{1 -function s:Initialize() - let s:_insertmode = &insertmode - set noinsertmode +" Initialize {{{2 +function! s:Initialize() + let s:_insertmode = &insertmode + set noinsertmode - let s:_showcmd = &showcmd - set noshowcmd + let s:_showcmd = &showcmd + set noshowcmd - let s:_cpo = &cpo - set cpo&vim + let s:_cpo = &cpo + set cpo&vim - let s:_report = &report - let &report = 10000 + 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 + +" Cleanup {{{2 +function! s:Cleanup() + if exists("s:_insertmode") + let &insertmode = s:_insertmode + endif + + if exists("s:_showcmd") + let &showcmd = s:_showcmd + endif + + if exists("s:_cpo") + let &cpo = s:_cpo + endif - setlocal nonumber - setlocal foldcolumn=0 - setlocal nofoldenable - setlocal cursorline - setlocal nospell + if exists("s:_report") + let &report = s:_report + endif - set nobuflisted + let s:running = 0 + let s:splitMode = "" - let s:running = 1 + delmarks! 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 +" BufExplorerHorizontalSplit {{{2 +function! BufExplorerHorizontalSplit() + let s:splitMode = "sp" + execute "BufExplorer" +endfunction - delmarks! +" BufExplorerVerticalSplit {{{2 +function! BufExplorerVerticalSplit() + let s:splitMode = "vsp" + execute "BufExplorer" endfunction -" StartBufExplorer {{{1 -function StartBufExplorer(open) - let name = '[BufExplorer]' +" BufExplorer {{{2 +function! BufExplorer() + 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 + 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 + " Make sure there is only one explorer open at a time. + if s:running == 1 + " Go to the open buffer. + if has("gui") + execute "drop" name + 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:Warn("Sorry, there are no more buffers to explore") - - return - 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() - 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 + return + endif - for buf in split(bufoutput, '\n') - let bits = split(buf, '"') - let b = {"attributes": bits[0], "line": substitute(bits[2], '\s*', '', '')} + " Add zero to ensure the variable is treated as a number. + let s:originBuffer = bufnr("%") + 0 - for [key, val] in items(s:types) - let b[key] = fnamemodify(bits[1], val) - endfor + silent let s:raw_buffer_listing = s:GetBufferInfo(0) - if getftype(b.fullname) == "dir" && g:bufExplorerShowDirectories == 1 - let b.shortname = "" - end + " We may have to split the current window. + if s:splitMode != "" + " Save off the original settings. + let [_splitbelow, _splitright] = [&splitbelow, &splitright] - call add(all, b) + " Set the setting to ours. + let [&splitbelow, &splitright] = [g:bufExplorerSplitBelow, g:bufExplorerSplitRight] + let _size = (s:splitMode == "sp") ? g:bufExplorerSplitHorzSize : g:bufExplorerSplitVertSize - for n in keys(s:types) - call add(allwidths[n], len(b[n])) + " Split the window either horizontally or vertically. + if _size <= 0 + execute 'keepalt ' . s:splitMode + else + execute 'keepalt ' . _size . s:splitMode + endif - if b.attributes !~ "u" - call add(listedwidths[n], len(b[n])) - endif - endfor - endfor + " Restore the original settings. + let [&splitbelow, &splitright] = [_splitbelow, _splitright] + endif - let [s:allpads, s:listedpads] = [{}, {}] + 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 + execute "silent keepjumps hide edit".name + endif - for n in keys(s:types) - let s:allpads[n] = repeat(' ', max(allwidths[n])) - let s:listedpads[n] = repeat(' ', max(listedwidths[n])) - endfor + call s:DisplayBufferList() - return all + " 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 -" BuildBufferList {{{1 -function s:BuildBufferList() - let lines = [] +" 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() + + " Wipe out any existing lines in case BufExplorer buffer exists and the + " user had changed any global settings that might reduce the number of + " lines needed in the buffer. + keepjumps 1,$d _ - " 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 + call setline(1, s:CreateHelp()) + call s:BuildBufferList() + call cursor(s:firstBufferLine, 1) + + if !g:bufExplorerResize + normal! zz endif - let line = buf.attributes." " + setlocal nomodifiable +endfunction - 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 +" MapKeys {{{2 +function! s:MapKeys() + if exists("b:displayMode") && b:displayMode == "winmanager" + nnoremap :call SelectBuffer() endif - let pads = (g:bufExplorerShowUnlisted) ? s:allpads : s:listedpads + nnoremap