1
0
Fork 0
mirror of synced 2024-06-18 06:51:11 -04:00
ultimate-vim/vim_plugins_src/tabbar.vim

1647 lines
53 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" Copyright: Copyright (C) 2005 Marius Groleo
" 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,
" tabbar.vim is provided *AS IS* and comes with no warranty of
" any kind, either expressed or implied. In no event will the
" copyright holder be liable for any damamges resulting from the
" use of this software.
"
" Derived from Bindu Wavell miniBufExplorer.vim version 6.3.2
" Version: 0.7
" Maintainer: Marius Groleo < groleo@gmail.com >
" Description: TabBar buffer explorer Vim Plugin
" Name Of File: tabbar.vim
" DOCUMENTATION: is at line :1445
" press zR , in normal mode to OPEN all folds
" press zM , in normal mode to CLOSE all folds
" Already been loaded? ~~
if exists('Tb_loaded')
finish
else
let Tb_loaded= 1
endif "%%
" Debug Level ~~
" 0 = no logging
" 1-5 = errors ; 1 is the most important
" 5-9 = info ; 5 is the most important
" 10 = Entry/Exit
if !exists('g:Tb_DBG_LVL')
let g:Tb_DBG_LVL = 0
endif" %%
" Logging method ~~
" 0 = log to a window
" 1 = log with vim's echo facility
" 2 = log to a file named TabBar.DBG
" in the directory where vim was started
" THIS IS VERY SLOW
" 3 = log into g:Tb_DbgOutput
" global variable [This is the default]
if !exists('g:Tb_DebugMode')
let g:Tb_DebugMode = 0
endif" %%
" Mappings and Commands
" TabBar Keyboard Mappings ~~
if ! hasmapto('1') || !hasmapto('<M-1>')
"gui bindings containing META key, are different from terminal bindings
if has('gui_running')
"NORMAL mode bindings for gvim
noremap <unique> <script> <M-1> :call <SID>Bf_SwitchTo( 1)<CR>:<BS>
noremap <unique> <script> <M-2> :call <SID>Bf_SwitchTo( 2)<CR>:<BS>
noremap <unique> <script> <M-3> :call <SID>Bf_SwitchTo( 3)<CR>:<BS>
noremap <unique> <script> <M-4> :call <SID>Bf_SwitchTo( 4)<CR>:<BS>
noremap <unique> <script> <M-5> :call <SID>Bf_SwitchTo( 5)<CR>:<BS>
noremap <unique> <script> <M-6> :call <SID>Bf_SwitchTo( 6)<CR>:<BS>
noremap <unique> <script> <M-7> :call <SID>Bf_SwitchTo( 7)<CR>:<BS>
noremap <unique> <script> <M-8> :call <SID>Bf_SwitchTo( 8)<CR>:<BS>
noremap <unique> <script> <M-9> :call <SID>Bf_SwitchTo( 9)<CR>:<BS>
noremap <unique> <script> <M-0> :call <SID>Bf_SwitchTo( 10)<CR>:<BS>
"INSERT mode bindings for gvim
inoremap <unique> <script> <M-1> <esc>:call <SID>Bf_SwitchTo( 1)<CR>:<BS>a
inoremap <unique> <script> <M-2> <esc>:call <SID>Bf_SwitchTo( 2)<CR>:<BS>a
inoremap <unique> <script> <M-3> <esc>:call <SID>Bf_SwitchTo( 3)<CR>:<BS>a
inoremap <unique> <script> <M-4> <esc>:call <SID>Bf_SwitchTo( 4)<CR>:<BS>a
inoremap <unique> <script> <M-5> <esc>:call <SID>Bf_SwitchTo( 5)<CR>:<BS>a
inoremap <unique> <script> <M-6> <esc>:call <SID>Bf_SwitchTo( 6)<CR>:<BS>a
inoremap <unique> <script> <M-7> <esc>:call <SID>Bf_SwitchTo( 7)<CR>:<BS>a
inoremap <unique> <script> <M-8> <esc>:call <SID>Bf_SwitchTo( 8)<CR>:<BS>a
inoremap <unique> <script> <M-9> <esc>:call <SID>Bf_SwitchTo( 9)<CR>:<BS>a
inoremap <unique> <script> <M-0> <esc>:call <SID>Bf_SwitchTo( 10)<CR>:<BS>a
else
"NORMAL mode bindings for vim( dos32 )
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 1)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 2)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 3)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 4)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 5)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 6)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 7)<CR>:<BS>
noremap <unique> <script> <20> :call <SID>Bf_SwitchTo( 8)<CR>:<BS>
"else
"NORMAL mode bindings for vim( terminal)
noremap <unique> <script> 1 :call <SID>Bf_SwitchTo( 1)<CR>:<BS>
noremap <unique> <script> 2 :call <SID>Bf_SwitchTo( 2)<CR>:<BS>
noremap <unique> <script> 3 :call <SID>Bf_SwitchTo( 3)<CR>:<BS>
noremap <unique> <script> 4 :call <SID>Bf_SwitchTo( 4)<CR>:<BS>
noremap <unique> <script> 5 :call <SID>Bf_SwitchTo( 5)<CR>:<BS>
noremap <unique> <script> 6 :call <SID>Bf_SwitchTo( 6)<CR>:<BS>
noremap <unique> <script> 7 :call <SID>Bf_SwitchTo( 7)<CR>:<BS>
noremap <unique> <script> 8 :call <SID>Bf_SwitchTo( 8)<CR>:<BS>
noremap <unique> <script> 9 :call <SID>Bf_SwitchTo( 9)<CR>:<BS>
noremap <unique> <script> 0 :call <SID>Bf_SwitchTo( 10)<CR>:<BS>
"INSERT mode bindings for vim( terminal)
inoremap <unique> <script> 1 <esc>:call <SID>Bf_SwitchTo( 1)<CR>:<BS>a
inoremap <unique> <script> 2 <esc>:call <SID>Bf_SwitchTo( 2)<CR>:<BS>a
inoremap <unique> <script> 3 <esc>:call <SID>Bf_SwitchTo( 3)<CR>:<BS>a
inoremap <unique> <script> 4 <esc>:call <SID>Bf_SwitchTo( 4)<CR>:<BS>a
inoremap <unique> <script> 5 <esc>:call <SID>Bf_SwitchTo( 5)<CR>:<BS>a
inoremap <unique> <script> 6 <esc>:call <SID>Bf_SwitchTo( 6)<CR>:<BS>a
inoremap <unique> <script> 7 <esc>:call <SID>Bf_SwitchTo( 7)<CR>:<BS>a
inoremap <unique> <script> 8 <esc>:call <SID>Bf_SwitchTo( 8)<CR>:<BS>a
inoremap <unique> <script> 9 <esc>:call <SID>Bf_SwitchTo( 9)<CR>:<BS>a
inoremap <unique> <script> 0 <esc>:call <SID>Bf_SwitchTo( 10)<CR>:<BS>a
endif
endif " %%
" TabBar <Script> internal map ~~
noremap <unique> <script> <Plug>tbstart :call <SID>Tb_Start(1, -1)<CR>:<BS>
noremap <unique> <script> <Plug>tbstop :call <SID>Tb_Stop(1)<CR>:<BS>
noremap <unique> <script> <Plug>tbaut :call <SID>Tb_Aup(-1)<CR>:<BS>
noremap <unique> <script> <Plug>tbtoggle :call <SID>Tb_Toggle()<CR>:<BS>
" %%
" TabBar commands ~~
if !exists(':TbStart')
command! TbStart call <SID>Tb_Start(1, -1)
endif
if !exists(':TbStop')
command! TbStop call <SID>Tb_Stop(1)
endif
if !exists(':TbAup')
command! TbAup call <SID>Tb_AutoUpdt(-1)
endif
if !exists(':TbToggle')
command! TbToggle call <SID>Tb_Toggle()
endif
if !exists(':Tbbn')
command! Tbbn call <SID>Bf_Cycle(1)
endif
if !exists(':Tbp')
command! Tbbp call <SID>Bf_Cycle(0)
endif " %%
" Global Configuration Variables
" Allow auto update? ~~
" We start out with this off for startup, but once vim is running we
" turn this on.
if !exists('g:Tb_AutoUpdt')
let g:Tb_AutoUpdt = 0
endif " %%
" MoreThanOne? ~~
" Display Mini Buf Explorer when there are 'More Than One' eligible buffers
if !exists('g:Tb_MoreThanOne')
let g:Tb_MoreThanOne = 2
endif" %%
" Split below/above/left/right? ~~
" When opening a new -TabBar- window, split the new windows below or
" above the current window? 1 = below, 0 = above.
if !exists('g:Tb_SplitBelow')
let g:Tb_SplitBelow = &splitbelow
endif" %%
" Horizontal or Vertical explorer? ~~
" For folks that like vertical explorers, I'm caving in and providing for
" veritcal splits. If this is set to 0 then the current horizontal
" splitting logic will be run. If however you want a vertical split,
" assign the width (in characters) you wish to assign to the -TabBar- window.
if !exists('g:Tb_VSplit')
let g:Tb_VSplit = 0
endif" %%
" TabWrap? ~~
" By default line wrap is used (possibly breaking a tab name between two
" lines.) Turning this option on (setting it to 1) can take more screen
" space, but will make sure that each tab is on one and only one line.
if !exists('g:Tb_TabWrap')
let g:Tb_TabWrap = 0
endif" %%
" Switch buffers using Ctrl-Tab ?~~
if !exists('g:Tb_cTabSwitchBufs')
let g:Tb_cTabSwitchBufs = 1
endif" %%
" if cTabSwitchBufs is turned on then we turn off cTabSwitchWindows.~~
if g:Tb_cTabSwitchBufs == 1 || !exists('g:Tb_cTabSwitchWindows')
let g:Tb_cTabSwitchWindows = 0
endif" %%
" If we have enabled <C-TAB> and <C-S-TAB> to switch buffers~~
" in the current window then perform the remapping
if g:Tb_cTabSwitchBufs
noremap <C-TAB> :call <SID>Bf_Cycle(1)<CR>:<BS>
noremap <C-S-TAB> :call <SID>Bf_Cycle(0)<CR>:<BS>
endif "%%
" If we have enabled <C-TAB> and <C-S-TAB> to switch windows ~~
" then perform the remapping
if g:Tb_cTabSwitchWindows
noremap <C-TAB> <C-W>w
noremap <C-S-TAB> <C-W>W
endif "%%
" Modifiable Select Target ~~
if !exists('g:Tb_ModSelTarget')
let g:Tb_ModSelTarget = 0
endif "%%
" Force Syntax Enable ~~
if !exists('g:Tb_ForceSyntaxEnable')
let g:Tb_ForceSyntaxEnable = 0
endif "%%
" Single/Double Click? ~~
" flag that can be set to 1 in a users .vimrc to allow
" single click switching of tabs. By default we use
" double click for tab selection.
if !exists('g:Tb_UseSingleClick')
let g:Tb_UseSingleClick = 0
endif
"
" attempt to perform single click mapping, it would be much
" nicer if we could nnoremap <buffer> ... however vim does
" not fire the <buffer> <leftmouse> when you use the mouse
" to enter a buffer.
"
if g:Tb_UseSingleClick == 1
let s:clickmap = ':if bufname("%") == "-TabBar-" <bar> call <SID>Tb_Click() <bar> endif <CR>'
if maparg('<LEFTMOUSE>', 'n') == ''
" no mapping for leftmouse
exec ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>' . s:clickmap
else
" we have a mapping
let g:Tb_DoneClickSave = 1
let s:m = ':nnoremap <silent> <LEFTMOUSE> <LEFTMOUSE>'
let s:m = s:m . substitute(substitute(maparg('<LEFTMOUSE>', 'n'), '|', '<bar>', 'g'), '\c^<LEFTMOUSE>', '', '')
let s:m = s:m . s:clickmap
exec s:m
endif
endif " %%
"------------"
" Variables "
"------------"
" used to pass maxTabWidth info between functions
let s:maxTabWidth = 0
" Debug line counter
let s:DBG_LN_CNT = 0
" Global used to store the buffer list so we don't update the ~~
" UI unless the list has changed.
if !exists('g:Tb_VimBufList')
let g:Tb_VimBufList = ''
let g:Tb_BufferMap=''
endif "%%
" g:Tb_UpdtMutex: Variable used as a mutex so that we don't do lots~~
" of Tb_AutoUpdts at the same time.
if !exists('g:Tb_UpdtMutex')
let g:Tb_UpdtMutex = 0
endif "%%
" g:Tb_MaxHeight maxSize ~~
if !exists('g:Tb_MaxSize')
let g:Tb_MaxSize = 1
"TODO implement Tb_MaxHeight
endif "%%
" g:Tb_MaxHeight MinSize ~~
if !exists('g:Tb_MinSize')
let g:Tb_MinSize = 1
"TODO implement Tb_MaxHeight
endif "%%
" g:Tb_DbgOutput: In debug mode 3 this variable will hold the debug output~~
if !exists('g:Tb_DbgOutput')
let g:Tb_DbgOutput = ''
endif "%%
" g:Tb_ForceDisplay ~~
if !exists('g:Tb_ForceDisplay')
let g:Tb_ForceDisplay = 0
endif "%%
" Setup an autocommand group and some autocommands ~~
" that keep our explorer updated automatically.
augroup TabBar
autocmd TabBar BufDelete * call <SID>DEBUG('-=> BufDelete AutoCmd', 10) |call <SID>Tb_AutoUpdt(expand('<abuf>'))
autocmd TabBar BufEnter * call <SID>DEBUG('-=> BufEnter AutoCmd', 10) |call <SID>Tb_AutoUpdt(-1)
autocmd TabBar VimEnter * call <SID>DEBUG('-=> VimEnter AutoCmd', 10) |let g:Tb_AutoUpdt = 1 |call <SID>Tb_AutoUpdt(-1)
" %%
"------------"
" Functions "
"------------"
" Tb_Start - Sets up our explorer and causes it to be displayed ~~
function! <SID>Tb_Start(sticky, delBufNum)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Tb_Start()' ,10)
endif
if a:sticky == 1
let g:Tb_AutoUpdt = 1
endif
" Store the current buffer
let l:curBuf = bufnr('%')
" Prevent a report of our actions from showing up.
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
call <SID>Win_FindOrCreate('-TabBar-', -1, 1)
" Make sure we are in our window
if bufname('%') != '-TabBar-'
call <SID>DEBUG('Tb_Start: called in invalid window',1)
let &report = l:save_rep
let &showcmd = l:save_sc
return
endif
" !!! We may want to make the following optional -- Bindu
" New windows don't cause all windows to be resized to equal sizes
set noequalalways
" !!! We may want to make the following optional -- Bindu
" We don't want the mouse to change focus without a click
set nomousefocus
" If folks turn numbering and columns on by default we will turn
" them off for the -TabBar- window
setlocal foldcolumn=0
setlocal nonumber
if has("syntax")
syn clear
syn match Tb_Normal '\[[^\]]*\]'
syn match Tb_Changed '\[[^\]]*\]+'
syn match Tb_VisibleNormal '\[[^\]]*\]\*+\='
syn match Tb_VisibleChanged '\[[^\]]*\]\*+'
if !exists("g:did_tabbar_syntax_inits")
let g:did_tabbar_syntax_inits = 1
highlight def link Tb_Normal Comment
highlight def link Tb_Changed String
highlight def link Tb_VisibleNormal StatusLineNC
highlight def link Tb_VisibleChanged Special
endif
endif
" If you press return in the -TabBar- then try
" to open the selected buffer in the previous window.
" Bf_CrSel = Buffer CR Select
nnoremap <buffer> <CR> :call <SID>Bf_CrSel()<CR>:<BS>
" If you Bf_DblClkSel in the -TabBar- then try
" to open the selected buffer in the previous window.
nnoremap <buffer> <2-LEFTMOUSE> :call <SID>Bf_DblClkSel()<CR>:<BS>
" delete the selected buffer.
nnoremap <buffer> d :call <SID>Bf_DelWithD()<CR>:<BS>
" If you press w in the -TabBar- then switch back
" to the previous window.
nnoremap <buffer> p :wincmd p<CR>:<BS>
" The following allows for quicker moving between buffer
" names in the -TabBar- window it also saves the last-pattern
" and restores it.
nnoremap <buffer> <TAB> :call search('\[[0-9]*:[^\]]*\]')<CR>:<BS>
nnoremap <buffer> <S-TAB> :call search('\[[0-9]*:[^\]]*\]','b')<CR>:<BS>
call <SID>Bf_SafePrint(a:delBufNum)
if (l:curBuf != -1)
call search('\['.l:curBuf.':'.expand('#'.l:curBuf.':t').'\]')
else
call <SID>DEBUG('Tb_Start: No current buffer to search for',9)
endif
let &report = l:save_rep
let &showcmd = l:save_sc
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_Start()' ,10)
endif
endfunction " %%
" Tb_Stop - Looks for our explorer and closes the window if it is opened ~~
function! <SID>Tb_Stop( sticky)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Tb_Stop()' ,10)
endif
if a:sticky == 1
let g:Tb_AutoUpdt = 0
endif
let l:winNum = <SID>Win_Find('-TabBar-')
if l:winNum != -1
exec l:winNum.' wincmd w'
silent! close
wincmd p
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_Stop()' ,10)
endif
endfunction " %%
" Tb_Toggle - Looks for our explorer and opens/closes the window ~~
function! <SID>Tb_Toggle()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Tb_Toggle()' ,10)
endif
let g:Tb_AutoUpdt = 0
let l:winNum = <SID>Win_Find('-TabBar-')
if l:winNum != -1
call <SID>Tb_Stop(1)
else
call <SID>Tb_Start(1, -1)
wincmd p
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_Toggle()' ,10)
endif
endfunction " %%
" Tb_Max - Returns the max of two numbers ~~
function! <SID>Tb_Max(argOne, argTwo)
if a:argOne > a:argTwo
return a:argOne
else
return a:argTwo
endif
endfunction " %%
" Tb_AutoUpdt - Function called by auto commands for auto updating -TabBar- ~~
" IF auto update is turned on AND
" we are in a real buffer AND
" we have enough eligible buffers THEN
" Update our explorer and get back to the current window
" If we get a buffer number for a buffer that
" is being deleted, we need to make sure and
" remove the buffer from the list of eligible
" buffers in case we are down to one eligible
" buffer, in which case we will want to close
" the -TabBar- window.
function! <SID>Tb_AutoUpdt(delBufNum)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Tb_AutoUpdt( delBufNum='.a:delBufNum.') : bufnr(%)='.bufnr('%').' : bufname(%)=['.bufname('%') . ']',10)
endif
if (g:Tb_UpdtMutex == 1)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: recursion stopped',9)
call <SID>DEBUG('EXIT : Tb_AutoUpdt()' ,10)
endif
return
else
let g:Tb_UpdtMutex = 1
endif
" Don't update the TabBar window
if (bufname('%') == '-TabBar-')
" If this is the only buffer left then toggle the buffer
if (winbufnr(2) == -1)
call <SID>Bf_Cycle(1)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: does not run for cycled windows', 9)
endif
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: does not run for the -TabBar- window', 9)
endif
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_AutoUpdt()' ,10)
endif
let g:Tb_UpdtMutex = 0
return
endif
if (a:delBufNum != -1)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: will make sure that buffer '.a:delBufNum.' is not included in the buffer list.', 5)
endif
endif
" Only allow updates when the Tb_AutoUpdt flag is set
" this allows us to stop updates on startup.
if g:Tb_AutoUpdt == 1
" Only show TabBar if we have a real buffer
if ((g:Tb_MoreThanOne == 0) || (bufnr('%') != -1 && bufname('%') != ""))
if <SID>Bf_Eligible(a:delBufNum) == 1
" if we don't have a window then create one
let l:bufnr = <SID>Win_Find('-TabBar-')
if (l:bufnr == -1)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: About to call Tb_Start (Create -TabBar-)', 9)
endif
call <SID>Tb_Start(0, a:delBufNum)
else
" otherwise only update the window if the contents have changed
let l:ListChanged = <SID>Bf_BuildList(a:delBufNum, 0)
if (l:ListChanged)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: About to call Tb_Start (Update -TabBar-)', 9)
endif
call <SID>Tb_Start(0, a:delBufNum)
endif
endif
" go back to the working buffer
if (bufname('%') == '-TabBar-')
wincmd p
endif
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: Failed in eligible check', 9)
endif
call <SID>Tb_Stop(0)
endif
" VIM sometimes turns syntax highlighting off,
" we can force it on, but this may cause weird
" behavior so this is an optional hack to force
" syntax back on when we enter a buffer
if g:Tb_ForceSyntaxEnable
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: Enable Syntax', 9)
endif
exec 'syntax enable'
endif
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Tb_AutoUpdt: No buffers loaded...',9)
endif
endif
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_AutoUpdt are turned off',9)
endif
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_AutoUpdt()' ,10)
endif
let g:Tb_UpdtMutex = 0
endfunction " %%
" Tb_Click - Handle mouse double click ~~
function! <SID>Tb_Click()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Tb_Click()',10)
endif
call <SID>Bf_CrSel()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Tb_Click()',10)
endif
endfunction " %%
"-------------------"
" Window operations "
"-------------------"
" Win_Find - Return the window number of a named buffer ~~
" If none is found then returns -1.
function! <SID>Win_Find(bufName)
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('ENTER: Win_Find()',10)
"endif
" Try to find an existing window that contains
" our buffer.
let l:bufNr = bufnr(a:bufName)
if l:bufNr != -1
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('Found buffer ('.a:bufName.'): '.l:bufNr,9)
"endif
let l:bufWinNr = bufwinnr(l:bufNr)
else
let l:bufWinNr = -1
endif
return l:bufWinNr
endfunction " %%
" Win_FindOrCreate - Attempts to find a window for a named buffer. ~~
"
" If it is found then moves there. Otherwise creates a new window and
" configures it and moves there.
"
" forceEdge, -1 use defaults, 0 below, 1 above
" isExplorer, 0 no, 1 yes
" 0 no, 1 yes
function! <SID>Win_FindOrCreate(bufName, forceEdge, isExplorer)
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('ENTER: Win_FindOrCreate('.a:bufName.')',10)
"endif
" Save the user's split setting.
let l:saveSplitBelow = &splitbelow
" Set to our new values.
let &splitbelow = g:Tb_SplitBelow
" Try to find an existing explorer window
let l:winNum = <SID>Win_Find(a:bufName)
" If found goto the existing window, otherwise
" split open a new window.
if l:winNum != -1
" if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('Found window ('.a:bufName.'): '.l:winNum,9)
" endif
exec l:winNum.' wincmd w'
let l:winFound = 1
else
"if g:Tb_SplitToEdge == 1 || a:forceEdge >= 0
if a:forceEdge >= 0
let l:edge = &splitbelow
if a:forceEdge >= 0
let l:edge = a:forceEdge
endif
if l:edge
if g:Tb_VSplit == 0
exec 'bo sp '.a:bufName
else
exec 'bo vsp '.a:bufName
endif
else
if g:Tb_VSplit == 0
exec 'to sp '.a:bufName
else
exec 'to vsp '.a:bufName
endif
endif
else
if g:Tb_VSplit == 0
exec 'sp '.a:bufName
else
" &splitbelow doesn't affect vertical splits
" so we have to do this explicitly.. ugh.
if &splitbelow
exec 'rightb vsp '.a:bufName
else
exec 'vsp '.a:bufName
endif
endif
endif
let g:Tb_ForceDisplay = 1
" Try to find an existing explorer window
let l:winNum = <SID>Win_Find(a:bufName)
if l:winNum != -1
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('Created and then found window ('.a:bufName.'): '.l:winNum,9)
"endif
exec l:winNum.' wincmd w'
else
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('Win_FindOrCreate failed to create window ('.a:bufName.').',1)
"endif
return
endif
if a:isExplorer
" Turn off the swapfile, set the buffer type so that it won't get written,
" and so that it will get deleted when it gets hidden and turn on word wrap.
setlocal noswapfile
setlocal buftype=nofile
setlocal bufhidden=delete
if g:Tb_VSplit == 0
setlocal wrap
else
setlocal nowrap
exec('setlocal winwidth='.g:Tb_MinSize)
endif
endif
"if g:Tb_DBG_LVL > 0
" call <SID>DEBUG('Window ('.a:bufName.') created: '.winnr(),9)
"endif
endif
" Restore the user's split setting.
let &splitbelow = l:saveSplitBelow
endfunction " %%
" Win_Resize - Set width/height of -TabBar- window ~~
"
" Makes sure we are in our explorer, then sets the height/width for our explorer
" window so that we can fit all of our information without taking extra lines.
function! <SID>Win_Resize()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Win_Resize()',10)
endif
" Make sure we are in our window
if bufname('%') != '-TabBar-'
call <SID>DEBUG('EXIT : Win_Resize called in invalid window',1)
return
endif
let l:width = winwidth('.')
" Horizontal Resize
if g:Tb_VSplit == 0
if g:Tb_TabWrap == 0
let l:length = strlen(getline('.'))
let l:height = 0
if (l:width == 0)
let l:height = winheight('.')
else
let l:height = (l:length / l:width)
" handle truncation from div
if (l:length % l:width) != 0
let l:height = l:height + 1
endif
endif
else
exec("setlocal textwidth=".l:width)
normal gg
normal gq}
normal G
let l:height = line('.')
normal gg
endif
" enforce max window height
if g:Tb_MaxSize != 0
if g:Tb_MaxSize < l:height
let l:height = g:Tb_MaxSize
endif
endif
" enfore min window height
if l:height < g:Tb_MinSize || l:height == 0
let l:height = g:Tb_MinSize
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Win_Resize to '.l:height.' lines',9)
endif
exec('resize '.l:height)
" Vertical Resize
else
if g:Tb_MaxSize != 0
let l:newWidth = s:maxTabWidth
if l:newWidth > g:Tb_MaxSize
let l:newWidth = g:Tb_MaxSize
endif
if l:newWidth < g:Tb_MinSize
let l:newWidth = g:Tb_MinSize
endif
else
let l:newWidth = g:Tb_VSplit
endif
if l:width != l:newWidth
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Win_Resize to '.l:newWidth.' columns',9)
endif
exec('vertical resize '.l:newWidth)
endif
endif
endfunction " %%
"-------------------"
" Buffer operations "
"-------------------"
" Bf_Choosed - From the -TabBar- window, return the bufnum for buf under cursor ~~
" If we are in our explorer window then return the buffer number
" for the buffer under the cursor.
function! <SID>Bf_Choosed()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_Choosed()',10)
endif
" Make sure we are in our window
if bufname('%') != '-TabBar-'
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_Choosed: called in invalid window',1)
endif
return -1
endif
let l:save_reg = @"
let @" = ""
normal ""yi[
if @" != ""
let l:retv = substitute(@",'\([0-9]*\):.*', '\1', '') + 0
let @" = l:save_reg
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_Choosed: l:retv='.l:retv,5)
endif
return l:retv
else
let @" = l:save_reg
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_Choosed: return -1',1)
endif
return -1
endif
endfunction " %%
" Bf_DelWithD - From the -TabBar- window, delete selected buffer from list ~~
" After making sure that we are in our explorer, This will delete the buffer
" under the cursor. If the buffer under the cursor is being displayed in a
" window, this routine will attempt to get different buffers into the
" windows that will be affected so that windows don't get removed.
function! <SID>Bf_DelWithD()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_DelWithD() g:Tb_VimBufList =['. g:Tb_VimBufList.'] g:Tb_BufferMap=['.g:Tb_BufferMap.']',10)
endif
" Make sure we are in our window
if bufname('%') != '-TabBar-'
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_DelWithD not called in -TabBar-',1)
endif
return
endif
let l:selected_buf = <SID>Bf_Choosed()
let l:selected_buf = <SID>Map_Get_key( l:selected_buf )
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: l:selected_buf=['.l:selected_buf.']',5)
endif
let l:selected_name = bufname(l:selected_buf +0 )
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: l:selBufName=['. l:selected_name.']',5)
endif
let l:curLine = line('.')
let l:curCol = virtcol('.')
"make the filename an option
if l:selected_name == 'TabBar.DBG' && g:Tb_DBG_LVL > 0
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_DelWithD will not delete the debug window.',1)
endif
return
endif
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
if l:selected_buf != -1 && l:selected_name != ""
" Don't want auto updates while we are processing a delete
" request.
let l:saveTb_AutoUpdt = g:Tb_AutoUpdt
let g:Tb_AutoUpdt = 0
" Save previous window so that if we show a buffer after
" deleting. The show will come up in the correct window.
wincmd p
let l:prevWin = winnr()
let l:prevWinBuf = winbufnr(winnr())
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: l:prevWin='.l:prevWin.' buffer in window: '.l:prevWinBuf,5)
call <SID>DEBUG('Bf_DelWithD: l:selected_name=<'.l:selected_name.'>: l:selected_buf=['.l:selected_buf.']',5)
endif
" If buffer is being displayed in a window then
" move window to a different buffer before
" deleting this one.
let l:winNum = (bufwinnr(l:selected_name) + 0)
" while we have windows that contain our buffer
while l:winNum != -1
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: l:selected_buf='.l:selected_buf.' is being displayed in window: l:winNum='.l:winNum,5)
endif
" move to window that contains our selected buffer
exec l:winNum.' wincmd w'
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: We are now in window: '.winnr().' which contains buffer: '.bufnr('%').' and should contain buffer: '.l:selected_buf,5)
endif
let l:origBuf = bufnr('%')
call <SID>Bf_Cycle(1)
let l:curBuf = bufnr('%')
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: Window now contains buffer: '.bufnr('%').' which should not be: '.l:selected_buf,5)
endif
if l:origBuf == l:curBuf
" we wrapped so we are going to have to delete a buffer
" that is in an open window.
let l:winNum = -1
else
" see if we have anymore windows with our selected buffer
let l:winNum = (bufwinnr(l:selected_name) + 0)
endif
endwhile
" Attempt to restore previous window
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: Restoring previous window to: '.l:prevWin,5)
endif
exec l:prevWin.' wincmd w'
" Try to get back to the -TabBar- window
let l:winNum = bufwinnr(bufnr('-TabBar-'))
if l:winNum != -1
exec l:winNum.' wincmd w'
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: Got to -TabBar- window: '.winnr(),5)
endif
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: Unable to get to -TabBar- window',1)
endif
endif
" Delete the buffer selected.
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: About to delete buffer: '.l:selected_buf,5)
endif
" [displayed_buffer]-- [real_buffer] list
"let l:vimBuf = <SID>Map_Get_key( l:selected_buf )
exec('silent! bd '.l:selected_buf )
let g:Tb_AutoUpdt = l:saveTb_AutoUpdt
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_DelWithD: current window=: '.bufname('%'),5)
endif
call <SID>Bf_SafePrint(1)
call cursor(l:curLine, l:curCol)
endif
let &report = l:save_rep
let &showcmd = l:save_sc
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_DelWithD() g:Tb_VimBufList =['. g:Tb_VimBufList.'] g:Tb_BufferMap=['.g:Tb_BufferMap.']',10)
endif
endfunction " %%
" Bf_SafePrint - Wrapper for getting -TabBar- window shown ~~
"
" Makes sure we are in our explorer, then erases the current buffer and turns
" it into a mini buffer explorer window.
function! <SID>Bf_SafePrint(delBufNum)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_SafePrint()',10)
endif
" Make sure we are in our window
if bufname('%') != '-TabBar-'
call <SID>DEBUG('EXIT : Bf_SafePrint not called in -TabBar-',1)
return
endif
" We need to be able to modify the buffer
setlocal modifiable
call <SID>Bf_PrintList(a:delBufNum)
call <SID>Win_Resize()
normal! zz
" Prevent the buffer from being modified.
setlocal nomodifiable
set nobuflisted
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_SafePrint()',10)
endif
endfunction " %%
" Bf_PrintList - Clear current buffer and put the -TabBar- text into it ~~
" Makes sure we are in our explorer, then adds a list of all modifiable
" buffers to the current buffer. Special marks are added for buffers that
" are in one or more windows (*) and buffers that have been modified (+)
function! <SID>Bf_PrintList(delBufNum)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_PrintList()',10)
endif
let l:ListChanged = <SID>Bf_BuildList(a:delBufNum, 1)
if (l:ListChanged == 1 || g:Tb_ForceDisplay)
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
" Delete all lines in buffer.
1,$d _
" Goto the end of the buffer put the buffer list
" and then delete the extra trailing blank line
$
put! =g:Tb_VimBufList
$ d _
let g:Tb_ForceDisplay = 0
let &report = l:save_rep
let &showcmd = l:save_sc
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Buffer list not update since there was no change',9)
endif
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_PrintList()',10)
endif
endfunction " %%
" Bf_BuildList - Build the text for the -TabBar- window ~~
" Creates the buffer list string and returns 1 if it is different than
" last time this was called and 0 otherwise.
function! <SID>Bf_BuildList(delBufNum, updateBufList)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_BuildList()',10)
endif
let l:NBuffers = bufnr('$') " Get the number of the last buffer.
let l:i = 0 " Set the buffer index to zero.
let l:y = 0 " Displayed buffers: more sugestive
let l:fileNames = ''
let l:maxTabWidth = 0
call <SID>Map_Clear()
" Loop through every buffer less than the total number of buffers.
while( l:i <= l:NBuffers)
let l:i = l:i + 1
" If we have a delBufNum and it is the current
" buffer then ignore the current buffer.
" Otherwise, continue.
if (a:delBufNum == -1 || l:i != a:delBufNum)
" Make sure the buffer in question is listed.
if(getbufvar(l:i, '&buflisted') == 1)
" Get the name of the buffer.
let l:BufName = bufname(l:i)
" Check to see if the buffer is a blank or not. If the buffer does have
" a name, process it.
if(strlen(l:BufName))
" Only show modifiable buffers (The idea is that we don't
" want to show Explorers)
if (getbufvar(l:i, '&modifiable') == 1 && BufName != '-TabBar-')
" Get filename & Remove []'s & ()'s
let l:shortBufName = fnamemodify(l:BufName, ":t")
let l:shortBufName = substitute(l:shortBufName, '[][()]', '', 'g')
let l:y =l:y +1
let g:Tb_BufferMap=g:Tb_BufferMap . l:y . "-" . l:i . "\r"
let l:tab = '['.l:y.':'.l:shortBufName." ]"
" If the buffer is open in a window mark it
if bufwinnr(l:i) != -1
let l:tab = "[".l:y.':'.l:shortBufName."]*"
endif
" If the buffer is modified then mark it
if(getbufvar(l:i, '&modified') == 1)
let l:tab = l:tab . '+'
endif
let l:maxTabWidth = <SID>Tb_Max(strlen(l:tab), l:maxTabWidth)
let l:fileNames = l:fileNames.l:tab
" If horizontal and tab wrap is turned on we need to add spaces
if g:Tb_VSplit == 0
if g:Tb_TabWrap != 0
let l:fileNames = l:fileNames.' '
endif
" If not horizontal we need a newline
else
let l:fileNames = l:fileNames . "\n"
endif
endif
endif
endif
endif
endwhile
if (g:Tb_VimBufList != l:fileNames)
if (a:updateBufList)
let g:Tb_VimBufList = l:fileNames
let s:maxTabWidth = l:maxTabWidth
endif
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_BuildList: Bf_List has changed',10)
endif
return 1
else
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_BuildList: no changes',10)
endif
return 0
endif
endfunction " %%
" Bf_Eligible - Are there enough -TabBar- eligible buffers to open the -TabBar- window? ~~
" Returns 1 if there are any buffers that can be displayed in a
" mini buffer explorer. Otherwise returns 0. If delBufNum is
" any non -1 value then don't include that buffer in the list
" of eligible buffers.
function! <SID>Bf_Eligible(delBufNum)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_Eligible()',10)
endif
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
let l:NBuffers = bufnr('$') " Get the number of the last buffer.
let l:i = 0 " Set the buffer index to zero.
let l:found = 0 " No buffer found
if (g:Tb_MoreThanOne > 1)
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('Bf_Eligible : More Than One mode turned on',6)
endif
endif
let l:needed = g:Tb_MoreThanOne
" Loop through every buffer less than the total number of buffers.
while(l:i <= l:NBuffers && l:found < l:needed)
let l:i = l:i + 1
" If we have a delBufNum and it is the current
" buffer then ignore the current buffer.
" Otherwise, continue.
if (a:delBufNum == -1 || l:i != a:delBufNum)
" Make sure the buffer in question is listed.
if (getbufvar(l:i, '&buflisted') == 1)
" Get the name of the buffer.
let l:BufName = bufname(l:i)
" Check to see if the buffer is a blank or not. If the buffer does have
" a name, process it.
if (strlen(l:BufName))
" Only show modifiable buffers (The idea is that we don't
" want to show Explorers)
if ((getbufvar(l:i, '&modifiable') == 1) && (BufName != '-TabBar-'))
let l:found = l:found + 1
endif
endif
endif
endif
endwhile
let &report = l:save_rep
let &showcmd = l:save_sc
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_Eligible '.l:found.' eligible buffers of '.l:needed.' needed',6)
endif
return (l:found >= l:needed)
endfunction " %%
" Bf_SwitchTo Switch to bufNum( parameter) buffer~~
function! <SID>Bf_SwitchTo( bufNum)
let l:vimbuf = <SID>Map_Get_key( a:bufNum )
exec "b!" . l:vimbuf
endfunction " %%
" Bf_CrSel - From the -TabBar- window, open buffer under the cursor ~~
" If we are in our explorer, then we attempt to open the buffer under the
" cursor in the previous window.
function! <SID>Bf_CrSel()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_CrSel()' ,10)
endif
" Make sure we are in our window
if bufname('%') != '-TabBar-'
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_CrSel : called in invalid window',1)
endif
return
endif
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
let l:bufnr = <SID>Bf_Choosed()
let l:resize = 0
if(l:bufnr != -1) " If the buffer exists.
let l:saveTb_AutoUpdt = g:Tb_AutoUpdt
let g:Tb_AutoUpdt = 0
" Switch to the previous window
wincmd p
" If we are in the buffer explorer or in a nonmodifiable buffer with
" g:Tb_ModSelTarget set then try another window (a few times)
if bufname('%') == '-TabBar-' || (g:Tb_ModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
wincmd w
if bufname('%') == '-TabBar-' || (g:Tb_ModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
wincmd w
if bufname('%') == '-TabBar-' || (g:Tb_ModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable') == 0)
wincmd w
" The following handles the case where -TabBar-
" is the only window left. We need to resize so we don't
" end up with a 1 or two line buffer.
if bufname('%') == '-TabBar-'
let l:resize = 1
endif
endif
endif
endif
"exec('b! '.l:bufnr)
call <SID>Bf_SwitchTo( l:bufnr)
if (l:resize)
resize
endif
let g:Tb_AutoUpdt = l:saveTb_AutoUpdt
call <SID>Tb_AutoUpdt(-1)
endif
let &report = l:save_rep
let &showcmd = l:save_sc
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_CrSel()',10)
endif
endfunction " %%
" Bf_DblClkSel - Double click with the mouse.~~
function! <SID>Bf_DblClkSel()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('ENTER: Bf_DblClkSel()',10)
endif
call <SID>Bf_CrSel()
if g:Tb_DBG_LVL > 0
call <SID>DEBUG('EXIT : Bf_DblClkSel()',10)
endif
endfunction " %%
" Bf_Cycle - Cycle Through Buffers ~~
" Move to next or previous buffer in the current window. If there
" are no more modifiable buffers then stay on the current buffer.
" can be called with no parameters in which case the buffers are
" cycled forward. Otherwise a single argument is accepted, if
" it's 0 then the buffers are cycled backwards, otherwise they
" are cycled forward.
function! <SID>Bf_Cycle(forward)
" The following hack handles the case where we only have one
" window open and it is too small
let l:saveTb_AutoUpdt = g:Tb_AutoUpdt
if (winbufnr(2) == -1)
resize
let g:Tb_AutoUpdt = 0
endif
" Change buffer (keeping track of before and after buffers)
let l:origBuf = bufnr('%')
if (a:forward == 1)
bn!
else
bp!
endif
let l:curBuf = bufnr('%')
" Skip any non-modifiable buffers, but don't cycle forever
" This should stop us from stopping in any of the [Explorers]
" FIXME: infite loop
while getbufvar(l:curBuf, '&modifiable') == 0 && l:origBuf != l:curBuf
if (a:forward == 1)
bn!
else
bp!
endif
let l:curBuf = bufnr('%')
endwhile
let g:Tb_AutoUpdt = l:saveTb_AutoUpdt
if (l:saveTb_AutoUpdt == 1)
call <SID>Tb_AutoUpdt(-1)
endif
endfunction " %%
" the format for a map is something like:
" idx-key\r
" idx: the number displayed in tabbar [idx:fooBar.txt]
" key: the buffer number in which idx is hold
function! <SID>Map_Get_key( idx )
let l:i=matchstr( g:Tb_BufferMap, a:idx . "-[0-9]*\r" )
let l:x=substitute (l:i , a:idx ."-", "","")
let l:x=substitute (l:x , "\r", "","")
return l:x
endfunction
function! <SID>Map_Get_idx( key )
let l:i=matchstr( g:Tb_BufferMap, "[0-9]*-" , a:key."\r" )
let l:x=substitute (l:i , "-".a:key, "","")
let l:x=substitute (l:x , "\r", "","")
return l:x
endfunction
" I know this is short, But it keeps the code clean
function! <SID>Map_Clear()
let g:Tb_BufferMap=''
endfunction
" DEBUG - Display debug output when debugging is turned on ~~
" Thanks to Charles E. Campbell, Jr. PhD <cec@NgrOyphSon.gPsfAc.nMasa.gov>
" for Decho.vim which was the inspiration for this enhanced debugging
" capability.
function! <SID>DEBUG(msg, level)
if g:Tb_DBG_LVL >= a:level
" Prevent a report of our actions from showing up.
let l:save_rep = &report
let l:save_sc = &showcmd
let &report = 10000
set noshowcmd
" Debug output to a buffer
if g:Tb_DebugMode == 0
" Save the current window number so we can come back here
let l:prevWin = winnr()
wincmd p
let l:prevPrevWin = winnr()
wincmd p
" Get into the debug window or create it if needed
call <SID>Win_FindOrCreate('TabBar.DBG', 1, 0)
" Make sure we really got to our window, if not we
" will display a confirm dialog and turn debugging
" off so that we won't break things even more.
if bufname('%') != 'TabBar.DBG'
call confirm('ERROR in window debugging code. Dissabling TabBar debugging.', 'OK')
let g:Tb_DBG_LVL = 0
endif
" Write Message to DBG buffer
let res=append("$",s:DBG_LN_CNT.':'.a:level.":\t".a:msg)
norm G
"set nomodified
" Return to original window
exec l:prevPrevWin.' wincmd w'
exec l:prevWin.' wincmd w'
" Debug output using VIM's echo facility
elseif g:Tb_DebugMode == 1
echo s:DBG_LN_CNT.':'.a:level.':'.a:msg
" Debug output to a file -- VERY SLOW!!!
" should be OK on UNIX and Win32 (not the 95/98 variants)
elseif g:Tb_DebugMode == 2
if has('system') || has('fork')
if has('win32') && !has('win95')
let l:result = system("cmd /c 'echo ".s:DBG_LN_CNT.':'.a:level.':'.a:msg." >> TabBar.DBG'")
endif
if has('unix')
let l:result = system("echo '".s:DBG_LN_CNT.':'.a:level.':'.a:msg." >> TabBar.DBG'")
endif
else
call confirm('Error in file writing version of the debugging code, vim not compiled with system or fork. Dissabling TabBar debugging.', 'OK')
let g:Tb_DBG_LVL = 0
endif
elseif g:Tb_DebugMode == 3
let g:Tb_DbgOutput = g:Tb_DbgOutput."\n".s:DBG_LN_CNT.':'.a:level.':'.a:msg
endif
let s:DBG_LN_CNT = s:DBG_LN_CNT + 1
let &report = l:save_rep
let &showcmd = l:save_sc
endif
endfunc " %%
" Documentation~~
"
" :TbStart .......... Open and/or goto Explorer
" :TbStop .......... Close the Explorer if it's open
" :TbAup .......... Update Explorer without navigating
" :TbToggle ......... Toggle Tabbar
"``````````````````````````````````````````````````````````````````
"
"
" let g:Tb_SplitBelow=0 " Put new window above current or on the left
" for vertical split
" let g:Tb_SplitBelow=1 " Put new window below current or on the right
" for vertical split
" By default we are now forcing the Tabbar window to open up at the edge of
" the screen.
" You can turn this off by setting the following variable in .vimrc:
"
" let g:Tb_SplitToEdge = 0
" o IN HORIZONTAL MODE
" You can set the max height by setting this in .vimrc:
"
" let g:Tb_MaxSize = <max lines: default 0>
"
" Setting this to 0 will mean the window gets as big as
" needed to fit all your buffers.
"
" o NOTE
" You can set the min height by
" letting the following variable in your .vimrc:
"
" let g:Tb_MinSize = <min height: default 1>
"
" o IN VERTICAL MODE
" By default the vertical explorer has a fixed width. If you put:
"
" let g:Tb_MaxSize = <max width: default 0>
"
" into your .vimrc then tabbar will attempt to set the width of the
" tabbar window to be as wide as your widest tab. The width will not
" exceed Tb_MaxSize even if you have wider tabs.
"
" Accepting the default value of 0 for this will give you a fixed
" width tabbar window.
"
" -- You can specify a MinSize for the vertical explorer window by
" putting the following in your .vimrc:
"
" let g:Tb_MinSize = <min width: default 1>
"
" This will have no effect unless you also specivy Tb_MaxSize.
"````````````````````````````````````````````````````````````````
"
"
" -- This stops the -TabBar- from opening
" automatically until more than one eligible buffer is available.
" You can turn this feature off by setting the following variable
" in your .vimrc:
" Setting this to 0 will cause the TabBar window to be loaded even
" if no buffers are available. Setting it to 1 causes the TabBar
" window to be loaded as soon as an eligible buffer is read. You
" can also set it to larger numbers. So if you set it to 4 for
" example the TabBar window wouldn't auto-open until 4 eligibles
" buffers had been loaded. This is nice for folks that don't
" want an TabBar window unless they are editing more than two or
" three buffers.
"
" let g:Tb_MoreThanOne=1
"``````````````````````````````````````````````````````````````````
"
"
" -- To enable the optional mapping of Control + Vim Direction Keys
" [hjkl] to window movement commands, you can put the following into
" your .vimrc:
"
" let g:Tb_MapWindowNavVim = 1
"
" To enable the optional mapping of Control + Arrow Keys to window
" movement commands, you can put the following into your .vimrc:
"
" let g:Tb_MapWindowNavArrows = 1
"``````````````````````````````````````````````````````````````````
"
"
" -- To enable the optional mapping of <C-TAB> and <C-S-TAB> to a
" function that will bring up the next or previous buffer in the
" current window, you can put the following into your .vimrc:
"
" let g:Tb_MapCTabSwitchBufs = 1
"````````````````````````````````````````````````````````````````
"
"
" -- To enable the optional mapping of <C-TAB> and <C-S-TAB> to mappings
" that will move to the next and previous (respectively) window, you
" can put the following into your .vimrc:
"
" let g:Tb_MapCTabSwitchWindows = 1
"
"
" o NOTE
" If you set TabSwitchBufs AND ...TabSwitchWindows,
" TabSwitchBufs will *BE* enabled and
" TabSwitchWindows will be *NOT*.
"``````````````````````````````````````````````````````````````````
"
"
" -- If you would like to single click on tabs rather than double
" clicking on them to goto the selected buffer.
"
" let g:Tb_UseSingleClick = 1
"````````````````````````````````````````````````````````````````
"
"
" -- It is possible to customize the the highlighting for the tabs in
" the TabBar by configuring the following highlighting groups:
"
" Tb_Normal ............. for buffers that have NOT CHANGED and
" are NOT VISIBLE.
" Tb_Changed ............. for buffers that HAVE CHANGED and are
" NOT VISIBLE
" Tb_VisibleNormal ....... buffers that have NOT CHANGED and are
" VISIBLE
" Tb_VisibleChanged ...... buffers that have CHANGED and are VISIBLE
"
" You can either link to an existing highlighting group by
" adding a command like:
"
" hi link Tb_VisibleChanged Error
"
" to your .vimrc or you can specify exact foreground and background
" colors using the following syntax:
"
" hi Tb_Changed guibg=darkblue ctermbg=darkblue termbg=white
"
" o NOTE
" If you set a colorscheme in your .vimrc you should do it
" BEFORE updating the TabBar highlighting groups.
"
" If you use other explorers like TagList you can put:
"
" let g:Tb_ModSelTarget = 1
"
" into your .vimrc in order to force TabBar to try to place selected
" buffers into a window that does not have a nonmodifiable buffer.
" The upshot of this should be that if you go into TabBar and select
" a buffer, the buffer should not show up in a window that is
" hosting an explorer.
"
" let g:Tb_ForceSyntaxEnable = 1
"````````````````````````````````````````````````````````````````
"
"
" -- TabBar has a basic debugging capability.
" let g:Tb_DebugLevel = 0 " TabBar serious errors output
" let g:Tb_DebugLevel = 4 " TabBar all errors output
" let g:Tb_DebugLevel = 10 " TabBar reports everything
"
" You can also set a DebugMode to cause output to be target as
" follows (default is mode 3):
"
" let g:Tb_DebugMode = 0 " Errors will show up in a vim window
" let g:Tb_DebugMode = 1 " Uses VIM's echo function to display on
" " the screen
" let g:Tb_DebugMode = 2 " Writes to a file TabBarDBG.vim
" let g:Tb_DebugMode = 3 " Store output in variable g:Tb_DbgOutput
"
" Or if you are able to start VIM, you might just perform these
" at a command prompt right before you do the operation that is
" failing.
"````````````````````````````````````````````````````````````````
" %%
" BUGFIX:
" 0.7. Removed mapping to <tt>, to avoid delayed response to <<
" 0.6. Fixed the "delete with d" bug.
" TODO: 0. When the tabbar is full, try to scroll it
" 1. See what is goind on with the error "Not enough space"
" 2. Indent code
" 3. Optimize code
" 4. Better Document
" 5. noremap in vimrc to <C-TAB> to update the buffer list
" 6. noremap in vimrc to <?> to switch to -TabBar-
"vim:foldmethod=marker vim:foldmarker=~~,%%