Mercurial > vim-gutentags
annotate autoload/gutentags/ctags.vim @ 251:e61d20280c6c
Fix some more spaces-in-paths issues.
When using the tags cache directory, the project root is passed to ctags.
Escaping this path didn't work correctly when it has spaces:
- We remove the quotes around it on *nix because `job_start()` doesn't
like those, but then we need to escape the spaces with backslashes
otherwise the script doesn't understand those parameters.
- Once the escaping is gone in the script, we need to quote them but it
looks like sh doesn't like double quotes in the middle of an env var
or something, so we need to put the project root in a separate env
var.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 25 Oct 2019 23:52:12 -0700 |
parents | 36dabe30ab6e |
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 " }}} |