Mercurial > vim-gutentags
annotate autoload/gutentags/ctags.vim @ 249:36dabe30ab6e
Double escape spaces when setting tags path
author | Yukun Lin <me@yukun.io> |
---|---|
date | Mon, 05 Aug 2019 22:09:31 +0900 |
parents | ac312dc3c111 |
children | 56dc6f8e5472 |
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 |
119
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
5 let g:gutentags_ctags_executable = get(g:, 'gutentags_ctags_executable', 'ctags') |
165
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
6 let g:gutentags_ctags_tagfile = get(g:, 'gutentags_ctags_tagfile', 'tags') |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
7 let g:gutentags_ctags_auto_set_tags = get(g:, 'gutentags_ctags_auto_set_tags', 1) |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
8 |
119
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
9 let g:gutentags_ctags_options_file = get(g:, 'gutentags_ctags_options_file', '.gutctags') |
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
10 let g:gutentags_ctags_check_tagfile = get(g:, 'gutentags_ctags_check_tagfile', 0) |
160
1b980f5071a0
Post-processing for `tags` files, extra args for `ctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
158
diff
changeset
|
11 let g:gutentags_ctags_extra_args = get(g:, 'gutentags_ctags_extra_args', []) |
1b980f5071a0
Post-processing for `tags` files, extra args for `ctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
158
diff
changeset
|
12 let g:gutentags_ctags_post_process_cmd = get(g:, 'gutentags_ctags_post_process_cmd', '') |
86
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
13 |
165
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
14 let g:gutentags_ctags_exclude = get(g:, 'gutentags_ctags_exclude', []) |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
15 let g:gutentags_ctags_exclude_wildignore = get(g:, 'gutentags_ctags_exclude_wildignore', 1) |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
16 |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
17 " Backwards compatibility. |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
18 function! s:_handleOldOptions() abort |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
19 let l:renamed_options = { |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
20 \'gutentags_exclude': 'gutentags_ctags_exclude', |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
21 \'gutentags_tagfile': 'gutentags_ctags_tagfile', |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
22 \'gutentags_auto_set_tags': 'gutentags_ctags_auto_set_tags' |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
23 \} |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
24 for key in keys(l:renamed_options) |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
25 if exists('g:'.key) |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
26 let newname = l:renamed_options[key] |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
27 echom "gutentags: Option 'g:'".key." has been renamed to ". |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
28 \"'g:'".newname." Please update your vimrc." |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
29 let g:[newname] = g:[key] |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
30 endif |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
31 endfor |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
32 endfunction |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
33 call s:_handleOldOptions() |
41
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 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 " Gutentags Module Interface {{{ |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 |
185
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
38 let s:did_check_exe = 0 |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 let s:runner_exe = gutentags#get_plat_file('update_tags') |
115
bc6ef3d0b84f
ctags: fix output redirection on tcsh
Ilya Tumaykin <itumaykin@gmail.com>
parents:
114
diff
changeset
|
40 let s:unix_redir = (&shellredir =~# '%s') ? &shellredir : &shellredir . ' %s' |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
41 let s:wildignores_options_path = '' |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
42 let s:last_wildignores = '' |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 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
|
45 " Figure out the path to the tags file. |
165
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
46 " Check the old name for this option, too, before falling back to the |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
47 " globally defined name. |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
48 let l:tagfile = getbufvar("", 'gutentags_ctags_tagfile', |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
49 \getbufvar("", 'gutentags_tagfile', |
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
50 \g:gutentags_ctags_tagfile)) |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 let b:gutentags_files['ctags'] = gutentags#get_cachefile( |
141
7bc4df0225d1
Add support for specifying buffer-specific tagfiles.
Ludovic Chabant <ludovic@chabant.com>
parents:
136
diff
changeset
|
52 \a:project_root, l:tagfile) |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 " Set the tags file for Vim to use. |
165
cbc1ebe23ef1
Rename all ctags-related options to have "ctags" in their name.
Ludovic Chabant <ludovic@chabant.com>
parents:
160
diff
changeset
|
55 if g:gutentags_ctags_auto_set_tags |
249
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
56 if has('win32') || has('win64') |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
57 execute 'setlocal tags^=' . fnameescape(b:gutentags_files['ctags']) |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
58 else |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
59 " spaces must be literally escaped in tags path |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
60 let l:literal_space_escaped = substitute(fnameescape(b:gutentags_files['ctags']), '\ ', '\\\\ ', 'g') |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
61 execute 'setlocal tags^=' . l:literal_space_escaped |
36dabe30ab6e
Double escape spaces when setting tags path
Yukun Lin <me@yukun.io>
parents:
241
diff
changeset
|
62 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 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
|
64 |
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
65 " Check if the ctags executable exists. |
185
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
66 if s:did_check_exe == 0 |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
67 if g:gutentags_enabled && executable(expand(g:gutentags_ctags_executable, 1)) == 0 |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
68 let g:gutentags_enabled = 0 |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
69 echoerr "Executable '".g:gutentags_ctags_executable."' can't be found. " |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
70 \."Gutentags will be disabled. You can re-enable it by " |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
71 \."setting g:gutentags_enabled back to 1." |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
72 endif |
685b81826b68
Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
73 let s:did_check_exe = 1 |
93
edd488d8d37e
Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
74 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 endfunction |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
77 function! gutentags#ctags#generate(proj_dir, tags_file, gen_opts) abort |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
78 let l:write_mode = a:gen_opts['write_mode'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
79 |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
80 let l:tags_file_exists = filereadable(a:tags_file) |
181
0b4ccd0deceb
Fix broken test for whether the tag file is inside the project root.
Ludovic Chabant <ludovic@chabant.com>
parents:
179
diff
changeset
|
81 let l:tags_file_relative = fnamemodify(a:tags_file, ':.') |
0b4ccd0deceb
Fix broken test for whether the tag file is inside the project root.
Ludovic Chabant <ludovic@chabant.com>
parents:
179
diff
changeset
|
82 let l:tags_file_is_local = len(l:tags_file_relative) < len(a:tags_file) |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
83 |
86
7872cc9bbc2d
Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents:
84
diff
changeset
|
84 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
|
85 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
|
86 if len(l:first_lines) == 0 || stridx(l:first_lines[0], '!_TAG_') != 0 |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
87 call gutentags#throw( |
148
b178f2251982
Only set `v:errmsg` when we throw an actual error.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
88 \"File ".a:tags_file." doesn't appear to be ". |
84
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
89 \"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
|
90 \":GutentagsUpdate!.") |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
91 return |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
92 endif |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
93 endif |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
94 |
173
2cf3fb66285b
Use absolute paths for `ctags` if the tags file is not local.
Ludovic Chabant <ludovic@chabant.com>
parents:
171
diff
changeset
|
95 if empty(g:gutentags_cache_dir) && l:tags_file_is_local |
167
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
96 " If we don't use the cache directory, we can pass relative paths |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
97 " around. |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
98 " |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
99 " Note that if we don't do this and pass a full path for the project |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
100 " root, some `ctags` implementations like Exhuberant Ctags can get |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
101 " confused if the paths have spaces -- but not if you're *in* the root |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
102 " directory, for some reason... (which we are, our caller in |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
103 " `autoload/gutentags.vim` changed it). |
98
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
104 let l:actual_proj_dir = '.' |
181
0b4ccd0deceb
Fix broken test for whether the tag file is inside the project root.
Ludovic Chabant <ludovic@chabant.com>
parents:
179
diff
changeset
|
105 let l:actual_tags_file = l:tags_file_relative |
98
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
106 else |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
107 " else: the tags file goes in a cache directory, so we need to specify |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
108 " all the paths absolutely for `ctags` to do its job correctly. |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
109 let l:actual_proj_dir = a:proj_dir |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
110 let l:actual_tags_file = a:tags_file |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
111 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
113 " Build the command line. |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
114 let l:cmd = [s:runner_exe] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
115 let l:cmd += ['-e', '"' . s:get_ctags_executable(a:proj_dir) . '"'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
116 let l:cmd += ['-t', '"' . l:actual_tags_file . '"'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
117 let l:cmd += ['-p', '"' . l:actual_proj_dir . '"'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
118 if l:write_mode == 0 && l:tags_file_exists |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
119 let l:cur_file_path = expand('%:p') |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
120 if empty(g:gutentags_cache_dir) && l:tags_file_is_local |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
121 let l:cur_file_path = fnamemodify(l:cur_file_path, ':.') |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
122 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
123 let l:cmd += ['-s', '"' . l:cur_file_path . '"'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
124 else |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
125 let l:file_list_cmd = gutentags#get_project_file_list_cmd(l:actual_proj_dir) |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
126 if !empty(l:file_list_cmd) |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
127 if match(l:file_list_cmd, '///') > 0 |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
128 let l:suffopts = split(l:file_list_cmd, '///') |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
129 let l:suffoptstr = l:suffopts[1] |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
130 let l:file_list_cmd = l:suffopts[0] |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
131 if l:suffoptstr == 'absolute' |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
132 let l:cmd += ['-A'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
133 endif |
133
6f15299869fc
Don't pass absolute paths to `ctags` when we want relative paths from it.
Ludovic Chabant <ludovic@chabant.com>
parents:
119
diff
changeset
|
134 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
135 let l:cmd += ['-L', '"' . l:file_list_cmd. '"'] |
75
d12543f11eb9
Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
70
diff
changeset
|
136 endif |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
137 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
138 if empty(get(l:, 'file_list_cmd', '')) |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
139 " Pass the Gutentags recursive options file before the project |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
140 " options file, so that users can override --recursive. |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
141 " Omit --recursive if this project uses a file list command. |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
142 let l:cmd += ['-o', '"' . gutentags#get_res_file('ctags_recursive.options') . '"'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
143 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
144 if !empty(g:gutentags_ctags_extra_args) |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
145 let l:cmd += ['-O', shellescape(join(g:gutentags_ctags_extra_args))] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
146 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
147 if !empty(g:gutentags_ctags_post_process_cmd) |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
148 let l:cmd += ['-P', shellescape(g:gutentags_ctags_post_process_cmd)] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
149 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
150 let l:proj_options_file = a:proj_dir . '/' . |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
151 \g:gutentags_ctags_options_file |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
152 if filereadable(l:proj_options_file) |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
153 let l:proj_options_file = s:process_options_file( |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
154 \a:proj_dir, l:proj_options_file) |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
155 let l:cmd += ['-o', '"' . l:proj_options_file . '"'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
156 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
157 if g:gutentags_ctags_exclude_wildignore |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
158 call s:generate_wildignore_options() |
230
a798f7ad11c5
Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents:
226
diff
changeset
|
159 if !empty(s:wildignores_options_path) |
a798f7ad11c5
Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents:
226
diff
changeset
|
160 let l:cmd += ['-x', shellescape('@'.s:wildignores_options_path, 1)] |
a798f7ad11c5
Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents:
226
diff
changeset
|
161 endif |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
162 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
163 for exc in g:gutentags_ctags_exclude |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
164 let l:cmd += ['-x', '"' . exc . '"'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
165 endfor |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
166 if g:gutentags_pause_after_update |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
167 let l:cmd += ['-c'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
168 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
169 if g:gutentags_trace |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
170 let l:cmd += ['-l', '"' . l:actual_tags_file . '.log"'] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
171 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
172 let l:cmd = gutentags#make_args(l:cmd) |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
174 call gutentags#trace("Running: " . string(l:cmd)) |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
175 call gutentags#trace("In: " . getcwd()) |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
176 if !g:gutentags_fake |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
177 let l:job_opts = gutentags#build_default_job_options('ctags') |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
178 let l:job = gutentags#start_job(l:cmd, l:job_opts) |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
179 call gutentags#add_job('ctags', a:tags_file, l:job) |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
180 else |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
181 call gutentags#trace("(fake... not actually running)") |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
182 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
183 endfunction |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
184 |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
185 function! gutentags#ctags#on_job_exit(job, exit_val) abort |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
186 call gutentags#remove_job_by_data('ctags', a:job) |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
187 |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
188 if a:exit_val != 0 |
241
ac312dc3c111
Don't duplicate the `gutentags:` message prefix.
Ludovic Chabant <ludovic@chabant.com>
parents:
231
diff
changeset
|
189 call gutentags#warning("ctags job failed, returned: ". |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
190 \string(a:exit_val)) |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
191 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 endfunction |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 " }}} |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
196 " Utilities {{{ |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
197 |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
198 " 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
|
199 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
|
200 "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
|
201 let l:ftype = get(split(&filetype, '\.'), 0, '') |
89
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
202 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
|
203 let l:type = get(l:proj_info, 'type', l:ftype) |
119
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
204 let exepath = exists('g:gutentags_ctags_executable_{l:type}') |
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
205 \ ? g:gutentags_ctags_executable_{l:type} : g:gutentags_ctags_executable |
a66d90fd758b
expand() g:gutentags_ctags_executable
Justin M. Keyes <justinkz@gmail.com>
parents:
117
diff
changeset
|
206 return expand(exepath, 1) |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
207 endfunction |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
208 |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
209 function! s:generate_wildignore_options() abort |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
210 if s:last_wildignores == &wildignore |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
211 " The 'wildignore' setting didn't change since last time we did this. |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
212 call gutentags#trace("Wildignore options file is up to date.") |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
213 return |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
214 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
215 |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
216 if s:wildignores_options_path == '' |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
217 if empty(g:gutentags_cache_dir) |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
218 let s:wildignores_options_path = tempname() |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
219 else |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
220 let s:wildignores_options_path = |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
221 \gutentags#stripslash(g:gutentags_cache_dir). |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
222 \'/_wildignore.options' |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
223 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
224 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
225 |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
226 call gutentags#trace("Generating wildignore options: ".s:wildignores_options_path) |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
227 let l:opt_lines = [] |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
228 for ign in split(&wildignore, ',') |
231
740cd9065423
Fix `wildignore` patterns file... it's not an options file!
Ludovic Chabant <ludovic@chabant.com>
parents:
230
diff
changeset
|
229 call add(l:opt_lines, ign) |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
230 endfor |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
231 call writefile(l:opt_lines, s:wildignores_options_path) |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
232 let s:last_wildignores = &wildignore |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
233 endfunction |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
234 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
235 function! s:process_options_file(proj_dir, path) abort |
116
be8d47e88ab1
ctags: use empty() instead of comparing with ""
Ilya Tumaykin <itumaykin@gmail.com>
parents:
115
diff
changeset
|
236 if empty(g:gutentags_cache_dir) |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
237 " 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
|
238 " 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
|
239 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
|
240 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
241 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
242 " 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 \"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
|
249 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
|
250 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
|
251 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
|
252 \"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
|
253 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
|
254 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
255 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
|
256 " 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
|
257 " 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
|
258 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
|
259 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
260 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
261 " 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
|
262 " 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
|
263 " |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
264 " 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
|
265 " 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
|
266 " 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
|
267 " absolute. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
268 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
|
269 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
|
270 for line in l:lines |
99
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
271 let l:exarg_idx = matchend(line, '\v^\-\-exclude=') |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
272 if l:exarg_idx < 0 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
273 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
|
274 continue |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
275 endif |
99
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
276 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
277 " Don't convert things that don't look like paths. |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
278 let l:exarg = strpart(line, l:exarg_idx + 1) |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
279 let l:do_convert = 1 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
280 if l:exarg[0] == '@' " Manifest file path |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
281 let l:do_convert = 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
282 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
283 if stridx(l:exarg, '/') < 0 && stridx(l:exarg, '\\') < 0 " Filename |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
284 let l:do_convert = 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
285 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
286 if l:do_convert == 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
287 call add(l:outlines, line) |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
288 continue |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
289 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
290 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
291 let l:fullp = l:proj_dir . gutentags#normalizepath('/'.l:exarg) |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
292 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
|
293 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
|
294 endfor |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
295 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
296 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
|
297 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
|
298 endfunction |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
299 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
300 " }}} |