annotate autoload/gutentags/ctags.vim @ 226:f2fd7d5835d9

Place all the `wildignore` exclude patterns in a generated options file.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 11 Nov 2018 21:48:00 -0800
parents b50b6d0f82dd
children a798f7ad11c5
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
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 execute 'setlocal tags^=' . fnameescape(b:gutentags_files['ctags'])
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 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
58
edd488d8d37e Give some error message if there's no available `ctags` on the system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
59 " Check if the ctags executable exists.
185
685b81826b68 Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents: 184
diff changeset
60 if s:did_check_exe == 0
685b81826b68 Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents: 184
diff changeset
61 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
62 let g:gutentags_enabled = 0
685b81826b68 Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents: 184
diff changeset
63 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
64 \."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
65 \."setting g:gutentags_enabled back to 1."
685b81826b68 Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents: 184
diff changeset
66 endif
685b81826b68 Only check for the ctags executable once.
Ludovic Chabant <ludovic@chabant.com>
parents: 184
diff changeset
67 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
68 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
71 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
72 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
73
84
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 75
diff changeset
74 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
75 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
76 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
77
86
7872cc9bbc2d Check existing tags file as an opt-in thing for now.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
78 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
79 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
80 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
81 call gutentags#throw(
148
b178f2251982 Only set `v:errmsg` when we throw an actual error.
Ludovic Chabant <ludovic@chabant.com>
parents: 141
diff changeset
82 \"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
83 \"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
84 \":GutentagsUpdate!.")
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 75
diff changeset
85 return
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 75
diff changeset
86 endif
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 75
diff changeset
87 endif
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 75
diff changeset
88
173
2cf3fb66285b Use absolute paths for `ctags` if the tags file is not local.
Ludovic Chabant <ludovic@chabant.com>
parents: 171
diff changeset
89 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
90 " 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
91 " around.
34c57ad6eb45 Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
92 "
34c57ad6eb45 Always use the potentially custom name for the tags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 165
diff changeset
93 " 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
94 " 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
95 " 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
96 " 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
97 " `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
98 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
99 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
100 else
d645125192aa Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
101 " 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
102 " 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
103 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
104 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
105 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106
198
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
107 " Build the command line.
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
108 let l:cmd = [s:runner_exe]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
109 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
110 let l:cmd += ['-t', '"' . l:actual_tags_file . '"']
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
111 let l:cmd += ['-p', '"' . l:actual_proj_dir . '"']
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
112 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
113 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
114 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
115 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
116 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
117 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
118 else
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
119 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
120 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
121 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
122 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
123 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
124 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
125 if l:suffoptstr == 'absolute'
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
126 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
127 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
128 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
129 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
130 endif
198
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
131 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
132 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
133 " 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
134 " 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
135 " 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
136 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
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(g:gutentags_ctags_extra_args)
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
139 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
140 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
141 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
142 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
143 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
144 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
145 \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
146 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
147 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
148 \a:proj_dir, l:proj_options_file)
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
149 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
150 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
151 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
152 call s:generate_wildignore_options()
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
153 let l:cmd += ['-x', shellescape('@'.s:wildignores_options_path, 1)]
198
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
154 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
155 for exc in g:gutentags_ctags_exclude
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
156 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
157 endfor
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
158 if g:gutentags_pause_after_update
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
159 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
160 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
161 if g:gutentags_trace
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
162 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
163 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
164 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
165
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
166 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
167 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
168 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
169 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
170 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
171 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
172 else
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
173 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
174 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
175 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
176
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
177 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
178 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
179
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
180 if a:exit_val != 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
181 call gutentags#warning("gutentags: ctags job failed, returned: ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
182 \string(a:exit_val))
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
183 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187
62
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
188 " Utilities {{{
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
189
70
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
190 " 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
191 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
192 "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
193 let l:ftype = get(split(&filetype, '\.'), 0, '')
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
194 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
195 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
196 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
197 \ ? 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
198 return expand(exepath, 1)
70
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
199 endfunction
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
200
226
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
201 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
202 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
203 " 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
204 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
205 return
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
206 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
207
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
208 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
209 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
210 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
211 else
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
212 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
213 \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
214 \'/_wildignore.options'
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
215 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
216 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
217
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
218 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
219 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
220 for ign in split(&wildignore, ',')
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
221 call add(l:opt_lines, '--exclude='.ign)
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
222 endfor
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
223 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
224 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
225 endfunction
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
226
62
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
227 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
228 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
229 " 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
230 " 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
231 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
232 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
233
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
234 " 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
235 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
236 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
237 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
238 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
239 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
240 \"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
241 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
242 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
243 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
244 \"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
245 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
246 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
247 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
248 " 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
249 " 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
250 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
251 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
252
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
253 " 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
254 " 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
255 "
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
256 " 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
257 " 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
258 " 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
259 " absolute.
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
260 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
261 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
262 for line in l:lines
99
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
263 let l:exarg_idx = matchend(line, '\v^\-\-exclude=')
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
264 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
265 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
266 continue
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
267 endif
99
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
268
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
269 " 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
270 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
271 let l:do_convert = 1
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
272 if l:exarg[0] == '@' " Manifest file path
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
273 let l:do_convert = 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
274 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
275 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
276 let l:do_convert = 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
277 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
278 if l:do_convert == 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
279 call add(l:outlines, line)
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
280 continue
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
281 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
282
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
283 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
284 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
285 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
286 endfor
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
287
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
288 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
289 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
290 endfunction
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
291
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
292 " }}}