Skip to content

Commit

Permalink
Version 2.9
Browse files Browse the repository at this point in the history
  • Loading branch information
xolox authored and vim-scripts committed Apr 26, 2013
1 parent 57dbf94 commit 6727dcc
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -0,0 +1 @@
doc/tags
52 changes: 48 additions & 4 deletions autoload/xolox/easytags.vim
@@ -1,9 +1,9 @@
" Vim script
" Author: Peter Odding <peter@peterodding.com>
" Last Change: April 18, 2013
" Last Change: April 19, 2013
" URL: http://peterodding.com/code/vim/easytags/

let g:xolox#easytags#version = '2.8.2'
let g:xolox#easytags#version = '2.9'

" Public interface through (automatic) commands. {{{1

Expand Down Expand Up @@ -99,8 +99,11 @@ function! xolox#easytags#update(silent, filter_tags, filenames) " {{{2
let tagsfile = xolox#easytags#get_tagsfile()
let firstrun = !filereadable(tagsfile)
let cmdline = s:prep_cmdline(cfile, tagsfile, firstrun, a:filenames, context)
let output = s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline)
let [output, has_updates] = s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline)
if !firstrun
if !has_updates
return 1
endif
if have_args && !empty(g:easytags_by_filetype)
" TODO Get the headers from somewhere?!
call s:save_by_filetype(a:filter_tags, [], output, context)
Expand Down Expand Up @@ -203,10 +206,12 @@ endfunction

function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
let lines = []
let has_updates = 1
if a:cmdline != ''
call xolox#misc#msg#debug("easytags.vim %s: Executing %s.", g:xolox#easytags#version, a:cmdline)
try
let lines = xolox#shell#execute(a:cmdline, 1)
let has_updates = a:firstrun || s:has_updates(a:cfile, join(lines, "\n"))
catch /^Vim\%((\a\+)\)\=:E117/
" Ignore missing shell.vim plug-in.
let output = system(a:cmdline)
Expand All @@ -215,6 +220,7 @@ function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
throw printf(msg, fnamemodify(a:tagsfile, ':~'), strtrans(output))
endif
let lines = split(output, "\n")
let has_updates = a:firstrun || s:has_updates(a:cfile, output)
endtry
if a:firstrun
if a:cfile != ''
Expand All @@ -225,9 +231,47 @@ function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
return []
endif
endif
return xolox#easytags#parse_entries(lines)
return [xolox#easytags#parse_entries(lines), has_updates]
endfunction

" Vim 7.3 now has the sha256() function. We use it below to recognize when the
" tags haven't changed from the last time we ran Exuberant Ctags on a file; in
" this case the tags file doesn't have to be written to disk which makes the
" plug-in much faster for a very common case.

let s:fingerprints = {}

function! s:has_updates(cfile, output)
if empty(a:cfile)
" The cache doesn't work when tags aren't created for the current file.
return 1
endif
let fingerprint = s:get_fingerprint(a:cfile, a:output)
call xolox#misc#msg#debug("easytags.vim %s: Fingerprint of tags in %s is %s.", g:xolox#easytags#version, a:cfile, string(fingerprint))
if !empty(fingerprint) && get(s:fingerprints, a:cfile, '') ==# fingerprint
call xolox#misc#msg#debug("easytags.vim %s: The fingerprint didn't change! We can take a shortcut :-)", g:xolox#easytags#version)
return 0
endif
let s:fingerprints[a:cfile] = fingerprint
return 1
endfunction

if exists('*sha256')
function! s:get_fingerprint(cfile, output)
return sha256(a:output)
endfunction
else
function! s:get_fingerprint(cfile, output)
" Don't want to re-implement a costly hashing function in Vimscript. Just
" handle files that never had any tags.
if empty(a:output)
return get(s:fingerprints, a:cfile, 1)
else
return ''
endif
endfunction
endif

function! s:filter_merge_tags(filter_tags, tagsfile, output, context) " {{{3
let [headers, entries] = xolox#easytags#read_tagsfile(a:tagsfile)
let filters = []
Expand Down

0 comments on commit 6727dcc

Please sign in to comment.