diff options
| author | Peter Odding <peter@peterodding.com> | 2011-06-13 18:18:49 +0200 | 
|---|---|---|
| committer | Peter Odding <peter@peterodding.com> | 2011-06-13 18:18:49 +0200 | 
| commit | 1194a6b8a2e21db24fe051c0679d17b8a6878ebf (patch) | |
| tree | 60351235198e833595d81016b2d4b270a5d61f75 /autoload/xolox | |
| parent | 4df41adeff4579d16d0a2ad125e13b7c7a90344f (diff) | |
| download | vim-easytags-1194a6b8a2e21db24fe051c0679d17b8a6878ebf.tar.gz | |
:TagsByFileType to create filetype specific tagsfiles from global tagsfile
Diffstat (limited to 'autoload/xolox')
| -rw-r--r-- | autoload/xolox/easytags.vim | 78 | 
1 files changed, 71 insertions, 7 deletions
| diff --git a/autoload/xolox/easytags.vim b/autoload/xolox/easytags.vim index c78b261..b879458 100644 --- a/autoload/xolox/easytags.vim +++ b/autoload/xolox/easytags.vim @@ -64,6 +64,7 @@ function! xolox#easytags#autoload() " {{{2  endfunction  function! xolox#easytags#update(silent, filter_tags, filenames) " {{{2 +  " TODO Use save_by_filetype() when --force-language is not in effect!    try      let s:cached_filenames = {}      let starttime = xolox#misc#timer#start() @@ -209,7 +210,6 @@ function! s:filter_merge_tags(filter_tags, tagsfile, output) " {{{3      call filter(entries, join(filters, ' && '))    endif    let num_filtered = num_old_entries - len(entries) -  call map(entries, 'join(v:val, "\t")')    call extend(entries, a:output)    if !xolox#easytags#write_tagsfile(a:tagsfile, headers, entries)      let msg = "Failed to write filtered tags file %s!" @@ -219,14 +219,19 @@ function! s:filter_merge_tags(filter_tags, tagsfile, output) " {{{3  endfunction  function! s:find_tagged_files(new_entries) " {{{3 +  " FIXME Don't parse tags files in multiple places!    let tagged_files = {} -  for line in a:new_entries -    " Never corrupt the tags file by merging an invalid line -    " (probably an error message) with the existing tags! -    if match(line, '^[^\t]\+\t[^\t]\+\t.\+$') == -1 -      throw "Exuberant Ctags returned invalid data: " . strtrans(line) +  for entry in a:new_entries +    if type(entry) == type([]) +      let filename = entry[1] +    else +      if match(entry, '^[^\t]\+\t[^\t]\+\t.\+$') == -1 +        " Never corrupt the tags file by merging an invalid line +        " (probably an error message) with the existing tags! +        throw "Exuberant Ctags returned invalid data: " . strtrans(entry) +      endif +      let filename = matchstr(entry, '^[^\t]\+\t\zs[^\t]\+')      endif -    let filename = matchstr(line, '^[^\t]\+\t\zs[^\t]\+')      if !has_key(tagged_files, filename)        let filename = s:canonicalize(filename)        let tagged_files[filename] = 1 @@ -285,6 +290,60 @@ function! xolox#easytags#highlight() " {{{2    endtry  endfunction +function! xolox#easytags#by_filetype(undo) " {{{2 +  try +    let s:cached_filenames = {} +    if empty(g:easytags_by_filetype) +      throw "Please set g:easytags_by_filetype before running :TagsByFileType!" +    endif +    let global_tagsfile = expand(g:easytags_file) +    let disabled_tagsfile = global_tagsfile . '.disabled' +    if !a:undo +      let [headers, entries] = xolox#easytags#read_tagsfile(global_tagsfile) +      call s:save_by_filetype(headers, entries) +      call rename(global_tagsfile, disabled_tagsfile) +      let msg = "Finished copying tags from %s to %s! Note that your old tags file has been renamed to %s instead of deleting it, should you want to restore it." +      call xolox#misc#msg#info(msg, g:easytags_file, g:easytags_by_filetype, disabled_tagsfile) +    else +      let headers = [] +      let all_entries = [] +      for tagsfile in split(glob(g:easytags_by_filetype . '/*'), '\n') +        let [headers, entries] = xolox#easytags#read_tagsfile(tagsfile) +        call extend(all_entries, entries) +      endfor +      call xolox#easytags#write_tagsfile(global_tagsfile, headers, all_entries) +      call xolox#misc#msg#info("Finished copying tags from %s to %s!", g:easytags_by_filetype, g:easytags_file) +    endif +  catch +    call xolox#misc#msg#warn("%s: %s (at %s)", s:script, v:exception, v:throwpoint) +  finally +    unlet s:cached_filenames +  endtry +endfunction + +function! s:save_by_filetype(headers, entries) +  let filetypes = {} +  for entry in a:entries +    let ctags_ft = matchstr(entry[2], '\tlanguage:\zs\S\+') +    if !empty(ctags_ft) +      let vim_ft = xolox#easytags#to_vim_ft(ctags_ft) +      if !has_key(filetypes, vim_ft) +        let filetypes[vim_ft] = [] +      endif +      call add(filetypes[vim_ft], entry) +    endif +  endfor +  let directory = xolox#misc#path#absolute(g:easytags_by_filetype) +  for vim_ft in keys(filetypes) +    let tagsfile = xolox#misc#path#merge(directory, vim_ft) +    if !filereadable(tagsfile) +      call xolox#easytags#write_tagsfile(tagsfile, a:headers, filetypes[vim_ft]) +    else +      call s:filter_merge_tags(0, tagsfile, filetypes[vim_ft]) +    endif +  endfor +endfunction +  " Public supporting functions (might be useful to others). {{{1  function! xolox#easytags#supported_filetypes() " {{{2 @@ -343,6 +402,7 @@ function! xolox#easytags#write_tagsfile(tagsfile, headers, entries) " {{{2        let sort_order = 2      endif    endfor +  call map(a:entries, 's:join_entry(v:val)')    if sort_order == 1      call sort(a:entries)    else @@ -364,6 +424,10 @@ function! xolox#easytags#write_tagsfile(tagsfile, headers, entries) " {{{2    return writefile(lines, a:tagsfile) == 0  endfunction +function! s:join_entry(value) +  return type(a:value) == type([]) ? join(a:value, "\t") : a:value +endfunction +  function! xolox#easytags#file_has_tags(filename) " {{{2    call s:cache_tagged_files()    return has_key(s:tagged_files, s:resolve(a:filename)) | 
