annotate autoload/gutentags/ctags.vim @ 235:def58b9d22c6

Exclude cscope from default file list command With default setup gutentags generate file list for cscope using simple `find -type f` command in update_scopedb.sh. Subsequent invocations of this script causes unbounded growth of cscope database because cscope indexes itself every time. This change excludes cscope database file from default file list command for cscope database generation so it will work properly by default. Another option is to use custom file list command like `ag -l` that will generate files known to source control, that is without cscope database file.
author Alex Dzyoba <alex@dzyoba.com>
date Tue, 18 Dec 2018 23:32:20 +0300
parents 740cd9065423
children ac312dc3c111
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()
230
a798f7ad11c5 Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 226
diff changeset
153 if !empty(s:wildignores_options_path)
a798f7ad11c5 Fix bug for when `wildignore` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 226
diff changeset
154 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
155 endif
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 for exc in g:gutentags_ctags_exclude
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
158 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
159 endfor
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
160 if g:gutentags_pause_after_update
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
161 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
162 endif
5fb056a9eefb Don't change the current working directory more often than needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 185
diff changeset
163 if g:gutentags_trace
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
164 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
165 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
166 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
167
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
168 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
169 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
170 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
171 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
172 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
173 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
174 else
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("(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
176 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
177 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
178
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
179 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
180 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
181
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
182 if a:exit_val != 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
183 call gutentags#warning("gutentags: ctags job failed, returned: ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
184 \string(a:exit_val))
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
185 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189
62
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
190 " Utilities {{{
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
191
70
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
192 " 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
193 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
194 "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
195 let l:ftype = get(split(&filetype, '\.'), 0, '')
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
196 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
197 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
198 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
199 \ ? 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
200 return expand(exepath, 1)
70
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
201 endfunction
661a97eaf608 Move `get_ctags_executable` to the `ctags` module.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
202
226
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
203 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
204 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
205 " 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
206 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
207 return
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
208 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
209
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
210 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
211 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
212 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
213 else
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
214 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
215 \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
216 \'/_wildignore.options'
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
217 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
218 endif
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
219
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
220 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
221 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
222 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
223 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
224 endfor
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
225 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
226 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
227 endfunction
f2fd7d5835d9 Place all the `wildignore` exclude patterns in a generated options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
228
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 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
230 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
231 " 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
232 " 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
233 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
234 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
235
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
236 " 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
237 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
238 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
239 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
240 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
241 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
242 \"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
243 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
244 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
245 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
246 \"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
247 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
248 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
249 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
250 " 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
251 " 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
252 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
253 endif
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
254
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
255 " 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
256 " 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
257 "
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
258 " 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
259 " 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
260 " 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
261 " absolute.
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
262 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
263 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
264 for line in l:lines
99
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
265 let l:exarg_idx = matchend(line, '\v^\-\-exclude=')
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
266 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
267 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
268 continue
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
269 endif
99
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
270
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
271 " 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
272 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
273 let l:do_convert = 1
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
274 if l:exarg[0] == '@' " Manifest file path
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
275 let l:do_convert = 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
276 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
277 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
278 let l:do_convert = 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
279 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
280 if l:do_convert == 0
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
281 call add(l:outlines, line)
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
282 continue
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
283 endif
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
284
05fc1e2172cc Fixes in the processing of `.gutctags`.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
285 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
286 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
287 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
288 endfor
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
289
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
290 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
291 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
292 endfunction
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
293
106757c129cb Change the per-project option file to be `.gutctags` and process it first.
Ludovic Chabant <ludovic@chabant.com>
parents: 60
diff changeset
294 " }}}