Mercurial > vim-gutentags
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 |
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 " }}} |