1
0
mirror of https://github.com/gryf/tagbar.git synced 2025-12-18 03:50:26 +01:00

Process scopes only when the file has changed.

This commit is contained in:
Jan Larres
2011-01-17 00:35:05 +13:00
parent d250f26798
commit 32d42f5d47

View File

@@ -224,6 +224,11 @@ endfunction
function! s:RefreshContent()
let fname = fnamemodify(bufname('%'), ':p')
" Don't do anything when entering the tagbar window
if &filetype == 'tagbar'
return
endif
if has_key(s:known_files, fname)
if s:known_files[fname].mtime != getftime(fname)
call s:ProcessFile(fname, &filetype)
@@ -260,13 +265,15 @@ function! s:ProcessFile(fname, ftype)
return
endif
let typeinfo = s:known_types[a:ftype]
let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nksSaz --extra= '
let ctags_args .= ' --sort=yes '
let ctags_type = s:known_types[a:ftype].ctagstype
let ctags_type = typeinfo.ctagstype
let ctags_kinds = ""
for kind in s:known_types[a:ftype].kinds
for kind in typeinfo.kinds
let [short, full] = split(kind, ':')
let ctags_kinds .= short
endfor
@@ -289,15 +296,31 @@ function! s:ProcessFile(fname, ftype)
let fileinfo = {}
let fileinfo.mtime = getftime(a:fname)
let taglist = split(ctags_output, '\n\+')
let rawtaglist = split(ctags_output, '\n\+')
let fileinfo.tags = []
for line in taglist
for line in rawtaglist
let taginfo = s:ParseTagline(line)
call add(fileinfo.tags, taginfo)
endfor
if has_key(typeinfo, 'scopes') && !empty(typeinfo.scopes)
" Extract top-level scopes, removing them from the tag list
let scopedtags = filter(copy(fileinfo.tags),
\ 's:IsTopLevelScopeDef(typeinfo, v:val)')
call filter(fileinfo.tags, '!s:IsTopLevelScopeDef(typeinfo, v:val)')
" Add children
for tag in scopedtags
let scopetype = typeinfo.kind2scope[tag.fields.kind]
let tag.children = s:GetChildTags(fileinfo.tags, scopetype,
\ '', tag.name, typeinfo)
endfor
let fileinfo.scopedtags = scopedtags
endif
let s:known_files[a:fname] = fileinfo
endfunction
@@ -348,24 +371,11 @@ function! s:RenderContent(fname, ftype)
endif
let typeinfo = s:known_types[a:ftype]
let tags = copy(s:known_files[a:fname].tags)
let fileinfo = s:known_files[a:fname]
" Process and print scoped tags if there are any
if has_key(typeinfo, 'scopes') && !empty(typeinfo.scopes)
" Extract top-level scopes, removing them from the tag list
let scopedtags = filter(copy(tags),
\ 's:IsTopLevelScopeDef(typeinfo, v:val)')
call filter(tags, '!s:IsTopLevelScopeDef(typeinfo, v:val)')
" Add children
for tag in scopedtags
let scopetype = typeinfo.kind2scope[tag.fields.kind]
let tag.children = s:GetChildTags(tags, scopetype,
\ '', tag.name, typeinfo)
endfor
" Print the tags
for tag in scopedtags
" Print scoped tags if there are any
if has_key(fileinfo, 'scopedtags')
for tag in fileinfo.scopedtags
silent! put =tag.name . ' : ' . typeinfo.kind2scope[tag.fields.kind]
for childtag in tag.children
@@ -378,7 +388,7 @@ function! s:RenderContent(fname, ftype)
" Print non-scoped tags
for kind in typeinfo.kinds
let curtags = filter(copy(tags), 'v:val.fields.kind == kind[0]')
let curtags = filter(copy(fileinfo.tags), 'v:val.fields.kind == kind[0]')
if empty(curtags)
continue