vim-hitags/hitags.vim

138 lines
4.1 KiB
VimL

" --- ------ ----
" --- Config ----
" --- ------ ----
" Folder to store all dynamically generated files in
" + tags files
" + highlighting scripts
" I do not recommend using '.' especially if you don't auto cd with vim
" ~/.vim/plugin/HiTags/ is guaranteed to exist after installation,
" thats why it's the default
" otherwise you are responsible for creating your own
let s:polution_directory = expand('~/.vim/plugin/HiTags/')
" Compiler_Collection_based_Preprocessing:
if 0
" Compiler to use for preprocessing C/C++, so headers are respected
" Either use "clang" or "gcc" or something compatible,
" alternatively you will have to edit s:preprocessor
let s:preprocessor_executable = "clang"
"let s:preprocessor_executable = "gcc"
let s:preprocessor = s:preprocessor_executable . ' -fdirectives-only -E {input_} -o {output}'
endif
" Stand_alone_preprocessor:
" The only implementation i know is fcpp (https://github.com/bagder/fcpp.git)
" However, it has the major advantage that it will only warn on missing
" headers and not error. Meaning a tool chain using '-I' doesn't break
" everything.
let s:preprocessor = "fcpp -I/usr/local/include -LL {input_} {output}"
" --- --------------------------- ---
" --- Don't Touch ---
" --- Unless ---
" --- You know What You Are Doing ---
" --- --------------------------- ---
let s:tags_filename = 'tags'
let s:tags_file = expand(s:polution_directory) . s:tags_filename
let s:tags_scriptname = 'tags.vim'
let s:tags_script = expand(s:polution_directory) . 'tags.vim'
let s:sigs_script = expand(s:polution_directory) . 'sigs.vim'
"
let s:generator_script = expand('~/.vim/plugin/HiTags/hitags.py')
let s:generation_command =
\ 'python ' . s:generator_script .
\ ' -i ' . '"' . expand('%:p') . '"' .
\ ' -p ' . '"' . s:preprocessor . '"' .
\ ' -t ' . '"' . s:polution_directory . '"' .
\ ' hi ' .
\ ' > ' . '"' . s:tags_script . '"' .
\ ';' .
\ 'python ' . s:generator_script .
\ ' -i ' . '"' . expand('%:p') . '"' .
\ ' -p ' . '"' . s:preprocessor . '"' .
\ ' -t ' . '"' . s:polution_directory . '"' .
\ ' sig ' .
\ ' > ' . '"' . s:sigs_script . '"'
" --- Signature stuff ---
function! SigDebug()
echo s:generation_command
endfunction
function! SigInit()
let g:signatures = {}
autocmd TextChangedI * call SigPopup()
endfunction
call SigInit()
function! SigPopup()
let key = matchstr(getline('.')[:col('.')-2], '\k\+$')
if has_key(g:signatures, key)
call popup_atcursor(g:signatures[key], #{} )
endif
endfunction
function! Sig()
execute 'source ' . s:sigs_script
endfunction
if exists('g:sigs_events')
for e in g:sigs_events
execute "autocmd " . e . " * Sig"
endfor
endif
command! Sig :call Sig()
" --- --- ---
function! HiTagsUpdate()
let pid = system(s:generation_command)
if v:shell_error != 0
echohl ErrorMsg
echomsg "error: " . s:generator_script . " failed."
echohl NONE
return 1
endif
endfunction
function! HiTagsClean()
syn clear HiTagSpecial
syn clear HiTagFunction
syn clear HiTagType
syn clear HiTagConstant
syn clear HiTagIdentifier
endfunction
function! HiTagsHighlight()
execute 'source ' . s:tags_script
endfunction
function! HiTagsDo()
call HiTagsUpdate()
call HiTagsClean()
call HiTagsHighlight()
endfunction
" --- Hook up everything ---
if exists('g:hitags_events')
for e in g:hitags_events
execute "autocmd " . e . " * HiTagsDo"
endfor
endif
hi link HiTagSpecial Special
hi link HiTagFunction Function
hi link HiTagType Type
hi link HiTagConstant Constant
hi link HiTagIdentifier Identifier
command! HiTagsUpdate :call HiTagsUpdate()
command! HiTagsClean :call HiTagsClean()
command! HiTagsHighlight :call HiTagsHighlight()
command! HiTagsDo :call HiTagsDo()