X-Git-Url: https://v.licheni.net/stack/conf/vim.git/blobdiff_plain/6244bfbd0093990050b3ca669c22c0cb0e897cd8..093a61258ab7a4de6068daa6475959d619f0683e:/addons/TagHighlight/plugin/TagHighlight.vim diff --git a/addons/TagHighlight/plugin/TagHighlight.vim b/addons/TagHighlight/plugin/TagHighlight.vim new file mode 100644 index 0000000..db36c1d --- /dev/null +++ b/addons/TagHighlight/plugin/TagHighlight.vim @@ -0,0 +1,151 @@ +" Tag Highlighter: +" Author: A. S. Budden +" Copyright: Copyright (C) 2009-2011 A. S. Budden +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" the TagHighlight plugin is provided *as is* and comes with no +" warranty of any kind, either expressed or implied. By using +" this plugin, you agree that in no event will the copyright +" holder be liable for any damages resulting from the use +" of this software. + +" --------------------------------------------------------------------- +try + if &cp || v:version < 700 || (exists('g:loaded_TagHighlight') && (g:plugin_development_mode != 1)) + throw "Already loaded" + endif +catch + finish +endtry +let g:loaded_TagHighlight = 1 + +let old_versions = globpath(&rtp, 'plugin/ctags_highlighting.vim') +if len(old_versions) > 0 + echoerr "Legacy ctags highlighter found. This highlighter is" + \ "intended to replace ctags_highlighter. See the" + \ "user documentation in doc/TagHighlight.txt for" + \ "more information." + finish +endif + +if ! exists('g:TagHighlightSettings') + let g:TagHighlightSettings = {} +endif + +let g:TagHighlightPrivate = {} + +let s:plugin_paths = split(globpath(&rtp, 'plugin/TagHighlight/TagHighlight.py'), '\n') +if len(s:plugin_paths) == 1 + let g:TagHighlightPrivate['PluginPath'] = fnamemodify(s:plugin_paths[0], ':p:h') +elseif len(s:plugin_paths) == 0 + echoerr "Cannot find TagHighlight.py" +else + echoerr "Multiple plugin installs found: something has gone wrong!" +endif + +" Update types & tags +command! -bar UpdateTypesFile + \ silent call TagHighlight#Generation#UpdateAndRead(0) + +command! -bar UpdateTypesFileOnly + \ silent call TagHighlight#Generation#UpdateAndRead(1) + +command! -nargs=1 UpdateTypesFileDebug + \ call TagHighlight#Debug#DebugUpdateTypesFile() + +function! s:LoadLanguages() + " This loads the language data files. + let language_files = split(glob(g:TagHighlightPrivate['PluginPath'] . '/data/languages/*.txt'), '\n') + let g:TagHighlightPrivate['ExtensionLookup'] = {} + let g:TagHighlightPrivate['FileTypeLookup'] = {} + let g:TagHighlightPrivate['SyntaxLookup'] = {} + let g:TagHighlightPrivate['SpecialSyntaxHandlers'] = {} + for language_file in language_files + let entries = TagHighlight#LoadDataFile#LoadFile(language_file) + if has_key(entries, 'Suffix') && has_key(entries, 'VimExtensionMatcher') + \ && has_key(entries, 'VimFileTypes') && has_key(entries, 'VimSyntaxes') + let g:TagHighlightPrivate['ExtensionLookup'][entries['VimExtensionMatcher']] = entries['Suffix'] + + if type(entries['VimFileTypes']) == type([]) + let ftkey = join(entries['VimFileTypes'], ",") + else + let ftkey = entries['VimFileTypes'] + endif + let g:TagHighlightPrivate['FileTypeLookup'][ftkey] = entries['Suffix'] + + if type(entries['VimSyntaxes']) == type([]) + let stkey = join(entries['VimSyntaxes'], ",") + else + let stkey = entries['VimSyntaxes'] + endif + let g:TagHighlightPrivate['SyntaxLookup'][stkey] = entries['Suffix'] + else + echoerr "Could not load language from file " . language_file + endif + if has_key(entries, 'SpecialSyntaxHandlers') + if type(entries['SpecialSyntaxHandlers']) == type([]) + let handlers = entries['SpecialSyntaxHandlers'] + else + let handlers = [entries['SpecialSyntaxHandlers']] + endif + let g:TagHighlightPrivate['SpecialSyntaxHandlers'][entries['Suffix']] = handlers + endif + endfor +endfunction + +function! s:LoadKinds() + " Load the list of kinds (ignoring ctags information) into + " Vim. This is used to make the default links + let g:TagHighlightPrivate['Kinds'] = TagHighlight#LoadDataFile#LoadDataFile('kinds.txt') + " Use a dictionary to get all unique entries + let tag_names_dict = {} + for entry in keys(g:TagHighlightPrivate['Kinds']) + for key in keys(g:TagHighlightPrivate['Kinds'][entry]) + let tag_names_dict[g:TagHighlightPrivate['Kinds'][entry][key]] = "" + endfor + endfor + let g:TagHighlightPrivate['AllTypes'] = sort(keys(tag_names_dict)) +endfunction + +function! TagHLDebug(str, level) + if TagHighlight#Debug#DebugLevelIncludes(a:level) + try + let debug_file = TagHighlight#Option#GetOption('DebugFile') + let print_time = TagHighlight#Option#GetOption('DebugPrintTime') + catch /Unrecognised option/ + " Probably haven't loaded the option definitions + " yet, so assume no debug log file + let debug_file = 'None' + endtry + if debug_file == 'None' + echomsg a:str + else + exe 'redir >>' debug_file + if print_time && exists("*strftime") + silent echo strftime("%H.%M.%S") . ": " . a:str + else + silent echo a:str + endif + redir END + endif + endif +endfunction + +call s:LoadLanguages() +call s:LoadKinds() + +for tagname in g:TagHighlightPrivate['AllTypes'] + let simplename = substitute(tagname, '^CTags', '', '') + exe 'hi default link' tagname simplename + " Highlight everything as a keyword by default + exe 'hi default link' simplename 'Keyword' +endfor + +if ! has_key(g:TagHighlightPrivate, 'AutoCommandsLoaded') + let g:TagHighlightPrivate['AutoCommandsLoaded'] = 1 + autocmd BufRead,BufNewFile * call TagHighlight#ReadTypes#ReadTypesByExtension() + autocmd Syntax * call TagHighlight#ReadTypes#ReadTypesBySyntax() + autocmd FileType * call TagHighlight#ReadTypes#ReadTypesByFileType() +endif +command! ReadTypes call TagHighlight#ReadTypes#ReadTypesByOption()