Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Rework pause functionality, closes #177

The current pause functionality simply removes all the autocommands to
stop updating Tagbar. This has the problem that at the moment the
statusline functions immediately restore the commands so pausing doesn't
work, but even if that didn't happen it would stop the statusline
functionality from working which is not desirable. The solution is to
have a reference to the paused file which will get used by the Tagbar
window, but not the statusline functions.
  • Loading branch information...
commit 1a2c4ec9580b74570549374089babd0a4a689e8c 1 parent 0fd0934
@majutsushi authored
Showing with 51 additions and 45 deletions.
  1. +50 −44 autoload/tagbar.vim
  2. +1 −1  plugin/tagbar.vim
View
94 autoload/tagbar.vim
@@ -57,6 +57,7 @@ let s:is_maximized = 0
let s:winrestcmd = ''
let s:short_help = 1
let s:nearby_disabled = 0
+let s:paused = 0
let s:window_expanded = 0
let s:expand_bufnr = -1
@@ -989,18 +990,6 @@ function! s:CreateAutocommands() abort
let s:autocommands_done = 1
endfunction
-" s:PauseAutocommands() {{{2
-" Toggle autocommands
-function! s:PauseAutocommands() abort
- if s:autocommands_done
- autocmd! TagbarAutoCmds
- let s:autocommands_done = 0
- else
- call s:CreateAutocommands()
- call s:AutoUpdate(fnamemodify(expand('%'), ':p'), 0)
- endif
-endfunction
-
" s:CheckForExCtags() {{{2
" Test whether the ctags binary is actually Exuberant Ctags and not GNU ctags
" (or something else)
@@ -1634,12 +1623,17 @@ endfunction
" Known files {{{2
let s:known_files = {
\ '_current' : {},
+ \ '_paused' : {},
\ '_files' : {}
\ }
" s:known_files.getCurrent() {{{3
-function! s:known_files.getCurrent() abort dict
- return self._current
+function! s:known_files.getCurrent(forcecurrent) abort dict
+ if !s:paused || a:forcecurrent
+ return self._current
+ else
+ return self._paused
+ endif
endfunction
" s:known_files.setCurrent() {{{3
@@ -1647,6 +1641,11 @@ function! s:known_files.setCurrent(fileinfo) abort dict
let self._current = a:fileinfo
endfunction
+" s:known_files.setPaused() {{{3
+function! s:known_files.setPaused() abort dict
+ let self._paused = self._current
+endfunction
+
" s:known_files.get() {{{3
function! s:known_files.get(fname) abort dict
return get(self._files, a:fname, {})
@@ -1842,7 +1841,7 @@ function! s:CloseWindow() abort
if winbufnr(2) != -1
" Other windows are open, only close the tagbar one
- let curfile = s:known_files.getCurrent()
+ let curfile = s:known_files.getCurrent(0)
call s:winexec('close')
@@ -1935,7 +1934,7 @@ endfunction
" the current file after startup.
function! s:CorrectFocusOnStartup() abort
if bufwinnr('__Tagbar__') != -1 && !g:tagbar_autofocus && !s:last_autofocus
- let curfile = s:known_files.getCurrent()
+ let curfile = s:known_files.getCurrent(1)
if !empty(curfile) && curfile.fpath != fnamemodify(bufname('%'), ':p')
let winnr = bufwinnr(curfile.fpath)
if winnr != -1
@@ -2501,7 +2500,7 @@ endfunction
" s:ToggleSort() {{{2
function! s:ToggleSort() abort
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return
endif
@@ -2535,7 +2534,7 @@ function! s:RenderContent(...) abort
if a:0 == 1
let fileinfo = a:1
else
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
endif
if empty(fileinfo)
@@ -2560,8 +2559,8 @@ function! s:RenderContent(...) abort
call s:winexec(tagbarwinnr . 'wincmd w')
endif
- if !empty(s:known_files.getCurrent()) &&
- \ fileinfo.fpath ==# s:known_files.getCurrent().fpath
+ if !empty(s:known_files.getCurrent(0)) &&
+ \ fileinfo.fpath ==# s:known_files.getCurrent(0).fpath
" We're redisplaying the same file, so save the view
call s:LogDebugMessage('Redisplaying file [' . fileinfo.fpath . ']')
let saveline = line('.')
@@ -2605,8 +2604,8 @@ function! s:RenderContent(...) abort
setlocal nomodifiable
- if !empty(s:known_files.getCurrent()) &&
- \ fileinfo.fpath ==# s:known_files.getCurrent().fpath
+ if !empty(s:known_files.getCurrent(0)) &&
+ \ fileinfo.fpath ==# s:known_files.getCurrent(0).fpath
let scrolloff_save = &scrolloff
set scrolloff=0
@@ -2860,9 +2859,9 @@ function! s:HighlightTag(openfolds, ...) abort
let force = a:0 > 0 ? a:1 : 0
if a:0 > 1
- let tag = s:GetNearbyTag(1, a:2)
+ let tag = s:GetNearbyTag(1, 0, a:2)
else
- let tag = s:GetNearbyTag(1)
+ let tag = s:GetNearbyTag(1, 0)
endif
if !empty(tag)
let tagline = tag.tline
@@ -3054,7 +3053,7 @@ endfunction
" Folding {{{1
" s:OpenFold() {{{2
function! s:OpenFold() abort
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return
endif
@@ -3073,7 +3072,7 @@ endfunction
" s:CloseFold() {{{2
function! s:CloseFold() abort
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return
endif
@@ -3094,7 +3093,7 @@ endfunction
" s:ToggleFold() {{{2
function! s:ToggleFold() abort
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return
endif
@@ -3130,7 +3129,7 @@ function! s:SetFoldLevel(level, force) abort
return
endif
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return
endif
@@ -3180,7 +3179,7 @@ function! s:OpenParents(...) abort
if a:0 == 1
let tag = a:1
else
- let tag = s:GetNearbyTag(1)
+ let tag = s:GetNearbyTag(1, 0)
endif
if !empty(tag)
@@ -3268,10 +3267,10 @@ function! s:AutoUpdate(fname, force) abort
" Display the tagbar content if the tags have been updated or a different
" file is being displayed
- if bufwinnr('__Tagbar__') != -1 &&
+ if bufwinnr('__Tagbar__') != -1 && !s:paused &&
\ (s:new_window || updated ||
- \ (!empty(s:known_files.getCurrent()) &&
- \ a:fname != s:known_files.getCurrent().fpath))
+ \ (!empty(s:known_files.getCurrent(0)) &&
+ \ a:fname != s:known_files.getCurrent(0).fpath))
call s:RenderContent(fileinfo)
endif
@@ -3477,12 +3476,12 @@ endfunction
" s:GetNearbyTag() {{{2
" Get the tag info for a file near the cursor in the current file
-function! s:GetNearbyTag(all, ...) abort
+function! s:GetNearbyTag(all, forcecurrent, ...) abort
if s:nearby_disabled
return {}
endif
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(a:forcecurrent)
if empty(fileinfo)
return {}
endif
@@ -3518,7 +3517,7 @@ endfunction
" does not contain a valid tag (for example because it is empty or only
" contains a pseudo-tag) return an empty dictionary.
function! s:GetTagInfo(linenr, ignorepseudo) abort
- let fileinfo = s:known_files.getCurrent()
+ let fileinfo = s:known_files.getCurrent(0)
if empty(fileinfo)
return {}
@@ -3627,8 +3626,8 @@ function! s:SetStatusLine(current)
let sort = g:tagbar_sort ? 'Name' : 'Order'
- if !empty(s:known_files.getCurrent())
- let fname = fnamemodify(s:known_files.getCurrent().fpath, ':t')
+ if !empty(s:known_files.getCurrent(0))
+ let fname = fnamemodify(s:known_files.getCurrent(0).fpath, ':t')
else
let fname = ''
endif
@@ -3805,12 +3804,19 @@ function! tagbar#RestoreSession() abort
call s:RestoreSession()
endfunction
-function! tagbar#PauseAutocommands() abort
- call s:PauseAutocommands()
-endfunction
-
" }}}2
+" tagbar#toggle_pause() {{{2
+function! tagbar#toggle_pause() abort
+ let s:paused = !s:paused
+
+ if s:paused
+ call s:known_files.setPaused()
+ else
+ call s:AutoUpdate(fnamemodify(expand('%'), ':p'), 1)
+ endif
+endfunction
+
" tagbar#getusertypes() {{{2
function! tagbar#getusertypes() abort
let userdefs = filter(copy(g:), 'v:key =~ "^tagbar_type_"')
@@ -3871,7 +3877,7 @@ function! tagbar#currenttag(fmt, default, ...) abort
return a:default
endif
- let tag = s:GetNearbyTag(0)
+ let tag = s:GetNearbyTag(0, 1)
if !empty(tag)
if prototype
@@ -3888,8 +3894,8 @@ endfunction
function! tagbar#currentfile() abort
let filename = ''
- if !empty(s:known_files.getCurrent())
- let filename = fnamemodify(s:known_files.getCurrent().fpath, ':t')
+ if !empty(s:known_files.getCurrent(1))
+ let filename = fnamemodify(s:known_files.getCurrent(1).fpath, ':t')
endif
return filename
View
2  plugin/tagbar.vim
@@ -121,7 +121,7 @@ command! -nargs=? TagbarCurrentTag echo tagbar#currenttag('%s', 'No current t
command! -nargs=1 TagbarGetTypeConfig call tagbar#gettypeconfig(<f-args>)
command! -nargs=? TagbarDebug call tagbar#StartDebug(<f-args>)
command! -nargs=0 TagbarDebugEnd call tagbar#StopDebug()
-command! -nargs=0 TagbarTogglePause call tagbar#PauseAutocommands()
+command! -nargs=0 TagbarTogglePause call tagbar#toggle_pause()
" Modeline {{{1
" vim: ts=8 sw=4 sts=4 et foldenable foldmethod=marker foldcolumn=1
Please sign in to comment.
Something went wrong with that request. Please try again.