Mercurial > vim-gutentags
annotate autoload/gutentags/ctags.vim @ 273:8ddbcbfa57b2
Re-create wildignore options file if missing
When the wildignore options file is a temp file it can be deleted by
other processes which clean up temp files, so check the file is readable
and re-create if necessary before adding it to the list of files from
which to read exclusion patterns (-x option for update_tags scripts).
Without this Gutentags sometimes gets stuck in a rut reporting ctags job
failed, probably because I use both GUI vim and terminal vim, but might
not use the GUI for days and when I return to it the temp file is gone.
author | Mark Woods <mwoods.online.ie@gmail.com> |
---|---|
date | Wed, 03 Aug 2022 18:22:56 +0100 |
parents | 6030953258fe |
children | efe305d995a0 |
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 |
257
81d51b4a2a78
The full path of update_tags.cmd should be quoted.
zoumi <zoumi@msn.com>
parents:
256
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) |
96bfe5c37f37
Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
75
diff
changeset
|
81 |
252
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
82 " If the tags file exists, we may want to do a sanity check to prevent |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
83 " weird errors that are hard to troubleshoot. |
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 |
252
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
95 " Get a tags file path relative to the current directory, which |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
96 " happens to be the project root in this case. |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
97 " Since the given tags file path is absolute, and since Vim won't |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
98 " change the path if it is not inside the current directory, we |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
99 " know that the tags file is "local" (i.e. inside the project) |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
100 " if the path was shortened (an absolute path will always be |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
101 " longer than a true relative path). |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
102 let l:tags_file_relative = fnamemodify(a:tags_file, ':.') |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
103 let l:tags_file_is_local = len(l:tags_file_relative) < len(a:tags_file) |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
104 let l:use_tag_relative_opt = 0 |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
105 |
173
2cf3fb66285b
Use absolute paths for `ctags` if the tags file is not local.
Ludovic Chabant <ludovic@chabant.com>
parents:
171
diff
changeset
|
106 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
|
107 " 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
|
108 " around. |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
109 " |
34c57ad6eb45
Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents:
165
diff
changeset
|
110 " 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
|
111 " 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
|
112 " confused if the paths have spaces -- but not if you're *in* the root |
252
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
113 " directory, for some reason... (which will be the case, we're running |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
114 " the jobs from the project root). |
98
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
115 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
|
116 let l:actual_tags_file = l:tags_file_relative |
252
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
117 |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
118 let l:tags_file_dir = fnamemodify(l:actual_tags_file, ':h') |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
119 if l:tags_file_dir != '.' |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
120 " Ok so now the tags file is stored in a subdirectory of the |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
121 " project root, instead of at the root. This happens if, say, |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
122 " someone set `gutentags_ctags_tagfile` to `.git/tags`, which |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
123 " seems to be fairly popular. |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
124 " |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
125 " By default, `ctags` writes paths relative to the current |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
126 " directory (the project root) but in this case we need it to |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
127 " be relative to the tags file (e.g. adding `../` in front of |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
128 " everything if the tags file is `.git/tags`). |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
129 " |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
130 " Thankfully most `ctags` implementations support an option |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
131 " just for this. |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
132 let l:use_tag_relative_opt = 1 |
56dc6f8e5472
Use tag-relative paths in ctags when needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
249
diff
changeset
|
133 endif |
98
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
134 else |
d645125192aa
Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
135 " 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
|
136 " 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
|
137 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
|
138 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
|
139 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
141 " Build the command line. |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
142 let l:cmd = [s:runner_exe] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
143 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
|
144 let l:cmd += ['-t', '"' . l:actual_tags_file . '"'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
145 let l:cmd += ['-p', '"' . l:actual_proj_dir . '"'] |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
146 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
|
147 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
|
148 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
|
149 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
|
150 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
151 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
|
152 else |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 if l:suffoptstr == 'absolute' |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
160 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
|
161 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
|
162 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
163 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
|
164 endif |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
165 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
166 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
|
167 " 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
|
168 " 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
|
169 " 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
|
170 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
|
171 endif |
256
950647497ae5
Make tag relative paths work correctly when no extra args are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
254
diff
changeset
|
172 if l:use_tag_relative_opt |
950647497ae5
Make tag relative paths work correctly when no extra args are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
254
diff
changeset
|
173 let l:cmd += ['-O', shellescape("--tag-relative=yes")] |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
174 endif |
256
950647497ae5
Make tag relative paths work correctly when no extra args are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
254
diff
changeset
|
175 for extra_arg in g:gutentags_ctags_extra_args |
950647497ae5
Make tag relative paths work correctly when no extra args are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
254
diff
changeset
|
176 let l:cmd += ['-O', shellescape(extra_arg)] |
950647497ae5
Make tag relative paths work correctly when no extra args are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
254
diff
changeset
|
177 endfor |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
178 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
|
179 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
|
180 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
181 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
|
182 \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
|
183 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
|
184 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
|
185 \a:proj_dir, l:proj_options_file) |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
186 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
|
187 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
188 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
|
189 call s:generate_wildignore_options() |
230
a798f7ad11c5
Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents:
226
diff
changeset
|
190 if !empty(s:wildignores_options_path) |
a798f7ad11c5
Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents:
226
diff
changeset
|
191 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
|
192 endif |
198
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
193 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
194 for exc in g:gutentags_ctags_exclude |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
195 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
|
196 endfor |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
197 if g:gutentags_pause_after_update |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
198 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
|
199 endif |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
200 if g:gutentags_trace |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
201 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
|
202 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
203 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
|
204 |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
205 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
|
206 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
|
207 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
|
208 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
|
209 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
|
210 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
|
211 else |
5fb056a9eefb
Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents:
185
diff
changeset
|
212 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
|
213 endif |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
214 endfunction |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
215 |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
216 function! gutentags#ctags#on_job_exit(job, exit_val) abort |
267
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
217 let [l:tags_file, l:job_data] = gutentags#remove_job_by_data('ctags', a:job) |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
218 |
254
52be4cf89810
Don't complain when the job gets killed when Vim exits.
Ludovic Chabant <ludovic@chabant.com>
parents:
253
diff
changeset
|
219 if a:exit_val != 0 && !g:__gutentags_vim_is_leaving |
241
ac312dc3c111
Don't duplicate the `gutentags:` message prefix.
Ludovic Chabant <ludovic@chabant.com>
parents:
231
diff
changeset
|
220 call gutentags#warning("ctags job failed, returned: ". |
202
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
221 \string(a:exit_val)) |
b50b6d0f82dd
Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents:
199
diff
changeset
|
222 endif |
267
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
223 if has('win32') && g:__gutentags_vim_is_leaving |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
224 " The process got interrupted because Vim is quitting. |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
225 " Remove the tags and lock files on Windows because there's no `trap` |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
226 " statement in update script. |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
227 try | call delete(l:tags_file) | endtry |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
228 try | call delete(l:tags_file.'.temp') | endtry |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
229 try | call delete(l:tags_file.'.lock') | endtry |
6030953258fe
On Windows, kill ongoing jobs before leaving so we can clean-up temp files
Ludovic Chabant <ludovic@chabant.com>
parents:
257
diff
changeset
|
230 endif |
41
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 endfunction |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 " }}} |
99328cb71e75
Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
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 " Utilities {{{ |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
236 |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
237 " 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
|
238 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
|
239 "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
|
240 let l:ftype = get(split(&filetype, '\.'), 0, '') |
89
8bf96f9f649c
Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents:
86
diff
changeset
|
241 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
|
242 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
|
243 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
|
244 \ ? 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
|
245 return expand(exepath, 1) |
70
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
246 endfunction |
661a97eaf608
Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents:
69
diff
changeset
|
247 |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
248 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
|
249 if s:last_wildignores == &wildignore |
273
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
250 " The 'wildignore' setting didn't change since last time we did this, |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
251 " but check if file still exist (could have been deleted if temp file) |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
252 if filereadable(s:wildignores_options_path) |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
253 call gutentags#trace("Wildignore options file is up to date.") |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
254 return |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
255 else |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
256 call gutentags#trace("Wildignore options file is not readable.") |
8ddbcbfa57b2
Re-create wildignore options file if missing
Mark Woods <mwoods.online.ie@gmail.com>
parents:
267
diff
changeset
|
257 endif |
226
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
258 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
259 |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
260 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
|
261 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
|
262 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
|
263 else |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
264 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
|
265 \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
|
266 \'/_wildignore.options' |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
267 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
268 endif |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
269 |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 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
|
274 endfor |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
275 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
|
276 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
|
277 endfunction |
f2fd7d5835d9
Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents:
202
diff
changeset
|
278 |
62
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
279 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
|
280 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
|
281 " 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
|
282 " 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
|
283 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
|
284 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
285 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
286 " 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 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
|
292 \"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
|
293 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
|
294 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
|
295 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
|
296 \"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
|
297 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
|
298 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
299 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
|
300 " 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
|
301 " 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
|
302 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
|
303 endif |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
304 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
305 " 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
|
306 " 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
|
307 " |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
308 " 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
|
309 " 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
|
310 " 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
|
311 " absolute. |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
312 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
|
313 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
|
314 for line in l:lines |
99
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
315 let l:exarg_idx = matchend(line, '\v^\-\-exclude=') |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
316 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
|
317 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
|
318 continue |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
319 endif |
99
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
320 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
321 " 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
|
322 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
|
323 let l:do_convert = 1 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
324 if l:exarg[0] == '@' " Manifest file path |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
325 let l:do_convert = 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
326 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
327 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
|
328 let l:do_convert = 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
329 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
330 if l:do_convert == 0 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
331 call add(l:outlines, line) |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
332 continue |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
333 endif |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
334 |
05fc1e2172cc
Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents:
98
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 endfor |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
339 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
340 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
|
341 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
|
342 endfunction |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
343 |
106757c129cb
Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents:
60
diff
changeset
|
344 " }}} |