Mercurial > vim-gutentags
annotate autoload/gutentags/ctags.vim @ 96:e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 21 Feb 2016 10:22:44 -0800 |
parents | edd488d8d37e |
children | d645125192aa |
rev | line source |
---|---|
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 " Ctags module for Gutentags |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 " Global Options {{{ |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 if !exists('g:gutentags_ctags_executable') |
60
9e768b83d701
Fix missing renames of `gutentags_ctags_executable`.
Ludovic Chabant <ludovic@chabant.com>
parents:
49
diff
changeset
|
6 let g:gutentags_ctags_executable = 'ctags' |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 if !exists('g:gutentags_tagfile') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 let g:gutentags_tagfile = 'tags' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 if !exists('g:gutentags_auto_set_tags') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 let g:gutentags_auto_set_tags = 1 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
17 if !exists('g:gutentags_ctags_options_file') |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
18 let g:gutentags_ctags_options_file = '.gutctags' |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
19 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
20 |
86
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
21 if !exists('g:gutentags_ctags_check_tagfile') |
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
22 let g:gutentags_ctags_check_tagfile = 0 |
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
23 endif |
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
24 |
96
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
25 if !exists('g:gutentags_ctags_no_space_in_paths') |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
26 let g:gutentags_ctags_no_space_in_paths = 1 |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
27 endif |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
28 |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 " }}} |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 " Gutentags Module Interface {{{ |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 let s:runner_exe = gutentags#get_plat_file('update_tags') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 function! gutentags#ctags#init(project_root) abort |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 " Figure out the path to the tags file. |
96
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
37 if g:gutentags_ctags_no_space_in_paths |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
38 " We need to replace spaces in the project root because `ctags` seems |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
39 " incapable of reading/writing to tags files with spaces. |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
40 let l:fixed_project_root = tr(a:project_root, ' ', '_') |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
41 else |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
42 let l:fixed_project_root = a:project_root |
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
43 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 let b:gutentags_files['ctags'] = gutentags#get_cachefile( |
96
e03a661dc983
Some `ctags` implementations can't handle spaces in paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
93
diff
changeset
|
45 \l:fixed_project_root, g:gutentags_tagfile) |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 " Set the tags file for Vim to use. |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 if g:gutentags_auto_set_tags |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 execute 'setlocal tags^=' . fnameescape(b:gutentags_files['ctags']) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 endif |
93
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
51 |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
52 " Check if the ctags executable exists. |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
53 if g:gutentags_enabled && executable(g:gutentags_ctags_executable) == 0 |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
54 let g:gutentags_enabled = 0 |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
55 echoerr "Executable '".g:gutentags_ctags_executable."' can't be found. " |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
56 \."Gutentags will be disabled. You can re-enable it by " |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
57 \."setting g:gutentags_enabled back to 1." |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
58 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 endfunction |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 function! gutentags#ctags#generate(proj_dir, tags_file, write_mode) abort |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 " Get to the tags file directory because ctags is finicky about |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 " these things. |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 let l:prev_cwd = getcwd() |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 let l:work_dir = fnamemodify(a:tags_file, ':h') |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
66 let l:tags_file_exists = filereadable(a:tags_file) |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
67 |
86
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
68 if l:tags_file_exists && g:gutentags_ctags_check_tagfile |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
69 let l:first_lines = readfile(a:tags_file, '', 1) |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
70 if len(l:first_lines) == 0 || stridx(l:first_lines[0], '!_TAG_') != 0 |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
71 call gutentags#throw("File ".a:tags_file." doesn't appear to be ". |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
72 \"a ctags file. Please delete it and run ". |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
73 \":GutentagsUpdate!.") |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
74 return |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
75 endif |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
76 endif |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
77 |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 execute "chdir " . fnameescape(l:work_dir) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 try |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 " Build the command line. |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 let l:cmd = gutentags#get_execute_cmd() . s:runner_exe |
89
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
83 let l:cmd .= ' -e "' . s:get_ctags_executable(a:proj_dir) . '"' |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 let l:cmd .= ' -t "' . a:tags_file . '"' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 let l:cmd .= ' -p "' . a:proj_dir . '"' |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
86 if a:write_mode == 0 && l:tags_file_exists |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 let l:full_path = expand('%:p') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 let l:cmd .= ' -s "' . l:full_path . '"' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 endif |
75
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
90 " Pass the Gutentags options file first, and then the project specific |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
91 " one, so that users can override the default behaviour. |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
92 let l:cmd .= ' -o "' . gutentags#get_res_file('ctags.options') . '"' |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
93 let l:proj_options_file = a:proj_dir . '/' . |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
94 \g:gutentags_ctags_options_file |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
95 if filereadable(l:proj_options_file) |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
96 let l:proj_options_file = s:process_options_file( |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
97 \a:proj_dir, l:proj_options_file) |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
98 let l:cmd .= ' -o "' . l:proj_options_file . '"' |
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
99 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 for ign in split(&wildignore, ',') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 let l:cmd .= ' -x ' . '"' . ign . '"' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 endfor |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 for exc in g:gutentags_exclude |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 let l:cmd .= ' -x ' . '"' . exc . '"' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 endfor |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 if g:gutentags_pause_after_update |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 let l:cmd .= ' -c' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 if g:gutentags_trace |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 if has('win32') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 let l:cmd .= ' -l "' . a:tags_file . '.log"' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 else |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 let l:cmd .= ' > "' . a:tags_file . '.log" 2>&1' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 else |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 if !has('win32') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 let l:cmd .= ' > /dev/null 2>&1' |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 let l:cmd .= gutentags#get_execute_cmd_suffix() |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 call gutentags#trace("Running: " . l:cmd) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 call gutentags#trace("In: " . getcwd()) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 if !g:gutentags_fake |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 " Run the background process. |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 if !g:gutentags_trace |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 silent execute l:cmd |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 else |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 execute l:cmd |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 " Flag this tags file as being in progress |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 let l:full_tags_file = fnamemodify(a:tags_file, ':p') |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 call gutentags#add_progress('ctags', l:full_tags_file) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 else |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 call gutentags#trace("(fake... not actually running)") |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 endif |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 call gutentags#trace("") |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 finally |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 " Restore the previous working directory. |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 execute "chdir " . fnameescape(l:prev_cwd) |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 endtry |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 endfunction |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 " }}} |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
147 " Utilities {{{ |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
148 |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
149 " Get final ctags executable depending whether a filetype one is defined |
89
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
150 function! s:get_ctags_executable(proj_dir) abort |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
151 "Only consider the main filetype in cases like 'python.django' |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
152 let l:ftype = get(split(&filetype, '\.'), 0, '') |
89
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
153 let l:proj_info = gutentags#get_project_info(a:proj_dir) |
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
154 let l:type = get(l:proj_info, 'type', l:ftype) |
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
155 if exists('g:gutentags_ctags_executable_{l:type}') |
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
156 return g:gutentags_ctags_executable_{l:type} |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
157 else |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
158 return g:gutentags_ctags_executable |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
159 endif |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
160 endfunction |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
161 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
162 function! s:process_options_file(proj_dir, path) abort |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
163 if g:gutentags_cache_dir == "" |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
164 " If we're not using a cache directory to store tag files, we can |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
165 " use the options file straight away. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
166 return a:path |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
167 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
168 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
169 " See if we need to process the options file. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
170 let l:do_process = 0 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
171 let l:proj_dir = gutentags#stripslash(a:proj_dir) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
172 let l:out_path = gutentags#get_cachefile(l:proj_dir, 'options') |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
173 if !filereadable(l:out_path) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
174 call gutentags#trace("Processing options file '".a:path."' because ". |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
175 \"it hasn't been processed yet.") |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
176 let l:do_process = 1 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
177 elseif getftime(a:path) > getftime(l:out_path) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
178 call gutentags#trace("Processing options file '".a:path."' because ". |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
179 \"it has changed.") |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
180 let l:do_process = 1 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
181 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
182 if l:do_process == 0 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
183 " Nothing's changed, return the existing processed version of the |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
184 " options file. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
185 return l:out_path |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
186 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
187 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
188 " We have to process the options file. Right now this only means capturing |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
189 " all the 'exclude' rules, and rewrite them to make them absolute. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
190 " |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
191 " This is because since `ctags` is run with absolute paths (because we |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
192 " want the tag file to be in a cache directory), it will do its path |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
193 " matching with absolute paths too, so the exclude rules need to be |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
194 " absolute. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
195 let l:lines = readfile(a:path) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
196 let l:outlines = [] |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
197 for line in l:lines |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
198 let l:exarg = matchend(line, '\v^\-\-exclude=') |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
199 if l:exarg < 0 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
200 call add(l:outlines, line) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
201 continue |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
202 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
203 let l:fullp = gutentags#normalizepath(l:proj_dir.'/'. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
204 \strpart(line, l:exarg + 1)) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
205 let l:ol = '--exclude='.l:fullp |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
206 call add(l:outlines, l:ol) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
207 endfor |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
208 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
209 call writefile(l:outlines, l:out_path) |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
210 return l:out_path |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
211 endfunction |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
212 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
213 " }}} |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
214 |