annotate autoload/gutentags.vim @ 233:93e66524d78a

Fix file listing for cscope on Windows (#173)
author Chayoung You <yousbe@gmail.com>
date Mon, 17 Dec 2018 19:45:03 +0900
parents 34bee0477b51
children a77c3eb4ce34
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 " gutentags.vim - Automatic ctags management for Vim
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 " Utilities {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
5 function! gutentags#chdir(path)
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
6 if has('nvim')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
7 let chdir = haslocaldir() ? 'lcd' : haslocaldir(-1, 0) ? 'tcd' : 'cd'
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
8 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
9 let chdir = haslocaldir() ? 'lcd' : 'cd'
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
10 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
11 execute chdir a:path
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
12 endfunction
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
13
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 " Throw an exception message.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 function! gutentags#throw(message)
148
b178f2251982 Only set `v:errmsg` when we throw an actual error.
Ludovic Chabant <ludovic@chabant.com>
parents: 147
diff changeset
16 throw "gutentags: " . a:message
b178f2251982 Only set `v:errmsg` when we throw an actual error.
Ludovic Chabant <ludovic@chabant.com>
parents: 147
diff changeset
17 endfunction
b178f2251982 Only set `v:errmsg` when we throw an actual error.
Ludovic Chabant <ludovic@chabant.com>
parents: 147
diff changeset
18
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
19 " Show an error message.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
20 function! gutentags#error(message)
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 let v:errmsg = "gutentags: " . a:message
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
22 echoerr v:errmsg
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
23 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
24
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
25 " Show a warning message.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
26 function! gutentags#warning(message)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
27 echohl WarningMsg
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
28 echom "gutentags: " . a:message
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
29 echohl None
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 " Prints a message if debug tracing is enabled.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 function! gutentags#trace(message, ...)
220
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
34 if g:gutentags_trace || (a:0 && a:1)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
35 let l:message = "gutentags: " . a:message
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
36 echom l:message
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
37 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 " Strips the ending slash in a path.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 function! gutentags#stripslash(path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 return fnamemodify(a:path, ':s?[/\\]$??')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 " Normalizes the slashes in a path.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 function! gutentags#normalizepath(path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 if exists('+shellslash') && &shellslash
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 return substitute(a:path, '\v/', '\\', 'g')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 elseif has('win32')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 return substitute(a:path, '\v/', '\\', 'g')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 return a:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 " Shell-slashes the path (opposite of `normalizepath`).
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 function! gutentags#shellslash(path)
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
58 if exists('+shellslash') && !&shellslash
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
59 return substitute(a:path, '\v\\', '/', 'g')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
60 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
61 return a:path
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
62 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 " Gets a file path in the correct `plat` folder.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 function! gutentags#get_plat_file(filename) abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 return g:gutentags_plat_dir . a:filename . g:gutentags_script_ext
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69
75
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
70 " Gets a file path in the resource folder.
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
71 function! gutentags#get_res_file(filename) abort
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
72 return g:gutentags_res_dir . a:filename
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
73 endfunction
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
74
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
75 " Generate a path for a given filename in the cache directory.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
76 function! gutentags#get_cachefile(root_dir, filename) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
77 if gutentags#is_path_rooted(a:filename)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
78 return a:filename
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
79 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
80 let l:tag_path = gutentags#stripslash(a:root_dir) . '/' . a:filename
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
81 if g:gutentags_cache_dir != ""
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
82 " Put the tag file in the cache dir instead of inside the
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
83 " project root.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
84 let l:tag_path = g:gutentags_cache_dir . '/' .
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
85 \tr(l:tag_path, '\/: ', '---_')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
86 let l:tag_path = substitute(l:tag_path, '/\-', '/', '')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
87 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
88 let l:tag_path = gutentags#normalizepath(l:tag_path)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
89 return l:tag_path
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
90 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
91
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
92 " Makes sure a given command starts with an executable that's in the PATH.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
93 function! gutentags#validate_cmd(cmd) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
94 if !empty(a:cmd) && executable(split(a:cmd)[0])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
95 return a:cmd
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
96 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
97 return ""
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
98 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
99
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
100 " Makes an appropriate command line for use with `job_start` by converting
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
101 " a list of possibly quoted arguments into a single string on Windows, or
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
102 " into a list of unquoted arguments on Unix/Mac.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
103 if has('win32') || has('win64')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
104 function! gutentags#make_args(cmd) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
105 return join(a:cmd, ' ')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
106 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
107 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
108 function! gutentags#make_args(cmd) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
109 let l:outcmd = []
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
110 for cmdarg in a:cmd
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
111 " Thanks Vimscript... you can use negative integers for strings
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
112 " in the slice notation, but not for indexing characters :(
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
113 let l:arglen = strlen(cmdarg)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
114 if (cmdarg[0] == '"' && cmdarg[l:arglen - 1] == '"') ||
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
115 \(cmdarg[0] == "'" && cmdarg[l:arglen - 1] == "'")
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
116 call add(l:outcmd, cmdarg[1:-2])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
117 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
118 call add(l:outcmd, cmdarg)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
119 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
120 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
121 return l:outcmd
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
122 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
123 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
124
164
28d4dae03f2a If a user init function specified an absolute path, don't mess with it.
Ludovic Chabant <ludovic@chabant.com>
parents: 157
diff changeset
125 " Returns whether a path is rooted.
28d4dae03f2a If a user init function specified an absolute path, don't mess with it.
Ludovic Chabant <ludovic@chabant.com>
parents: 157
diff changeset
126 if has('win32') || has('win64')
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
127 function! gutentags#is_path_rooted(path) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
128 return len(a:path) >= 2 && (
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
129 \a:path[0] == '/' || a:path[0] == '\' || a:path[1] == ':')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
130 endfunction
164
28d4dae03f2a If a user init function specified an absolute path, don't mess with it.
Ludovic Chabant <ludovic@chabant.com>
parents: 157
diff changeset
131 else
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
132 function! gutentags#is_path_rooted(path) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
133 return !empty(a:path) && a:path[0] == '/'
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
134 endfunction
164
28d4dae03f2a If a user init function specified an absolute path, don't mess with it.
Ludovic Chabant <ludovic@chabant.com>
parents: 157
diff changeset
135 endif
28d4dae03f2a If a user init function specified an absolute path, don't mess with it.
Ludovic Chabant <ludovic@chabant.com>
parents: 157
diff changeset
136
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 " Gutentags Setup {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 let s:known_files = []
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
142 let s:known_projects = {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
143
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
144 function! s:cache_project_root(path) abort
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
145 let l:result = {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
146
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
147 for proj_info in g:gutentags_project_info
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
148 let l:filematch = get(proj_info, 'file', '')
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
149 if l:filematch != '' && filereadable(a:path . '/'. l:filematch)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
150 let l:result = copy(proj_info)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
151 break
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
152 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
153
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
154 let l:globmatch = get(proj_info, 'glob', '')
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
155 if l:globmatch != '' && glob(a:path . '/' . l:globmatch) != ''
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
156 let l:result = copy(proj_info)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
157 break
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
158 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
159 endfor
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
160
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
161 let s:known_projects[a:path] = l:result
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
162 endfunction
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163
136
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
164 function! gutentags#get_project_file_list_cmd(path) abort
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
165 if type(g:gutentags_file_list_command) == type("")
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
166 return gutentags#validate_cmd(g:gutentags_file_list_command)
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
167 elseif type(g:gutentags_file_list_command) == type({})
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
168 let l:markers = get(g:gutentags_file_list_command, 'markers', [])
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
169 if type(l:markers) == type({})
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
170 for [marker, file_list_cmd] in items(l:markers)
157
6b00f4383708 Support project root markers that are wildcard patterns.
Ludovic Chabant <ludovic@chabant.com>
parents: 148
diff changeset
171 if !empty(globpath(a:path, marker, 1))
136
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
172 return gutentags#validate_cmd(file_list_cmd)
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
173 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
174 endfor
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
175 endif
157
6b00f4383708 Support project root markers that are wildcard patterns.
Ludovic Chabant <ludovic@chabant.com>
parents: 148
diff changeset
176 return get(g:gutentags_file_list_command, 'default', "")
136
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
177 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
178 return ""
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
179 endfunction
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
180
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 " Finds the first directory with a project marker by walking up from the given
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 " file path.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 function! gutentags#get_project_root(path) abort
146
3459a2522a3b Enable Project Root Finder
thecontinium <thecontinium@outlook.com>
parents: 136
diff changeset
184 if g:gutentags_project_root_finder != ''
132
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
185 return call(g:gutentags_project_root_finder, [a:path])
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
186 endif
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
187
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 let l:path = gutentags#stripslash(a:path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189 let l:previous_path = ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 let l:markers = g:gutentags_project_root[:]
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 if exists('g:ctrlp_root_markers')
134
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
192 for crm in g:ctrlp_root_markers
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
193 if index(l:markers, crm) < 0
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
194 call add(l:markers, crm)
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
195 endif
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
196 endfor
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 while l:path != l:previous_path
80
51c1a57811b3 Use full list of root markers in get_project_root.
Greg Hensley <greg.hensley@gmail.com>
parents: 75
diff changeset
199 for root in l:markers
174
721cba3cd20d Don't apply `wildignore` when looking for markers
Rafael Bodill <justrafi@gmail.com>
parents: 173
diff changeset
200 if !empty(globpath(l:path, root, 1))
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 let l:proj_dir = simplify(fnamemodify(l:path, ':p'))
90
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
202 let l:proj_dir = gutentags#stripslash(l:proj_dir)
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
203 if l:proj_dir == ''
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
204 call gutentags#trace("Found project marker '" . root .
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
205 \"' at the root of your file-system! " .
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
206 \" That's probably wrong, disabling " .
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
207 \"gutentags for this file...",
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
208 \1)
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
209 call gutentags#throw("Marker found at root, aborting.")
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
210 endif
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
211 for ign in g:gutentags_exclude_project_root
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
212 if l:proj_dir == ign
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
213 call gutentags#trace(
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
214 \"Ignoring project root '" . l:proj_dir .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
215 \"' because it is in the list of ignored" .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
216 \" projects.")
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
217 call gutentags#throw("Ignore project: " . l:proj_dir)
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
218 endif
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
219 endfor
90
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
220 return l:proj_dir
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 let l:previous_path = l:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 let l:path = fnamemodify(l:path, ':h')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 endwhile
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 call gutentags#throw("Can't figure out what tag file to use for: " . a:path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
229 " Get info on the project we're inside of.
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
230 function! gutentags#get_project_info(path) abort
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
231 return get(s:known_projects, a:path, {})
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
232 endfunction
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
233
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 " Setup gutentags for the current buffer.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 function! gutentags#setup_gutentags() abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 if exists('b:gutentags_files') && !g:gutentags_debug
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 " This buffer already has gutentags support.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240
63
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
241 " Don't setup gutentags for anything that's not a normal buffer
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
242 " (so don't do anything for help buffers and quickfix windows and
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
243 " other such things)
166
1fe62e7f1fae Don't trigger a tags generation for the empty startup buffer.
Ludovic Chabant <ludovic@chabant.com>
parents: 164
diff changeset
244 " Also don't do anything for the default `[No Name]` buffer you get
1fe62e7f1fae Don't trigger a tags generation for the empty startup buffer.
Ludovic Chabant <ludovic@chabant.com>
parents: 164
diff changeset
245 " after starting Vim.
182
2489b4b54d5c Add `g:gutentags_generate_on_empty_buffer` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 180
diff changeset
246 if &buftype != '' ||
2489b4b54d5c Add `g:gutentags_generate_on_empty_buffer` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 180
diff changeset
247 \(bufname('%') == '' && !g:gutentags_generate_on_empty_buffer)
63
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
248 return
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
249 endif
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
250
229
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
251 " Don't setup gutentags for things that don't need it, or that could
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
252 " cause problems.
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
253 if index(g:gutentags_exclude_filetypes, &filetype) >= 0
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
254 return
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
255 endif
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
256
88
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
257 " Let the user specify custom ways to disable Gutentags.
141
7bc4df0225d1 Add support for specifying buffer-specific tagfiles.
Ludovic Chabant <ludovic@chabant.com>
parents: 136
diff changeset
258 if g:gutentags_init_user_func != '' &&
7bc4df0225d1 Add support for specifying buffer-specific tagfiles.
Ludovic Chabant <ludovic@chabant.com>
parents: 136
diff changeset
259 \!call(g:gutentags_init_user_func, [expand('%:p')])
88
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
260 call gutentags#trace("Ignoring '" . bufname('%') . "' because of " .
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
261 \"custom user function.")
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
262 return
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
263 endif
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
264
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 " Try and find what tags file we should manage.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 call gutentags#trace("Scanning buffer '" . bufname('%') . "' for gutentags setup...")
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 try
85
0424970d81f8 Add a `g:gutentags_resolve_symlinks` option to resolve symlinks at setup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
268 let l:buf_dir = expand('%:p:h', 1)
0424970d81f8 Add a `g:gutentags_resolve_symlinks` option to resolve symlinks at setup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
269 if g:gutentags_resolve_symlinks
0424970d81f8 Add a `g:gutentags_resolve_symlinks` option to resolve symlinks at setup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
270 let l:buf_dir = fnamemodify(resolve(expand('%:p', 1)), ':p:h')
0424970d81f8 Add a `g:gutentags_resolve_symlinks` option to resolve symlinks at setup time.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
271 endif
123
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
272 if !exists('b:gutentags_root')
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
273 let b:gutentags_root = gutentags#get_project_root(l:buf_dir)
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
274 endif
47
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
275 if filereadable(b:gutentags_root . '/.notags')
121
8310e4602de9 minor: fix typos / unbalanced quotes
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
276 call gutentags#trace("'.notags' file found... no gutentags support.")
47
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
277 return
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
278 endif
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
279
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
280 if !has_key(s:known_projects, b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
281 call s:cache_project_root(b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
282 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
283 if g:gutentags_trace
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
284 let l:projnfo = gutentags#get_project_info(b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
285 if l:projnfo != {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
286 call gutentags#trace("Setting project type to ".l:projnfo['type'])
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
287 else
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
288 call gutentags#trace("No specific project type.")
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
289 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
290 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
291
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 let b:gutentags_files = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 call call("gutentags#".module."#init", [b:gutentags_root])
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 catch /^gutentags\:/
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
297 call gutentags#trace("No gutentags support for this buffer.")
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 " We know what tags file to manage! Now set things up.
121
8310e4602de9 minor: fix typos / unbalanced quotes
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
302 call gutentags#trace("Setting gutentags for buffer '".bufname('%')."'")
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 " Autocommands for updating the tags on save.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
305 " We need to pass the buffer number to the callback function in the rare
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
306 " case that the current buffer is changed by another `BufWritePost`
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
307 " callback. This will let us get that buffer's variables without causing
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
308 " errors.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 let l:bn = bufnr('%')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 execute 'augroup gutentags_buffer_' . l:bn
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 execute ' autocmd!'
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
312 execute ' autocmd BufWritePost <buffer=' . l:bn . '> call s:write_triggered_update_tags(' . l:bn . ')'
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 execute 'augroup end'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 " Miscellaneous commands.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 command! -buffer -bang GutentagsUpdate :call s:manual_update_tags(<bang>0)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 " Add these tags files to the known tags files.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 for module in keys(b:gutentags_files)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 let l:tagfile = b:gutentags_files[module]
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 let l:found = index(s:known_files, l:tagfile)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 if l:found < 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 call add(s:known_files, l:tagfile)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 " Generate this new file depending on settings and stuff.
87
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
326 if g:gutentags_enabled
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
327 if g:gutentags_generate_on_missing && !filereadable(l:tagfile)
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
328 call gutentags#trace("Generating missing tags file: " . l:tagfile)
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
329 call s:update_tags(l:bn, module, 1, 1)
87
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
330 elseif g:gutentags_generate_on_new
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
331 call gutentags#trace("Generating tags file: " . l:tagfile)
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
332 call s:update_tags(l:bn, module, 1, 1)
87
afe113047204 Don't generate tags on file opened if `gutentags_enabled` is false.
Ludovic Chabant <ludovic@chabant.com>
parents: 85
diff changeset
333 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
341 " Job Management {{{
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 " List of queued-up jobs, and in-progress jobs, per module.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 let s:update_queue = {}
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
345 let s:update_in_progress = {}
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 let s:update_queue[module] = []
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
348 let s:update_in_progress[module] = []
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
351 function! gutentags#add_job(module, tags_file, data) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
352 call add(s:update_in_progress[a:module], [a:tags_file, a:data])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
353 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
354
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
355 function! gutentags#find_job_index_by_tags_file(module, tags_file) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
356 let l:idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
357 for upd_info in s:update_in_progress[a:module]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
358 let l:idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
359 if upd_info[0] == a:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
360 return l:idx
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
361 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
362 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
363 return -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
364 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
365
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
366 function! gutentags#find_job_index_by_data(module, data) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
367 let l:idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
368 for upd_info in s:update_in_progress[a:module]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
369 let l:idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
370 if upd_info[1] == a:data
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
371 return l:idx
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
372 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
373 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
374 return -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
375 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
376
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
377 function! gutentags#get_job_tags_file(module, job_idx) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
378 return s:update_in_progress[a:module][a:job_idx][0]
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
381 function! gutentags#get_job_data(module, job_idx) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
382 return s:update_in_progress[a:module][a:job_idx][1]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
383 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
384
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
385 function! gutentags#remove_job(module, job_idx) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
386 let l:tags_file = s:update_in_progress[a:module][a:job_idx][0]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
387 call remove(s:update_in_progress[a:module], a:job_idx)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
388
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
389 " Run the user callback for finished jobs.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
390 silent doautocmd User GutentagsUpdated
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
391
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
392 " See if we had any more updates queued up for this.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
393 let l:qu_idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
394 for qu_info in s:update_queue[a:module]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
395 let l:qu_idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
396 if qu_info[0] == l:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
397 break
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
399 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
400 if l:qu_idx >= 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
401 let l:qu_info = s:update_queue[a:module][l:qu_idx]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
402 call remove(s:update_queue[a:module], l:qu_idx)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
403
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
404 if bufexists(l:qu_info[1])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
405 call gutentags#trace("Finished ".a:module." job, ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
406 \"running queued update for '".l:tags_file."'.")
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
407 call s:update_tags(l:qu_info[1], a:module, l:qu_info[2], 2)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
408 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
409 call gutentags#trace("Finished ".a:module." job, ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
410 \"but skipping queued update for '".l:tags_file."' ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
411 \"because originating buffer doesn't exist anymore.")
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
412 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413 else
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
414 call gutentags#trace("Finished ".a:module." job.")
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
418 function! gutentags#remove_job_by_data(module, data) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
419 let l:idx = gutentags#find_job_index_by_data(a:module, a:data)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
420 call gutentags#remove_job(a:module, l:idx)
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
423 " }}}
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
424
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
425 " Tags File Management {{{
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
426
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427 " (Re)Generate the tags file for the current buffer's file.
48
c1b33dc55b1c Fix bug with `GutentagsUpdate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 47
diff changeset
428 function! s:manual_update_tags(bang) abort
221
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
429 let l:restore_prev_trace = 0
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
430 let l:prev_trace = g:gutentags_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
431 if &verbose > 0
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
432 let g:gutentags_trace = 1
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
433 let l:restore_prev_trace = 1
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
434 endif
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
435
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
436 try
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
437 let l:bn = bufnr('%')
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
438 for module in g:gutentags_modules
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
439 call s:update_tags(l:bn, module, a:bang, 0)
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
440 endfor
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
441 silent doautocmd User GutentagsUpdating
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
442 finally
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
443 if l:restore_prev_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
444 let g:gutentags_trace = l:prev_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
445 endif
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
446 endtry
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 " (Re)Generate the tags file for a buffer that just go saved.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
450 function! s:write_triggered_update_tags(bufno) abort
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 if g:gutentags_enabled && g:gutentags_generate_on_write
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452 for module in g:gutentags_modules
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
453 call s:update_tags(a:bufno, module, 0, 2)
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
454 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
456 silent doautocmd User GutentagsUpdating
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
458
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
459 " Update the tags file for the current buffer's file.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460 " write_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
461 " 0: update the tags file if it exists, generate it otherwise.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 " 1: always generate (overwrite) the tags file.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
463 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
464 " queue_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 " 0: if an update is already in progress, report it and abort.
83
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
466 " 1: if an update is already in progress, abort silently.
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
467 " 2: if an update is already in progress, queue another one.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
468 function! s:update_tags(bufno, module, write_mode, queue_mode) abort
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469 " Figure out where to save.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
470 let l:buf_gutentags_files = getbufvar(a:bufno, 'gutentags_files')
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
471 let l:tags_file = l:buf_gutentags_files[a:module]
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
472 let l:proj_dir = getbufvar(a:bufno, 'gutentags_root')
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
473
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474 " Check that there's not already an update in progress.
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
475 let l:in_progress_idx = gutentags#find_job_index_by_tags_file(
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
476 \a:module, l:tags_file)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
477 if l:in_progress_idx >= 0
83
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
478 if a:queue_mode == 2
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
479 let l:needs_queuing = 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
480 for qu_info in s:update_queue[a:module]
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
481 if qu_info[0] == l:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
482 let l:needs_queuing = 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
483 break
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
484 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
485 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
486 if l:needs_queuing
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
487 call add(s:update_queue[a:module],
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
488 \[l:tags_file, a:bufno, a:write_mode])
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
489 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
490 call gutentags#trace("Tag file '" . l:tags_file .
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
491 \"' is already being updated. Queuing it up...")
83
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
492 elseif a:queue_mode == 1
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
493 call gutentags#trace("Tag file '" . l:tags_file .
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
494 \"' is already being updated. Skipping...")
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
495 elseif a:queue_mode == 0
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
496 echom "gutentags: The tags file is already being updated, " .
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
497 \"please try again later."
83
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
498 else
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
499 call gutentags#throw("Unknown queue mode: " . a:queue_mode)
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
500 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
501
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
502 " Don't update the tags right now.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
503 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
504 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
505
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
506 " Switch to the project root to make the command line smaller, and make
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
507 " it possible to get the relative path of the filename to parse if we're
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
508 " doing an incremental update.
179
411f3fa915f5 Back to getcwd()
Henry Kupty <hkupty@gmail.com>
parents: 178
diff changeset
509 let l:prev_cwd = getcwd()
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
510 call gutentags#chdir(fnameescape(l:proj_dir))
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
511 try
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
512 call call("gutentags#".a:module."#generate",
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
513 \[l:proj_dir, l:tags_file,
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
514 \ {
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
515 \ 'write_mode': a:write_mode,
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
516 \ }])
84
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
517 catch /^gutentags\:/
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
518 echom "Error while generating ".a:module." file:"
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
519 echom v:exception
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
520 finally
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
521 " Restore the current directory...
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
522 call gutentags#chdir(fnameescape(l:prev_cwd))
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
523 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
524 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
525
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
526 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
527
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
528 " Utility Functions {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
529
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
530 function! gutentags#rescan(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
531 if exists('b:gutentags_files')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
532 unlet b:gutentags_files
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
533 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
534 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
535 let l:trace_backup = g:gutentags_trace
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
536 let l:gutentags_trace = 1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
537 endif
82
a837021a2388 Fix broken call debug function.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
538 call gutentags#setup_gutentags()
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
539 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
540 let g:gutentags_trace = l:trace_backup
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
541 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
542 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
543
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
544 function! gutentags#toggletrace(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
545 let g:gutentags_trace = !g:gutentags_trace
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
546 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
547 let g:gutentags_trace = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
548 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
549 if g:gutentags_trace
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
550 echom "gutentags: Tracing is enabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
551 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
552 echom "gutentags: Tracing is disabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
553 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
554 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
555 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
556
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
557 function! gutentags#fake(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
558 let g:gutentags_fake = !g:gutentags_fake
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
559 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
560 let g:gutentags_fake = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
561 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
562 if g:gutentags_fake
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
563 echom "gutentags: Now faking gutentags."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
564 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
565 echom "gutentags: Now running gutentags for real."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
566 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
567 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
568 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
569
203
6e96ddda0fd3 Fix some stupid typo for Vim8 code path.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
570 function! gutentags#default_io_cb(chan, msg) abort
227
c64e8847b4e1 Make it more obvious what trace is coming from the background job.
Ludovic Chabant <ludovic@chabant.com>
parents: 221
diff changeset
571 call gutentags#trace('[job output]: '.string(a:msg))
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
572 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
573
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
574 if has('nvim')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
575 " Neovim job API.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
576 function! s:nvim_job_exit_wrapper(real_cb, job, exit_code, event_type) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
577 call call(a:real_cb, [a:job, a:exit_code])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
578 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
579
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
580 function! s:nvim_job_out_wrapper(real_cb, job, lines, event_type) abort
205
485a347152fe Fix arguments to gutentags#default_io_cb()
Justin M. Keyes <justinkz@gmail.com>
parents: 203
diff changeset
581 call call(a:real_cb, [a:job, a:lines])
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
582 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
583
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
584 function! gutentags#build_default_job_options(module) abort
211
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
585 " Neovim kills jobs on exit, which is what we want.
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
586 let l:job_opts = {
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
587 \'on_exit': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
588 \ '<SID>nvim_job_exit_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
589 \ ['gutentags#'.a:module.'#on_job_exit']),
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
590 \'on_stdout': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
591 \ '<SID>nvim_job_out_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
592 \ ['gutentags#default_io_cb']),
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
593 \'on_stderr': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
594 \ '<SID>nvim_job_out_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
595 \ ['gutentags#default_io_cb'])
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
596 \}
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
597 return l:job_opts
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
598 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
599
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
600 function! gutentags#start_job(cmd, opts) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
601 return jobstart(a:cmd, a:opts)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
602 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
603 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
604 " Vim8 job API.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
605 function! gutentags#build_default_job_options(module) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
606 let l:job_opts = {
211
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
607 \'exit_cb': 'gutentags#'.a:module.'#on_job_exit',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
608 \'out_cb': 'gutentags#default_io_cb',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
609 \'err_cb': 'gutentags#default_io_cb',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
610 \'stoponexit': 'term'
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
611 \}
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
612 return l:job_opts
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
613 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
614
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
615 function! gutentags#start_job(cmd, opts) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
616 return job_start(a:cmd, a:opts)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
617 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
618 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
619
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
620 " Returns which modules are currently generating something for the
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
621 " current buffer.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
622 function! gutentags#inprogress()
220
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
623 " Does this buffer have gutentags enabled?
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
624 if !exists('b:gutentags_files')
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
625 return []
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
626 endif
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
627
220
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
628 " Find any module that has a job in progress for any of this buffer's
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
629 " tags files.
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
630 let l:modules_in_progress = []
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
631 for [module, tags_file] in items(b:gutentags_files)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
632 let l:jobidx = gutentags#find_job_index_by_tags_file(module, tags_file)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
633 if l:jobidx >= 0
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
634 call add(l:modules_in_progress, module)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
635 endif
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
636 endfor
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
637 return l:modules_in_progress
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
638 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
639
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
640 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
641
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
642 " Statusline Functions {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
643
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
644 " Prints whether a tag file is being generated right now for the current
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
645 " buffer in the status line.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
646 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
647 " Arguments can be passed:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
648 " - args 1 and 2 are the prefix and suffix, respectively, of whatever output,
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
649 " if any, is going to be produced.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
650 " (defaults to empty strings)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
651 " - arg 3 is the text to be shown if tags are currently being generated.
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
652 " (defaults to the name(s) of the modules currently generating).
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
653
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
654 function! gutentags#statusline(...) abort
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
655 let l:modules_in_progress = gutentags#inprogress()
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
656 if empty(l:modules_in_progress)
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
657 return ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
658 endif
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
659
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
660 let l:prefix = ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
661 let l:suffix = ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
662 if a:0 > 0
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
663 let l:prefix = a:1
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
664 endif
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
665 if a:0 > 1
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
666 let l:suffix = a:2
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
667 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
668
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
669 if a:0 > 2
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
670 let l:genmsg = a:3
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
671 else
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
672 let l:genmsg = join(l:modules_in_progress, ',')
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
673 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
674
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
675 return l:prefix.l:genmsg.l:suffix
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
676 endfunction
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
677
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
678 " Same as `gutentags#statusline`, but the only parameter is a `Funcref` or
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
679 " function name that will get passed the list of modules currently generating
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
680 " something. This formatter function should return the string to display in
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
681 " the status line.
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
682
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
683 function! gutentags#statusline_cb(fmt_cb, ...) abort
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
684 let l:modules_in_progress = gutentags#inprogress()
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
685
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
686 if (a:0 == 0 || !a:1) && empty(l:modules_in_progress)
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
687 return ''
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
688 endif
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
689
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
690 return call(a:fmt_cb, [l:modules_in_progress])
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
691 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
692
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
693 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
694