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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 " }}}