mirror of
1
0
Fork 0

Update bufexplorer.

This commit is contained in:
Kurtis Moxley 2022-05-19 21:23:44 +08:00
parent 05df43cd04
commit 3d5fd32152
6 changed files with 238 additions and 572 deletions

View File

@ -1,6 +0,0 @@
# Ignore generated tags
/doc/tags
dist.bat
*.zip
tags
*.sw[a-p]

View File

@ -1,27 +0,0 @@
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.

View File

@ -0,0 +1,20 @@
This is a mirror of http://www.vim.org/scripts/script.php?script_id=42
With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces:
'\be' (normal open) or
'\bs' (force horizontal split open) or
'\bv' (force vertical split open)
Once the bufexplorer window is open you can use the normal movement keys (hjkl) to move around and then use <Enter> or <Left-Mouse-Click> to select the buffer you would like to open. If you would like to have the selected buffer opened in a new tab, simply press either <Shift-Enter> or 't'. Please note that when opening a buffer in a tab, that if the buffer is already in another tab, bufexplorer can switch to that tab automatically for you if you would like. More about that in the supplied VIM help.
Bufexplorer also offers various options including:
- Display the list of buffers in various sort orders including:
- Most Recently Used (MRU) which is the default
- Buffer number
- File name
- File extension
- Full file path name
- Delete buffer from list
For more about options, sort orders, configuration options, etc. please see the supplied VIM help.

View File

@ -1,99 +0,0 @@
bufexplorer
===========
BufExplorer Plugin for Vim
With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces:
`\<Leader\>be` normal open
`\<Leader\>bt` toggle open / close
`\<Leader\>bs` force horizontal split open
`\<Leader\>bv` force vertical split open
Once the bufexplorer window is open you can use the normal movement keys (hjkl) to move around and then use <Enter> or <Left-Mouse-Click> to select the buffer you would like to open. If you would like to have the selected buffer opened in a new tab, simply press either <Shift-Enter> or 't'. Please note that when opening a buffer in a tab, that if the buffer is already in another tab, bufexplorer can switch to that tab automatically for you if you would like. More about that in the supplied VIM help.
Bufexplorer also offers various options including:
- Display the list of buffers in various sort orders including:
- Most Recently Used (MRU) which is the default
- Buffer number
- File name
- File extension
- Full file path name
- Delete buffer from list
For more about options, sort orders, configuration options, etc. please see the supplied VIM help.
## vim.org
This plugin can also be found at http://www.vim.org/scripts/script.php?script_id=42.
## Installation
### Manually
1. If you do not want to use one of the the bundle handlers, you can take the
zip file from vim.org and unzip it and copy the plugin to your vimfiles\plugin
directory and the txt file to your vimfiles\doc directory. If you do that,
make sure you generate the help by executing
`:helptag <your runtime directory>/doc`
Once help tags have been generated, you can view the manual with
`:help bufexplorer`.
### Vundle (https://github.com/gmarik/Vundle.vim)
1. Add the following configuration to your `.vimrc`.
Plugin 'jlanzarotta/bufexplorer'
2. Install with `:BundleInstall`.
### NeoBundle (https://github.com/Shougo/neobundle.vim)
1. Add the following configuration to your `.vimrc`.
NeoBundle 'jlanzarotta/bufexplorer'
2. Install with `:NeoBundleInstall`.
### Plug (https://github.com/junegunn/vim-plug)
1. Add the following configuration to your `.vimrc`.
Plug 'jlanzarotta/bufexplorer'
2. Install with `:PlugInstall`.
### Pathogen
1. Install with the following command.
git clone https://github.com/jlanzarotta/bufexplorer.git ~/.vim/bundle/bufexplorer.vim
## License
Copyright (c) 2001-2021, 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.

View File

