From 495e5fcb080044af820c1756a923624057889adb Mon Sep 17 00:00:00 2001 From: Jan Larres Date: Mon, 26 Mar 2012 19:42:12 +1300 Subject: [PATCH 1/3] Allow customizing the statusline --- autoload/tagbar.vim | 81 ++++++++++++++++++++++++++++++++++++++++----- plugin/tagbar.vim | 4 +++ 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/autoload/tagbar.vim b/autoload/tagbar.vim index b4e81b7..c3505a1 100644 --- a/autoload/tagbar.vim +++ b/autoload/tagbar.vim @@ -958,6 +958,8 @@ function! s:CreateAutocommands() abort autocmd! autocmd BufEnter __Tagbar__ nested call s:QuitIfOnlyWindow() autocmd CursorHold __Tagbar__ call s:ShowPrototype(1) + autocmd WinEnter __Tagbar__ call s:SetStatusLine('current') + autocmd WinLeave __Tagbar__ call s:SetStatusLine('noncurrent') autocmd BufReadPost,BufWritePost * call \ s:AutoUpdate(fnamemodify(expand(''), ':p'), 1) @@ -1700,6 +1702,7 @@ function! s:OpenWindow(flags) abort let eventignore_save = &eventignore set eventignore=all + call s:SetStatusLineOther('noncurrent') let openpos = g:tagbar_left ? 'topleft vertical ' : 'botright vertical ' exe 'silent keepalt ' . openpos . g:tagbar_width . 'split ' . '__Tagbar__' @@ -1716,10 +1719,13 @@ function! s:OpenWindow(flags) abort endif call s:AutoUpdate(curfile, 0) + call s:SetStatusLine('current') call s:HighlightTag(g:tagbar_autoshowtag != 2, 1, curline) if !(g:tagbar_autoclose || autofocus || g:tagbar_autofocus) call s:winexec('wincmd p') + call s:SetStatusLine('noncurrent') + call s:SetStatusLineOther('current') endif call s:LogDebugMessage('OpenWindow finished') @@ -1757,11 +1763,12 @@ function! s:InitWindow(autoclose) abort setlocal foldexpr& " Earlier versions have a bug in local, evaluated statuslines - if v:version > 701 || (v:version == 701 && has('patch097')) - setlocal statusline=%!TagbarGenerateStatusline() - else - setlocal statusline=Tagbar - endif + " if v:version > 701 || (v:version == 701 && has('patch097')) + " setlocal statusline=%!TagbarGenerateStatusline() + " else + " setlocal statusline=Tagbar + " endif + call s:SetStatusLine('current') let s:new_window = 1 @@ -1859,6 +1866,7 @@ function! s:CloseWindow() abort autocmd! TagbarAutoCmds let s:autocommands_done = 0 endif + call s:SetStatusLineOther('current') call s:LogDebugMessage('CloseWindow finished') endfunction @@ -2465,6 +2473,7 @@ function! s:ToggleSort() abort call fileinfo.sortTags() call s:RenderContent() + call s:SetStatusLine('current') execute curline endfunction @@ -2857,6 +2866,8 @@ function! s:JumpToTag(stay_in_tagbar) abort let tagbarwinnr = winnr() + call s:SetStatusLine('noncurrent') + call s:GotoPreviousWindow(taginfo.fileinfo) " Mark current position so it can be jumped back to @@ -2900,15 +2911,16 @@ function! s:JumpToTag(stay_in_tagbar) abort .foldopen endif - redraw - if a:stay_in_tagbar call s:HighlightTag(0) call s:winexec(tagbarwinnr . 'wincmd w') + call s:SetStatusLine('current') + redraw elseif g:tagbar_autoclose || autoclose call s:CloseWindow() else call s:HighlightTag(0) + call s:SetStatusLineOther('current') endif endfunction @@ -3183,6 +3195,8 @@ function! s:AutoUpdate(fname, force) abort let s:nearby_disabled = 0 endif + call s:SetStatusLine(bufwinnr('__Tagbar__' == winnr() ? 'current' + \ : 'noncurrent')) call s:HighlightTag(0) call s:LogDebugMessage('AutoUpdate finished successfully') endfunction @@ -3510,6 +3524,57 @@ function! s:IsValidFile(fname, ftype) abort return 1 endfunction +" s:SetStatusLine() {{{2 +function! s:SetStatusLine(current) + " Make sure we're actually in the Tagbar window + let tagbarwinnr = bufwinnr('__Tagbar__') + if tagbarwinnr == -1 + return + endif + if tagbarwinnr != winnr() + let in_tagbar = 0 + call s:winexec(tagbarwinnr . 'wincmd w') + else + let in_tagbar = 1 + endif + let current = a:current == 'current' ? 1 : 0 + + if g:tagbar_sort + let sort = 'Name' + else + let sort = 'Order' + endif + + if !empty(s:known_files.getCurrent()) + let fname = fnamemodify(s:known_files.getCurrent().fpath, ':t') + else + let fname = '' + endif + + if has_key(g:tagbar_statusfuncs, 'tagbar') + let args = [current, sort, fname] + let &l:statusline = call(g:tagbar_statusfuncs.tagbar, args) + else + let colour = current ? '%#StatusLine#' : '%#StatusLineNC#' + let text = colour . '[' . sort . '] ' . fname + let &l:statusline = text + endif + + if !in_tagbar + call s:winexec('wincmd p') + endif +endfunction + +" s:SetStatusLineOther() {{{2 +function! s:SetStatusLineOther(current) + let current = a:current == 'current' ? 1 : 0 + + if has_key(g:tagbar_statusfuncs, 'other') + let args = [current] + let &l:statusline = call(g:tagbar_statusfuncs.other, args) + endif +endfunction + " s:QuitIfOnlyWindow() {{{2 function! s:QuitIfOnlyWindow() abort " Check if there is more than one window @@ -3566,7 +3631,7 @@ function! s:winexec(cmd) abort call s:LogDebugMessage("Executing without autocommands: " . a:cmd) let eventignore_save = &eventignore - set eventignore=BufEnter + set eventignore=all execute a:cmd diff --git a/plugin/tagbar.vim b/plugin/tagbar.vim index a3cc757..43462da 100644 --- a/plugin/tagbar.vim +++ b/plugin/tagbar.vim @@ -103,6 +103,10 @@ if !exists('g:tagbar_systemenc') let g:tagbar_systemenc = &encoding endif +if !exists('g:tagbar_statusfuncs') + let g:tagbar_statusfuncs = {} +endif + augroup TagbarSession autocmd! autocmd SessionLoadPost * nested call tagbar#RestoreSession() From 57acb383b649991a3d28cdf4673672351b3e8d4c Mon Sep 17 00:00:00 2001 From: Jan Larres Date: Wed, 21 Aug 2013 18:28:40 +1200 Subject: [PATCH 2/3] Statusline tweaks --- autoload/tagbar.vim | 50 +++++++++++++++------------------------------ plugin/tagbar.vim | 4 ---- 2 files changed, 16 insertions(+), 38 deletions(-) diff --git a/autoload/tagbar.vim b/autoload/tagbar.vim index c3505a1..e7609ed 100644 --- a/autoload/tagbar.vim +++ b/autoload/tagbar.vim @@ -1699,14 +1699,13 @@ function! s:OpenWindow(flags) abort let s:window_expanded = 1 endif - let eventignore_save = &eventignore - set eventignore=all + " let eventignore_save = &eventignore + " set eventignore=all - call s:SetStatusLineOther('noncurrent') let openpos = g:tagbar_left ? 'topleft vertical ' : 'botright vertical ' exe 'silent keepalt ' . openpos . g:tagbar_width . 'split ' . '__Tagbar__' - let &eventignore = eventignore_save + " let &eventignore = eventignore_save call s:InitWindow(autoclose) @@ -1719,13 +1718,12 @@ function! s:OpenWindow(flags) abort endif call s:AutoUpdate(curfile, 0) - call s:SetStatusLine('current') + " call s:SetStatusLine('current') call s:HighlightTag(g:tagbar_autoshowtag != 2, 1, curline) if !(g:tagbar_autoclose || autofocus || g:tagbar_autofocus) call s:winexec('wincmd p') - call s:SetStatusLine('noncurrent') - call s:SetStatusLineOther('current') + " call s:SetStatusLine('noncurrent') endif call s:LogDebugMessage('OpenWindow finished') @@ -1866,7 +1864,6 @@ function! s:CloseWindow() abort autocmd! TagbarAutoCmds let s:autocommands_done = 0 endif - call s:SetStatusLineOther('current') call s:LogDebugMessage('CloseWindow finished') endfunction @@ -2866,7 +2863,7 @@ function! s:JumpToTag(stay_in_tagbar) abort let tagbarwinnr = winnr() - call s:SetStatusLine('noncurrent') + " call s:SetStatusLine('noncurrent') call s:GotoPreviousWindow(taginfo.fileinfo) @@ -2914,13 +2911,12 @@ function! s:JumpToTag(stay_in_tagbar) abort if a:stay_in_tagbar call s:HighlightTag(0) call s:winexec(tagbarwinnr . 'wincmd w') - call s:SetStatusLine('current') + " call s:SetStatusLine('current') redraw elseif g:tagbar_autoclose || autoclose call s:CloseWindow() else call s:HighlightTag(0) - call s:SetStatusLineOther('current') endif endfunction @@ -3195,8 +3191,8 @@ function! s:AutoUpdate(fname, force) abort let s:nearby_disabled = 0 endif - call s:SetStatusLine(bufwinnr('__Tagbar__' == winnr() ? 'current' - \ : 'noncurrent')) + " call s:SetStatusLine(bufwinnr('__Tagbar__' == winnr() ? 'current' + " \ : 'noncurrent')) call s:HighlightTag(0) call s:LogDebugMessage('AutoUpdate finished successfully') endfunction @@ -3537,13 +3533,9 @@ function! s:SetStatusLine(current) else let in_tagbar = 1 endif - let current = a:current == 'current' ? 1 : 0 + let current = a:current == 'current' - if g:tagbar_sort - let sort = 'Name' - else - let sort = 'Order' - endif + let sort = g:tagbar_sort ? 'Name' : 'Order' if !empty(s:known_files.getCurrent()) let fname = fnamemodify(s:known_files.getCurrent().fpath, ':t') @@ -3551,9 +3543,9 @@ function! s:SetStatusLine(current) let fname = '' endif - if has_key(g:tagbar_statusfuncs, 'tagbar') + if exists('g:tagbar_status_func') let args = [current, sort, fname] - let &l:statusline = call(g:tagbar_statusfuncs.tagbar, args) + let &l:statusline = call(g:tagbar_status_func, args) else let colour = current ? '%#StatusLine#' : '%#StatusLineNC#' let text = colour . '[' . sort . '] ' . fname @@ -3565,16 +3557,6 @@ function! s:SetStatusLine(current) endif endfunction -" s:SetStatusLineOther() {{{2 -function! s:SetStatusLineOther(current) - let current = a:current == 'current' ? 1 : 0 - - if has_key(g:tagbar_statusfuncs, 'other') - let args = [current] - let &l:statusline = call(g:tagbar_statusfuncs.other, args) - endif -endfunction - " s:QuitIfOnlyWindow() {{{2 function! s:QuitIfOnlyWindow() abort " Check if there is more than one window @@ -3630,12 +3612,12 @@ endfunction function! s:winexec(cmd) abort call s:LogDebugMessage("Executing without autocommands: " . a:cmd) - let eventignore_save = &eventignore - set eventignore=all + " let eventignore_save = &eventignore + " set eventignore=all execute a:cmd - let &eventignore = eventignore_save + " let &eventignore = eventignore_save endfunction " TagbarBalloonExpr() {{{2 diff --git a/plugin/tagbar.vim b/plugin/tagbar.vim index 43462da..a3cc757 100644 --- a/plugin/tagbar.vim +++ b/plugin/tagbar.vim @@ -103,10 +103,6 @@ if !exists('g:tagbar_systemenc') let g:tagbar_systemenc = &encoding endif -if !exists('g:tagbar_statusfuncs') - let g:tagbar_statusfuncs = {} -endif - augroup TagbarSession autocmd! autocmd SessionLoadPost * nested call tagbar#RestoreSession() From 84d65042faa147a766ad8aeb01903b5c367ef03f Mon Sep 17 00:00:00 2001 From: Jan Larres Date: Thu, 22 Aug 2013 19:06:28 +1200 Subject: [PATCH 3/3] Remove commented out statusline calls --- autoload/tagbar.vim | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/autoload/tagbar.vim b/autoload/tagbar.vim index e7609ed..797e494 100644 --- a/autoload/tagbar.vim +++ b/autoload/tagbar.vim @@ -1699,14 +1699,9 @@ function! s:OpenWindow(flags) abort let s:window_expanded = 1 endif - " let eventignore_save = &eventignore - " set eventignore=all - let openpos = g:tagbar_left ? 'topleft vertical ' : 'botright vertical ' exe 'silent keepalt ' . openpos . g:tagbar_width . 'split ' . '__Tagbar__' - " let &eventignore = eventignore_save - call s:InitWindow(autoclose) " If the current file exists, but is empty, it means that it had a @@ -1718,12 +1713,10 @@ function! s:OpenWindow(flags) abort endif call s:AutoUpdate(curfile, 0) - " call s:SetStatusLine('current') call s:HighlightTag(g:tagbar_autoshowtag != 2, 1, curline) if !(g:tagbar_autoclose || autofocus || g:tagbar_autofocus) call s:winexec('wincmd p') - " call s:SetStatusLine('noncurrent') endif call s:LogDebugMessage('OpenWindow finished') @@ -1760,12 +1753,6 @@ function! s:InitWindow(autoclose) abort setlocal foldmethod& setlocal foldexpr& - " Earlier versions have a bug in local, evaluated statuslines - " if v:version > 701 || (v:version == 701 && has('patch097')) - " setlocal statusline=%!TagbarGenerateStatusline() - " else - " setlocal statusline=Tagbar - " endif call s:SetStatusLine('current') let s:new_window = 1 @@ -2863,8 +2850,6 @@ function! s:JumpToTag(stay_in_tagbar) abort let tagbarwinnr = winnr() - " call s:SetStatusLine('noncurrent') - call s:GotoPreviousWindow(taginfo.fileinfo) " Mark current position so it can be jumped back to @@ -2911,7 +2896,6 @@ function! s:JumpToTag(stay_in_tagbar) abort if a:stay_in_tagbar call s:HighlightTag(0) call s:winexec(tagbarwinnr . 'wincmd w') - " call s:SetStatusLine('current') redraw elseif g:tagbar_autoclose || autoclose call s:CloseWindow() @@ -3191,8 +3175,6 @@ function! s:AutoUpdate(fname, force) abort let s:nearby_disabled = 0 endif - " call s:SetStatusLine(bufwinnr('__Tagbar__' == winnr() ? 'current' - " \ : 'noncurrent')) call s:HighlightTag(0) call s:LogDebugMessage('AutoUpdate finished successfully') endfunction @@ -3610,7 +3592,9 @@ endfunction " s:winexec() {{{2 function! s:winexec(cmd) abort - call s:LogDebugMessage("Executing without autocommands: " . a:cmd) + " Commented out for now to see if it works without. + + " call s:LogDebugMessage("Executing without autocommands: " . a:cmd) " let eventignore_save = &eventignore " set eventignore=all