comparison autoload/gutentags/cscope.vim @ 202:b50b6d0f82dd

Refactor for Vim8/Neovim job support. - Refactor all modules' `generate` methods to use a vaguely generic job API wrapper that works for both Vim8 and Neovim jobs. - Make the `statusline` method use new `User` autocommands driven by the job-started/ended callbacks. - Remove all the lock-file-related stuff. - Better error/warning messages. - Move a few things around.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 31 Mar 2018 18:42:54 -0700
parents f7a417234dea
children 8e6156c4dff1
comparison
equal deleted inserted replaced
201:b41385032f86 202:b50b6d0f82dd
38 silent! execute 'cs add ' . fnameescape(l:dbfile_path) 38 silent! execute 'cs add ' . fnameescape(l:dbfile_path)
39 endif 39 endif
40 endif 40 endif
41 endfunction 41 endfunction
42 42
43 function! gutentags#cscope#command_terminated(job_id, data, event) abort 43 function! gutentags#cscope#generate(proj_dir, tags_file, gen_opts) abort
44 if a:data == 0 44 let l:cmd = [s:runner_exe]
45 if index(s:added_dbs, self.db_file) < 0 45 let l:cmd += ['-e', g:gutentags_cscope_executable]
46 call add(s:added_dbs, self.db_file) 46 let l:cmd += ['-p', a:proj_dir]
47 silent! execute 'cs add ' . fnameescape(s:db_file) 47 let l:cmd += ['-f', a:tags_file]
48 let l:file_list_cmd =
49 \ gutentags#get_project_file_list_cmd(a:proj_dir)
50 if !empty(l:file_list_cmd)
51 let l:cmd += ['-L', '"' . l:file_list_cmd . '"']
52 endif
53 let l:cmd = gutentags#make_args(l:cmd)
54
55 call gutentags#trace("Running: " . string(l:cmd))
56 call gutentags#trace("In: " . getcwd())
57 if !g:gutentags_fake
58 let l:job_opts = gutentags#build_default_job_options('cscope')
59 let l:job = gutentags#start_job(l:cmd, l:job_opts)
60 call gutentags#add_job('cscope', a:tags_file, l:job)
61 else
62 call gutentags#trace("(fake... not actually running)")
63 endif
64 endfunction
65
66 function! gutentags#cscope#on_job_exit(job, exit_val) abort
67 let l:job_idx = gutentags#find_job_index_by_data('cscope', a:job)
68 let l:dbfile_path = gutentags#get_job_tags_file('cscope', l:job_idx)
69 call gutentags#remove_job('cscope', l:job_idx)
70
71 if a:exit_val == 0
72 if index(s:added_dbs, l:dbfile_path) < 0
73 call add(s:added_dbs, l:dbfile_path)
74 silent! execute 'cs add ' . fnameescape(l:dbfile_path)
48 else 75 else
49 execute 'cs reset' 76 execute 'cs reset'
50 endif 77 endif
78 else
79 call gutentags#warning(
80 \"gutentags: cscope job failed, returned: ".
81 \string(a:exit_val))
51 endif 82 endif
52 endfunction
53
54 function! gutentags#cscope#generate(proj_dir, tags_file, write_mode) abort
55 let l:cmd = gutentags#get_execute_cmd() . s:runner_exe
56 let l:cmd .= ' -e ' . g:gutentags_cscope_executable
57 let l:cmd .= ' -p ' . a:proj_dir
58 let l:cmd .= ' -f ' . a:tags_file
59 let l:file_list_cmd =
60 \ gutentags#get_project_file_list_cmd(a:proj_dir)
61 if !empty(l:file_list_cmd)
62 let l:cmd .= ' -L "' . l:file_list_cmd . '"'
63 endif
64 if g:gutentags_trace
65 if has('win32')
66 let l:cmd .= ' -l "' . a:tags_file . '.log"'
67 else
68 let l:cmd .= ' ' . printf(s:unix_redir, '"' . a:tags_file . '.log"')
69 endif
70 else
71 if !has('win32')
72 let l:cmd .= ' ' . printf(s:unix_redir, '/dev/null')
73 endif
74 endif
75 let l:cmd .= ' '
76 let l:cmd .= gutentags#get_execute_cmd_suffix()
77
78 call gutentags#trace("Running: " . l:cmd)
79 call gutentags#trace("In: " . getcwd())
80 if !g:gutentags_fake
81 if !(has('nvim') && exists('*jobwait'))
82 if !g:gutentags_trace
83 silent execute l:cmd
84 else
85 execute l:cmd
86 endif
87 else
88 let job_dict = { 'db_file': a:tags_file, 'on_exit' : function('gutentags#cscope#command_terminated') }
89 let job_cmd = [ s:runner_exe,
90 \ '-e', g:gutentags_cscope_executable,
91 \ '-p', a:proj_dir,
92 \ '-f', a:tags_file ]
93 let job_id = jobstart(job_cmd, job_dict)
94 endif
95
96 call gutentags#add_progress('cscope', a:tags_file)
97 else
98 call gutentags#trace("(fake... not actually running)")
99 endif
100 call gutentags#trace("")
101 endfunction 83 endfunction
102 84
103 " }}} 85 " }}}
104 86