@ -1,7 +1,7 @@
*bufexplorer.txt* Buffer Explorer Last Change: 08 Dec 2018
*bufexplorer.txt* Buffer Explorer Last Change: 03 Nov 2014
Buffer Explorer *buffer-explorer* *bufexplorer*
Version 7.4.21
Version 7.4.6
Plugin for easily exploring (or browsing) Vim|:buffers|.
@ -41,24 +41,22 @@ To install:
USAGE *bufexplorer-usage*
To start exploring in the current window, use: >
<Leader>be or :BufExplorer or Your custom key mapping
To toggle bufexplorer on or off in the current window, use: >
<Leader>bt or :ToggleBufExplorer or Your custom key mapping
\be or :BufExplorer or Your custom key mapping
To start exploring in a newly split horizontal window, use: >
<Leader>bs or :BufExplorerHorizontalSplit or Your custom key mapping
\bs or :BufExplorerHorizontalSplit or Your custom key mapping
To start exploring in a newly split vertical window, use: >
<Leader>bv or :BufExplorerVerticalSplit or Your custom key mapping
\bv or :BufExplorerVerticalSplit or Your custom key mapping
If you would like to use something other than the default leader key - '\' -
you may simply change the leader (see |mapleader|).
If you would like to use something other than '\', you may simply change the
leader (see |mapleader|).
When <Leader>bs or <Leader>bv is issued, bufexplorer opens in either a
horizontally or vertically split window. By issuing either of these commands,
the user is telling bufexplorer that they want to split the window and have
bufexplorer show the buffer they are about to select (from the bufexplorer
windows) in the newly split window. When <Leader>be is issued, bufexplorer
opens the bufexplorer contents in the current window and the buffer the user
selects is opened in the current window.
When \bs or \bv is issued, bufexplorer opens in either a horizonally or
vertically split window. By issusing either of these commands, the user is
telling bufexplorer that they want to split the window and have bufexplorer
show the buffer they are about to select (from the bufexplorer windows) in the
newly split window. When \be is issued, bufexplorer opens the bufexplorer
contents in the current window and the buffer the user selects is opened in
the current window.
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
@ -72,20 +70,18 @@ Commands to use once exploring:
<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.
a Toggles whether you are taken to the active window when
selecting a buffer or not.
b Fast buffer switching with b<any bufnum>.
B Works in association with the |ShowTabBuffer| option. If
|ShowTabBuffer| is set to 1, this toggles if BufExplorer is to
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
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
buffer is wiped, it will not be shown when unlisted buffers are
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 Open selected buffer in another window above the current.
f Open selected buffer in another window below the current.
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.
@ -101,14 +97,12 @@ Commands to use once exploring:
t Opens the buffer that is under the cursor in another tab.
T Toggles to show only buffers for this tab or not.
u Toggles the showing of "unlisted" buffers.
V Open the selected buffer in another window on the left of the current.
v Open the selected buffer in another window on the right of the current.
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
you can then either open it, close it(delete), resort the list, reverse
the sort, quit exploring and so on...
===============================================================================
@ -125,18 +119,17 @@ WINDOW LAYOUT *bufexplorer-windowlayout*
| | | | +-- Current Line #.
| | | +-- Relative/Full Path
| | +-- Buffer Name.
| +-- Buffer Attributes. See |:buffers| for more information.
+-- Buffer Number. See |:buffers| for more information.
| +-- 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 <Leader>be, <Leader>bs, and
<Leader>bv, you can override bufexplorer's default mappings by setting up
something like the following in your vimrc file:
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:
nnoremap <silent> <F11> :BufExplorer<CR>
nnoremap <silent> <s-F11> :ToggleBufExplorer<CR>
nnoremap <silent> <m-F11> :BufExplorerHorizontalSplit<CR>
nnoremap <silent> <c-F11> :BufExplorerVerticalSplit<CR>
@ -200,13 +193,13 @@ directory, use: >
The default is to show absolute paths.
*g:bufExplorerShowTabBuffer*
To control whether or not to show buffers on for the specific tab or not, use: >
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 buffers or not, use: >
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.
@ -249,79 +242,14 @@ current window, use: >
The default is to use the global &splitright.
*g:bufExplorerSplitVertSize*
To control the size of the new vertical split window, use: >
let g:bufExplorerSplitVertSize=n " New split window is n columns wide.
let g:bufExplorerSplitVertSize=0 " New split windows size set by Vim.
To control the size of the new vertical split window. use: >
let g:bufExplorerVertSize=n " New split window is n columns wide.
let g:bufExplorerVertSize=0 " New split windows size set by Vim.
The default is 0, so that the size is set by Vim.
*g:bufExplorerVersionWarn*
To control whether to warning about Vim version or not, use: >
let g:bufExplorerVersionWarn=1 " Warn if version conflict.
let g:bufExplorerVersionWarn=0 " Do not warn if version conflict.
The default is 1.
===============================================================================
CHANGE LOG *bufexplorer-changelog*
7.4.21 December 8, 2018
- Merged in changes from adelarsq that introduced ryanoasis/vim-devicons
support. If the global g:loaded_webdevicons has been set, bufexplorer
will now load the associated dev icons for each buffer.
7.4.20 January 18, 2017
- Thanks to jpflouret for supplying code that can remove the warning
messages if you using this plugin on an older version of Vim. The
global variable is g:bufExplorerVersionWarn.
7.4.19 September 18, 2017
- Merged all changes from github back into this version and tried to sync
to the correct version number.
7.4.18 - Github.
7.4.17 - Github.
7.4.16 August 14, 2017
- Thanks to Yubo Su for the patch that adds 'f, F, V, and v' commands.
With this change, the original 'f' command was remapped to 'a'.
The set of commands that can be used during exploring are:
F - Open selected buffer in another window above the current.
f - Open selected buffer in another window below the current.
V - Open the selected buffer in another window on the left of the
current.
v - Open the selected buffer in another window on the right of the
current.
7.4.15 May 01, 2017
- Finally applied the patch submitted by justfalter. This patch is a
backward-compatible fix for the "invalid tab range" bug.
7.4.14 April 10, 2017
- As suggested by adelarsq way back on January 5th, 2016, a filetype has
been added. There is now 'filetype=bufexplorer'.
7.4.13 March 08, 2017
- Thanks to devakivamsi for pointing out that even though bufexplorer
turns off line numbers by default within its own window, this did not
work correctly when using WinManager. This has now been corrected.
7.4.12 September 30, 2016
- Thanks again to Martin Vuille for several more fixes related to making
bufexplorer more tab-friendly.
7.4.11 September, 20, 2016
- Thanks to Martin Vuille for reworking the per-tab buffer listing code.
Fix for g:bufExplorerShowTabBuffer is not working correctly and other
"gliches" when the ShotTabBuffer option is enabled. For example old
code would not correctly handle adding/deleting a tab that wasn't the
highest-numbered tab.
7.4.10 August 26, 2016
- Thanks to buddylindsey for fixing a misspelling in the docs.
7.4.9 April 01, 2016
- Thanks to ivegotasthma for supplying a patch to fix a major issue with
plugin performance when lots of buffers are open.
- Thanks to ershov for the patch to fix grouping of files in ambiguous
sort modes.
- Thanks to PhilRunninger for changing documentation to use <Leader>, in
place of '\'.
7.4.8 January 27, 2015
- Thanks to Marius Gedminas for fixing up the documentation and correcting
various typos.
7.4.7 January 20, 2015
- Thanks goes out to Phil Runninger for added the ability to toggle the
bufexplorer list on and off using the :ToggleBufExplorer command, the
map <Leader>bt, and the function ToggleBufExplorer().
7.4.6 November 03, 2014
- Not sure how, but the file format was converted to Dos instead of Unix.
I converted the file back to Unix.
@ -347,7 +275,7 @@ CHANGE LOG *bufexplorer-changelog*
- First update related to Vim 7.4.
- Changed license text.
- Fixed issue with 'hidden'. If 'hidden' is set, make sure that
g:bufExplorerFindActive is set to 0. Otherwise, when using \bs or \bv,
g:bufExplorerFindActive is set to 0. Otherwise, when using /bs or /bv,
and selecting a buffer, the original buffer will be switched to instead
of being opened in the newly created windows.
- Added new 'b' mapping when the bufExplorer window is opened. When 'b'
@ -404,7 +332,7 @@ CHANGE LOG *bufexplorer-changelog*
fixes. Overall, I am hopeful that I not forgotten or lost a feature.
- Thanks to Tim Johnson for testing out this new version.
- I have hopefully allowed for better mapping of the main public
methods as is explained in the |bufexplorer-customization| section
methods as is explained in the|bufexplorer-customization|section
of the documentation.
- Add new 'B', 'o', and 'S' key mappings.
7.2.8 November 08, 2010
@ -575,7 +503,7 @@ CHANGE LOG *bufexplorer-changelog*
- Dave Eggum has made some 'significant' updates to this latest
version:
* Added BufExplorerGetAltBuf() global function to be used in the
user's rulerformat.
users rulerformat.
* Added g:bufExplorerSplitRight option.
* Added g:bufExplorerShowRelativePath option with mapping.
* Added current line highlighting.
@ -702,7 +630,7 @@ CHANGE LOG *bufexplorer-changelog*
- 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.
need to be performed when starting or leaving bufexplorer.
6.0.15 February 20, 2002
- Srinath Avadhanulax added a patch for winmanager.vim.
6.0.14 February 19, 2002
@ -764,7 +692,7 @@ TODO *bufexplorer-todo*
===============================================================================
CREDITS *bufexplorer-credits*
Author: Jeff Lanzarotta <delux256-vim at outlook dot com>
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
@ -774,7 +702,7 @@ won't list names.
===============================================================================
COPYRIGHT *bufexplorer-copyright*
Copyright (c) 2001-2017, Jeff Lanzarotta
Copyright (c) 2001-2014, Jeff Lanzarotta
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@ -1,5 +1,5 @@
"============================================================================
" Copyright: Copyright (c) 2001-2018, Jeff Lanzarotta
"=============================================================================
" Copyright: Copyright (c) 2001-2014, Jeff Lanzarotta
" All rights reserved.
"
" Redistribution and use in source and binary forms, with or
@ -35,8 +35,8 @@
" 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 outlook dot com)
" Last Changed: Saturday, 08 December 2018
" Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com)
" Last Changed: Monday, 03 November 2014
" Version: See g:bufexplorer_version for version number.
" Usage: This file should reside in the plugin directory and be
" automatically sourced.
@ -44,7 +44,6 @@
" You may use the default keymappings of
"
" <Leader>be - Opens BufExplorer
" <Leader>bt - Toggles BufExplorer open or closed
" <Leader>bs - Opens horizontally split window BufExplorer
" <Leader>bv - Opens vertically split window BufExplorer
"
@ -52,14 +51,12 @@
" in your vimrc file, for example:
"
" nnoremap <silent> <F11> :BufExplorer<CR>
" nnoremap <silent> <s-F11> :ToggleBufExplorer<CR>
" nnoremap <silent> <m-F11> :BufExplorerHorizontalSplit<CR>
" nnoremap <silent> <c-F11> :BufExplorerVerticalSplit<CR>
"
" Or you can use
"
" ":BufExplorer" - Opens BufExplorer
" ":ToggleBufExplorer" - Opens/Closes BufExplorer
" ":BufExplorerHorizontalSplit" - Opens horizontally window BufExplorer
" ":BufExplorerVerticalSplit" - Opens vertically split window BufExplorer
"
@ -67,45 +64,26 @@
" 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
endif
"1}}}
"2}}}
" Version number
let g:bufexplorer_version = "7.4.21"
let g:bufexplorer_version = "7.4.6"
" Plugin Code {{{1
" Check for Vim version {{{2
if !exists("g:bufExplorerVersionWarn")
let g:bufExplorerVersionWarn = 1
endif
if v:version < 700
if g:bufExplorerVersionWarn
echohl WarningMsg
echo "Sorry, bufexplorer ".g:bufexplorer_version." required Vim 7.0 or greater."
echohl None
endif
finish
endif
" Check to see if the version of Vim has the correct patch applied, if not, do
" not used <nowait>.
if v:version > 703 || v:version == 703 && has('patch1261') && has('patch1264')
" We are good to go.
else
if g:bufExplorerVersionWarn
echohl WarningMsg
echo "Sorry, bufexplorer ".g:bufexplorer_version." required Vim 7.3 or greater with patch1261 and patch1264."
echohl None
endif
echohl WarningMsg
echo "Sorry, bufexplorer ".g:bufexplorer_version." required Vim 7.0 and greater."
echohl None
finish
endif
" Create commands {{{2
command! BufExplorer :call BufExplorer()
command! ToggleBufExplorer :call ToggleBufExplorer()
command! BufExplorerHorizontalSplit :call BufExplorerHorizontalSplit()
command! BufExplorerVerticalSplit :call BufExplorerVerticalSplit()
@ -125,13 +103,14 @@ function! s:Set(var, default)
endfunction
" Script variables {{{2
let s:MRU_Exclude_List = ["[BufExplorer]","__MRU_Files__","[Buf\ List]"]
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'}
" Setup the autocommands that handle the MRUList and other stuff. {{{2
@ -149,6 +128,8 @@ function! s:Setup()
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
@ -158,128 +139,82 @@ function! s:Reset()
" command line are picked up correctly.
let s:MRUList = range(1, bufnr('$'))
" Initialize the association of buffers to tabs for any buffers
" that have been created prior to now, e.g., files specified as
" vim command line arguments
call s:CatalogBuffers()
endfunction
" CatalogBuffers {{{2
" Create tab associations for any existing buffers
function! s:CatalogBuffers()
let ct = tabpagenr()
for tab in range(1, tabpagenr('$'))
silent execute 'normal! ' . tab . 'gt'
for buf in tabpagebuflist()
call s:UpdateTabBufData(buf)
endfor
endfor
silent execute 'normal! ' . ct . 'gt'
endfunction
" AssociatedTab {{{2
" Return the number of the tab associated with the specified buffer.
" If the buffer is associated with more than one tab, the first one
" found is returned. If the buffer is not associated with any tabs,
" -1 is returned.
function! s:AssociatedTab(bufnr)
for tab in range(1, tabpagenr('$'))
let list = gettabvar(tab, 'bufexp_buf_list', [])
let idx = index(list, a:bufnr)
if idx != -1
return tab
endif
endfor
return -1
endfunction
" RemoveBufFromOtherTabs {{{2
" Remove the specified buffer from the buffer lists of all tabs
" except the current tab.
function! s:RemoveBufFromOtherTabs(bufnr)
for tab in range(1, tabpagenr('$'))
if tab == tabpagenr()
continue
endif
let list = gettabvar(tab, 'bufexp_buf_list', [])
let idx = index(list, a:bufnr)
if idx == -1
continue
endif
call remove(list, idx)
call settabvar(tab, 'bufexp_buf_list', list)
endfor
endfunction
" AddBufToCurrentTab {{{2
" Add the specified buffer to the list of buffers associated
" with the current tab
function! s:AddBufToCurrentTab(bufnr)
if index(t:bufexp_buf_list, a:bufnr) == -1
call add(t:bufexp_buf_list, a:bufnr)
endif
endfunction
" IsInCurrentTab {{{2
" Returns whether the specified buffer is associated
" with the current tab
function! s:IsInCurrentTab(bufnr)
" It shouldn't happen that the list of buffers is
" not defined but if it does, play it safe and
" include the buffer
if !exists('t:bufexp_buf_list')
return 1
endif
return (index(t:bufexp_buf_list, a:bufnr) != -1)
endfunction
" UpdateTabBufData {{{2
" Update the tab buffer data for the specified buffer
"
" The current tab's list is updated. If a buffer is only
" allowed to be associated with one tab, it is removed
" from the lists of any other tabs with which it may have
" been associated.
"
" The associations between tabs and buffers are maintained
" in separate lists for each tab, which are stored in tab-
" specific variables 't:bufexp_buf_list'.
function! s:UpdateTabBufData(bufnr)
" The first time we add a tab, Vim uses the current buffer
" as its starting page even though we are about to edit a
" new page, and another BufEnter for the new page is triggered
" later. Use this first BufEnter to initialize the list of
" buffers, but don't add the buffer number to the list if
" it is already associated with another tab
" 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.
"
" Unfortunately, this doesn't work right when the first
" buffer opened in the tab should be associated with it,
" such as when 'tab split +buffer N' is used
if !exists("t:bufexp_buf_list")
let t:bufexp_buf_list = []
" 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
if s:AssociatedTab(a:bufnr) != -1
return
endif
endif
call s:AddBufToCurrentTab(a:bufnr)
if g:bufExplorerOnlyOneTab
call s:RemoveBufFromOtherTabs(a:bufnr)
endif
while(tabpagenr('$') > 0 && i <= tabpagenr('$'))
call add(s:tabSpace, [-1])
let i = i + 1
endwhile
endfunction
" 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("%")
call s:UpdateTabBufData(_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
@ -289,6 +224,14 @@ function! s:DeactivateBuffer(remove)
call s:MRUPop(_bufnr)
endfunction
" 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
" MRUPop {{{2
function! s:MRUPop(bufnr)
call filter(s:MRUList, 'v:val != '.a:bufnr)
@ -337,7 +280,26 @@ endfunction
" Initialize {{{2
function! s:Initialize()
call s:SetLocalSettings()
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
setlocal nonumber
setlocal foldcolumn=0
setlocal nofoldenable
setlocal cursorline
setlocal nospell
setlocal nobuflisted
let s:running = 1
endfunction
@ -365,29 +327,6 @@ function! s:Cleanup()
delmarks!
endfunction
" SetLocalSettings {{{2
function! s:SetLocalSettings()
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
setlocal nonumber
setlocal foldcolumn=0
setlocal nofoldenable
setlocal cursorline
setlocal nospell
setlocal nobuflisted
setlocal filetype=bufexplorer
endfunction
" BufExplorerHorizontalSplit {{{2
function! BufExplorerHorizontalSplit()
let s:splitMode = "sp"
@ -400,15 +339,6 @@ function! BufExplorerVerticalSplit()
execute "BufExplorer"
endfunction
" ToggleBufExplorer {{{2
function! ToggleBufExplorer()
if exists("s:running") && s:running == 1 && bufname(winbufnr(0)) == s:name
call s:Close()
else
call BufExplorer()
endif
endfunction
" BufExplorer {{{2
function! BufExplorer()
let name = s:name
@ -501,31 +431,28 @@ function! s:MapKeys()
nnoremap <buffer> <silent> <tab> :call <SID>SelectBuffer()<CR>
endif
nnoremap <script> <silent> <nowait> <buffer> <2-leftmouse> :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <nowait> <buffer> <CR> :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <nowait> <buffer> <F1> :call <SID>ToggleHelp()<CR>
nnoremap <script> <silent> <nowait> <buffer> <s-cr> :call <SID>SelectBuffer("tab")<CR>
nnoremap <script> <silent> <nowait> <buffer> a :call <SID>ToggleFindActive()<CR>
nnoremap <script> <silent> <nowait> <buffer> b :call <SID>SelectBuffer("ask")<CR>
nnoremap <script> <silent> <nowait> <buffer> d :call <SID>RemoveBuffer("delete")<CR>
xnoremap <script> <silent> <nowait> <buffer> d :call <SID>RemoveBuffer("delete")<CR>
nnoremap <script> <silent> <nowait> <buffer> D :call <SID>RemoveBuffer("wipe")<CR>
xnoremap <script> <silent> <nowait> <buffer> D :call <SID>RemoveBuffer("wipe")<CR>
nnoremap <script> <silent> <nowait> <buffer> f :call <SID>SelectBuffer("split", "sb")<CR>
nnoremap <script> <silent> <nowait> <buffer> F :call <SID>SelectBuffer("split", "st")<CR>
nnoremap <script> <silent> <nowait> <buffer> m :call <SID>MRUListShow()<CR>
nnoremap <script> <silent> <nowait> <buffer> o :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <nowait> <buffer> p :call <SID>ToggleSplitOutPathName()<CR>
nnoremap <script> <silent> <nowait> <buffer> q :call <SID>Close()<CR>
nnoremap <script> <silent> <nowait> <buffer> r :call <SID>SortReverse()<CR>
nnoremap <script> <silent> <nowait> <buffer> R :call <SID>ToggleShowRelativePath()<CR>
nnoremap <script> <silent> <nowait> <buffer> s :call <SID>SortSelect()<CR>
nnoremap <script> <silent> <nowait> <buffer> S :call <SID>ReverseSortSelect()<CR>
nnoremap <script> <silent> <nowait> <buffer> t :call <SID>SelectBuffer("tab")<CR>
nnoremap <script> <silent> <nowait> <buffer> T :call <SID>ToggleShowTabBuffer()<CR>
nnoremap <script> <silent> <nowait> <buffer> u :call <SID>ToggleShowUnlisted()<CR>
nnoremap <script> <silent> <nowait> <buffer> v :call <SID>SelectBuffer("split", "vr")<CR>
nnoremap <script> <silent> <nowait> <buffer> V :call <SID>SelectBuffer("split", "vl")<CR>
nnoremap <script> <silent> <buffer> <2-leftmouse> :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <buffer> <CR> :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <buffer> <F1> :call <SID>ToggleHelp()<CR>
nnoremap <script> <silent> <buffer> <s-cr> :call <SID>SelectBuffer("tab")<CR>
nnoremap <script> <silent> <buffer> B :call <SID>ToggleOnlyOneTab()<CR>
nnoremap <script> <silent> <buffer> b :call <SID>SelectBuffer("ask")<CR>
nnoremap <script> <silent> <buffer> d :call <SID>RemoveBuffer("delete")<CR>
xnoremap <script> <silent> <buffer> d :call <SID>RemoveBuffer("delete")<CR>
nnoremap <script> <silent> <buffer> D :call <SID>RemoveBuffer("wipe")<CR>
xnoremap <script> <silent> <buffer> D :call <SID>RemoveBuffer("wipe")<CR>
nnoremap <script> <silent> <buffer> f :call <SID>ToggleFindActive()<CR>
nnoremap <script> <silent> <buffer> m :call <SID>MRUListShow()<CR>
nnoremap <script> <silent> <buffer> o :call <SID>SelectBuffer()<CR>
nnoremap <script> <silent> <buffer> p :call <SID>ToggleSplitOutPathName()<CR>
nnoremap <script> <silent> <buffer> q :call <SID>Close()<CR>
nnoremap <script> <silent> <buffer> r :call <SID>SortReverse()<CR>
nnoremap <script> <silent> <buffer> R :call <SID>ToggleShowRelativePath()<CR>
nnoremap <script> <silent> <buffer> s :call <SID>SortSelect()<CR>
nnoremap <script> <silent> <buffer> S :call <SID>ReverseSortSelect()<CR>
nnoremap <script> <silent> <buffer> t :call <SID>SelectBuffer("tab")<CR>
nnoremap <script> <silent> <buffer> T :call <SID>ToggleShowTabBuffer()<CR>
nnoremap <script> <silent> <buffer> u :call <SID>ToggleShowUnlisted()<CR>
for k in ["G", "n", "N", "L", "M", "H"]
execute "nnoremap <buffer> <silent>" k ":keepjumps normal!" k."<CR>"
@ -631,14 +558,11 @@ function! s:CreateHelp()
call add(header, '" <F1> : toggle this help')
call add(header, '" <enter> or o or Mouse-Double-Click : open buffer under cursor')
call add(header, '" <shift-enter> or t : open buffer in another tab')
call add(header, '" a : toggle find active buffer')
call add(header, '" b : Fast buffer switching with b<any bufnum>')
call add(header, '" B : toggle if to save/use recent tab or not')
call add(header, '" d : delete buffer')
call add(header, '" D : wipe buffer')
call add(header, '" F : open buffer in another window above the current')
call add(header, '" f : open buffer in another window below the current')
call add(header, '" p : toggle splitting of file and path name')
call add(header, '" f : toggle find active 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')
@ -646,8 +570,6 @@ function! s:CreateHelp()
call add(header, '" S : reverse cycle thru "sort by" fields')
call add(header, '" T : toggle if to show only buffers for this tab or not')
call add(header, '" u : toggle showing unlisted buffers')
call add(header, '" V : open buffer in another window on the left of the current')
call add(header, '" v : open buffer in another window on the right of the current')
else
call add(header, '" Press <F1> for Help')
endif
@ -745,17 +667,24 @@ function! s:BuildBufferList()
endif
" Are we to show only buffer(s) for this tab?
if g:bufExplorerShowTabBuffer && (!s:IsInCurrentTab(str2nr(buf.attributes)))
continue
if g:bufExplorerShowTabBuffer
let show_buffer = 0
for bufnr in s:tabSpace[tabpagenr()]
if buf.attributes =~ '^\s*'.bufnr.'\>'
" Only buffers shown on the current tabpagenr
let show_buffer = 1
break
endif
endfor
if show_buffer == 0
continue
endif
endif
let line = buf.attributes." "
if exists("g:loaded_webdevicons")
let line .= WebDevIconsGetFileTypeSymbol(buf.shortname)
let line .= " "
endif
" Are we to split the path and file name?
if g:bufExplorerSplitOutPathName
let type = (g:bufExplorerShowRelativePath) ? "relativepath" : "path"
@ -834,27 +763,20 @@ function! s:SelectBuffer(...)
return s:Close()
endif
" Get the tab number where this bufer is located in.
let tabNbr = s:GetTabNbr(_bufNbr)
" Are we supposed to open the selected buffer in a tab?
" Are we suppose to open the selected buffer in a tab?
if (a:0 == 1) && (a:1 == "tab")
" Yes, we are to open the selected buffer in a tab.
" Restore [BufExplorer] buffer.
execute "silent buffer!".s:originBuffer
execute "keepjumps silent buffer!".s:originBuffer
" Get the tab nmber where this bufer is located in.
let tabNbr = s:GetTabNbr(_bufNbr)
" Was the tab found?
if tabNbr == 0
" _bufNbr is not opened in any tabs. Open a new tab with the
" selected buffer in it.
if v:version > 704 || ( v:version == 704 && has('patch2237') )
" new syntax for last tab as of 7.4.2237
execute "$tab split +buffer" . _bufNbr
else
execute "999tab split +buffer" . _bufNbr
endif
" Workaround for the issue mentioned in UpdateTabBufData.
call s:UpdateTabBufData(_bufNbr)
" _bufNbr is not opened in any tabs. Open a new tab with the selected buffer in it.
execute "999tab split +buffer" . _bufNbr
else
" The _bufNbr is already opened in a tab, go to that tab.
execute tabNbr . "tabnext"
@ -862,42 +784,9 @@ function! s:SelectBuffer(...)
" Focus window.
execute s:GetWinNbr(tabNbr, _bufNbr) . "wincmd w"
endif
" Are we supposed to open the selected buffer in a split?
elseif (a:0 == 2) && (a:1 == "split")
if g:bufExplorerFindActive
call s:Close()
endif
" Was the tab found?
if tabNbr != 0
" Yes, the buffer is located in a tab. Go to that tab instead of
" opening split
execute tabNbr . "tabnext"
else
"Nope, the buffer is not in a tab, open it accordingly
let _bufName = expand("#"._bufNbr.":p")
if (a:2 == "vl")
execute _bufName ?
\ "vert topleft sb ".escape(_bufName, " ") :
\ "vert topleft sb "._bufNbr
elseif (a:2 == "vr")
execute _bufName ?
\ "vert belowright sb ".escape(_bufName, " ") :
\ "vert belowright sb "._bufNbr
elseif (a:2 == "st")
execute _bufName ?
\ "topleft sb ".escape(_bufName, " ") :
\ "topleft sb "._bufNbr
else " = sb
execute _bufName ?
\ "belowright sb ".escape(_bufName, " ") :
\ "belowright sb "._bufNbr
endif
endif
" Switch to selected buffer
execute "keepalt silent b!" _bufNbr
" Default, open in current window
else
" No, the user did not ask to open the selected buffer in a tab.
" Are we suppose to move to the tab where the active buffer is?
if exists("g:bufExplorerChgWin")
execute g:bufExplorerChgWin."wincmd w"
@ -906,6 +795,9 @@ function! s:SelectBuffer(...)
call s:Close()
endif
" Get the tab number where this buffer is located in.
let tabNbr = s:GetTabNbr(_bufNbr)
" Was the tab found?
if tabNbr != 0
" Yes, the buffer is located in a tab. Go to that tab number.
@ -919,7 +811,7 @@ function! s:SelectBuffer(...)
endif
" Switch to the selected buffer.
execute "keepjumps keepalt silent b!" _bufNbr
execute "keepalt keepjumps silent b!" _bufNbr
endif
" Make the buffer 'listed' again.
@ -955,7 +847,11 @@ function! s:RemoveBuffer(mode)
return
endif
let mode = a:mode
" 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"
@ -965,27 +861,13 @@ function! s:RemoveBuffer(mode)
let _bufNbr = str2nr(getline('.'))
if getbufvar(_bufNbr, '&modified') == 1
" Calling confirm() requires Vim built with dialog option
if !has("dialog_con") && !has("dialog_gui")
call s:Error("Sorry, no write since last change for buffer "._bufNbr.", unable to delete")
return
endif
let answer = confirm('No write since last change for buffer '._bufNbr.'. Delete anyway?', "&Yes\n&No", 2)
if a:mode == "delete" && answer == 1
let mode = "force_delete"
elseif a:mode == "wipe" && answer == 1
let mode = "force_wipe"
else
return
endif
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
" Okay, everything is good, delete or wipe the buffer.
call s:DeleteBuffer(_bufNbr, mode)
" Reactivate winmanager autocommand activity.
if exists("b:displayMode") && b:displayMode == "winmanager"
call WinManagerForceReSize("BufExplorer")
@ -1000,10 +882,6 @@ function! s:DeleteBuffer(buf, mode)
" Wipe/Delete buffer from Vim.
if a:mode == "wipe"
execute "silent bwipe" a:buf
elseif a:mode == "force_wipe"
execute "silent bwipe!" a:buf
elseif a:mode == "force_delete"
execute "silent bdelete!" a:buf
else
execute "silent bdelete" a:buf
endif
@ -1020,20 +898,10 @@ function! s:DeleteBuffer(buf, mode)
endtry
endfunction
" ListedAndCurrentTab {{{2
" Returns whether the specified buffer is both listed and associated
" with the current tab
function! s:ListedAndCurrentTab(buf)
return buflisted(a:buf) && s:IsInCurrentTab(a:buf)
endfunction
" Close {{{2
function! s:Close()
" Get only the listed buffers associated with the current tab
let listed = filter(copy(s:MRUList), "s:ListedAndCurrentTab(v:val)")
if len(listed) == 0
let listed = filter(range(1, bufnr('$')), "s:ListedAndCurrentTab(v:val)")
endif
" 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 != "" && bufwinnr(s:originBuffer) != -1
@ -1046,7 +914,7 @@ function! s:Close()
" buffers.
execute "enew"
else
" Since there are buffers left to switch to, switch to the previous and
" Since there are buffers left to switch to, swith to the previous and
" then the current.
for b in reverse(listed[0:1])
execute "keepjumps silent b ".b
@ -1173,9 +1041,6 @@ function! s:SortListing()
" Easiest case.
execute sort 'n'
elseif g:bufExplorerSortBy == "name"
" Sort by full path first
execute sort 'ir /\zs\f\+\ze\s\+line/'
if g:bufExplorerSplitOutPathName
execute sort 'ir /\d.\{7}\zs\f\+\ze/'
else
@ -1189,16 +1054,6 @@ function! s:SortListing()
execute sort 'ir /\zs\f\+\ze\s\+line/'
elseif g:bufExplorerSortBy == "extension"
" Sort by full path...
execute sort 'ir /\zs\f\+\ze\s\+line/'
" Sort by name...
if g:bufExplorerSplitOutPathName
" Sort twice - first on the file name then on the path.
execute sort 'ir /\d.\{7}\zs\f\+\ze/'
endif
" Sort by extension.
execute sort 'ir /\.\zs\w\+\ze\s/'
elseif g:bufExplorerSortBy == "mru"
let l = getline(s:firstBufferLine, "$")
@ -1284,7 +1139,6 @@ call s:Set("g:bufExplorerMaxHeight", 25) " Handles dynamic resizing of the windo
" or by winmanager.
function! BufExplorer_Start()
let b:displayMode = "winmanager"
call s:SetLocalSettings()
call BufExplorer()
endfunction
@ -1296,7 +1150,6 @@ endfunction
" Handles dynamic refreshing of the window.
function! BufExplorer_Refresh()
let b:displayMode = "winmanager"
call s:SetLocalSettings()
call BufExplorer()
endfunction
@ -1327,7 +1180,7 @@ function! BufExplorer_ReSize()
call setpos(".", pres)
endfunction
" Default values {{{2
" Default values {{{1
call s:Set("g:bufExplorerDisableDefaultKeyMapping", 0) " Do not disable default key mappings.
call s:Set("g:bufExplorerDefaultHelp", 1) " Show default help?
call s:Set("g:bufExplorerDetailedHelp", 0) " Show detailed help?
@ -1345,16 +1198,13 @@ call s:Set("g:bufExplorerSplitOutPathName", 1) " Split out path and fil
call s:Set("g:bufExplorerSplitRight", &splitright) " Should vertical splits be on the right or left of current window?
call s:Set("g:bufExplorerSplitVertSize", 0) " Height for a vertical split. If <=0, default Vim size is used.
call s:Set("g:bufExplorerSplitHorzSize", 0) " Height for a horizontal split. If <=0, default Vim size is used.
"1}}}
" Default key mapping {{{2
" Default key mapping {{{1
if !hasmapto('BufExplorer') && g:bufExplorerDisableDefaultKeyMapping == 0
nnoremap <script> <silent> <unique> <Leader>be :BufExplorer<CR>
endif
if !hasmapto('ToggleBufExplorer') && g:bufExplorerDisableDefaultKeyMapping == 0
nnoremap <script> <silent> <unique> <Leader>bt :ToggleBufExplorer<CR>
endif
if !hasmapto('BufExplorerHorizontalSplit') && g:bufExplorerDisableDefaultKeyMapping == 0
nnoremap <script> <silent> <unique> <Leader>bs :BufExplorerHorizontalSplit<CR>
endif