view autoload/gutentags/cscope.vim @ 110:f1a6cdd692f0

unix: use proper signal names instead of numbers In POSIX standard only several signals have assigned numbers, see [0]. '0' is EXIT, '3' is QUIT, '15' is TERM. '4' is not assigned in POSIX. On Linux, FreeBSD, and Mac OS X '4' is assigned to ILL, which stands for 'Illegal instruction', see [1], par. 7.14 of [2]. Given that C-compilers tend to produce valid instructions there's little point in trapping ILL. Thus trap INT, QUIT, TERM, and EXIT signals. Note that INT replaced ILL. [0]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#trap [1]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html [2]: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
author Ilya Tumaykin <itumaykin@gmail.com>
date Mon, 22 Feb 2016 05:28:53 +0300
parents 99b95da1bed7
children 286e5b3095d0
line wrap: on
line source

" Cscope module for Gutentags

if !has('cscope')
    throw "Can't enable the cscope module for Gutentags, this Vim has ".
                \"no support for cscope files."
endif

" Global Options {{{

if !exists('g:gutentags_cscope_executable')
    let g:gutentags_cscope_executable = 'cscope'
endif

if !exists('g:gutentags_scopefile')
    let g:gutentags_scopefile = 'cscope.out'
endif

if !exists('g:gutentags_auto_add_cscope')
    let g:gutentags_auto_add_cscope = 1
endif

" }}}

" Gutentags Module Interface {{{

let s:runner_exe = gutentags#get_plat_file('update_scopedb')
let s:added_dbs = []

function! gutentags#cscope#init(project_root) abort
    let l:dbfile_path = gutentags#get_cachefile(
                \a:project_root, g:gutentags_scopefile)
    let b:gutentags_files['cscope'] = l:dbfile_path

    if g:gutentags_auto_add_cscope && filereadable(l:dbfile_path)
        if index(s:added_dbs, l:dbfile_path) < 0
            call add(s:added_dbs, l:dbfile_path)
            execute 'cs add ' . fnameescape(l:dbfile_path)
        endif
    endif
endfunction

function! gutentags#cscope#command_terminated(job_id, data, event) abort
    if a:data == 0
        if index(s:added_dbs, self.db_file) < 0
            call add(s:added_dbs, self.db_file)
            execute 'cs add ' . fnameescape(s:db_file)
        else
            execute 'cs reset'
        endif
    endif
endfunction

function! gutentags#cscope#generate(proj_dir, tags_file, write_mode) abort
    let l:cmd = gutentags#get_execute_cmd() . s:runner_exe
    let l:cmd .= ' -e ' . g:gutentags_cscope_executable
    let l:cmd .= ' -p ' . a:proj_dir
    let l:cmd .= ' -f ' . a:tags_file
    let l:cmd .= ' '
    let l:cmd .= gutentags#get_execute_cmd_suffix()

    call gutentags#trace("Running: " . l:cmd)
    call gutentags#trace("In:      " . getcwd())
    if !g:gutentags_fake
        if !(has('nvim') && exists('*jobwait'))
            if !g:gutentags_trace
                silent execute l:cmd
            else
                execute l:cmd
            endif
        else
            let job_dict = { 'db_file': a:tags_file, 'on_exit' : function('gutentags#cscope#command_terminated') }
            let job_cmd = [ s:runner_exe,
                        \ '-e', g:gutentags_cscope_executable,
                        \ '-p', a:proj_dir,
                        \ '-f', a:tags_file ]
            let job_id = jobstart(job_cmd, job_dict)
        endif

        let l:full_scopedb_file = fnamemodify(a:tags_file, ':p')
        call gutentags#add_progress('cscope', l:full_scopedb_file)
    else
        call gutentags#trace("(fake... not actually running)")
    endif
    call gutentags#trace("")
endfunction

" }}}