annotate autoload/gutentags.vim @ 245:89b41690f374

Check if there are files to generate cscope DB
author Chayoung You <yousbe@gmail.com>
date Mon, 08 Apr 2019 16:42:15 +0900
parents d3f9a92399d1
children 97723c1818e0
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
244
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
187 return gutentags#default_get_project_root(a:path)
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
188 endfunction
132
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
189
244
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
190 " Default implementation for finding project markers... useful when a custom
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
191 " finder (`g:gutentags_project_root_finder`) wants to fallback to the default
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
192 " behaviour.
d3f9a92399d1 Separate the default project marker finder into a function.
Ludovic Chabant <ludovic@chabant.com>
parents: 243
diff changeset
193 function! gutentags#default_get_project_root(path) abort
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 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
195 let l:previous_path = ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 let l:markers = g:gutentags_project_root[:]
243
050d0549ecf3 Add `g:gutentags_add_ctrlp_root_markers` option.
Ludovic Chabant <ludovic@chabant.com>
parents: 236
diff changeset
197 if g:gutentags_add_ctrlp_root_markers && exists('g:ctrlp_root_markers')
134
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
198 for crm in g:ctrlp_root_markers
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
199 if index(l:markers, crm) < 0
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
200 call add(l:markers, crm)
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
201 endif
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
202 endfor
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 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
205 for root in l:markers
174
721cba3cd20d Don't apply `wildignore` when looking for markers
Rafael Bodill <justrafi@gmail.com>
parents: 173
diff changeset
206 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
207 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
208 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
209 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
210 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
211 \"' 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
212 \" 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
213 \"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
214 \1)
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
215 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
216 endif
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
217 for ign in g:gutentags_exclude_project_root
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
218 if l:proj_dir == ign
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
219 call gutentags#trace(
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
220 \"Ignoring project root '" . l:proj_dir .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
221 \"' because it is in the list of ignored" .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
222 \" projects.")
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
223 call gutentags#throw("Ignore project: " . l:proj_dir)
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
224 endif
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
225 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
226 return l:proj_dir
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 let l:previous_path = l:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 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
231 endwhile
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 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
233 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
235 " Get info on the project we're inside of.
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
236 function! gutentags#get_project_info(path) abort
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
237 return get(s:known_projects, a:path, {})
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
238 endfunction
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
239
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 " Setup gutentags for the current buffer.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 function! gutentags#setup_gutentags() abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 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
243 " This buffer already has gutentags support.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246
63
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
247 " 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
248 " (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
249 " 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
250 " 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
251 " after starting Vim.
182
2489b4b54d5c Add `g:gutentags_generate_on_empty_buffer` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 180
diff changeset
252 if &buftype != '' ||
2489b4b54d5c Add `g:gutentags_generate_on_empty_buffer` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 180
diff changeset
253 \(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
254 return
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
255 endif
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
256
229
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
257 " 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
258 " cause problems.
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
259 if index(g:gutentags_exclude_filetypes, &filetype) >= 0
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
260 return
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
261 endif
34bee0477b51 Add `g:gutentags_exclude_filetypes` setting.
Ludovic Chabant <ludovic@chabant.com>
parents: 227
diff changeset
262
88
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
263 " 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
264 if g:gutentags_init_user_func != '' &&
7bc4df0225d1 Add support for specifying buffer-specific tagfiles.
Ludovic Chabant <ludovic@chabant.com>
parents: 136
diff changeset
265 \!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
266 call gutentags#trace("Ignoring '" . bufname('%') . "' because of " .
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
267 \"custom user function.")
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
268 return
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
269 endif
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
270
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 " 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
272 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
273 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
274 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
275 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
276 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
277 endif
123
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
278 if !exists('b:gutentags_root')
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
279 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
280 endif
236
a77c3eb4ce34 Handle custom project root finder functions returning no value.
Ludovic Chabant <ludovic@chabant.com>
parents: 229
diff changeset
281 if !len(b:gutentags_root)
a77c3eb4ce34 Handle custom project root finder functions returning no value.
Ludovic Chabant <ludovic@chabant.com>
parents: 229
diff changeset
282 call gutentags#trace("no valid project root.. no gutentags support.")
a77c3eb4ce34 Handle custom project root finder functions returning no value.
Ludovic Chabant <ludovic@chabant.com>
parents: 229
diff changeset
283 return
a77c3eb4ce34 Handle custom project root finder functions returning no value.
Ludovic Chabant <ludovic@chabant.com>
parents: 229
diff changeset
284 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
285 if filereadable(b:gutentags_root . '/.notags')
121
8310e4602de9 minor: fix typos / unbalanced quotes
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
286 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
287 return
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
288 endif
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
289
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
290 if !has_key(s:known_projects, b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
291 call s:cache_project_root(b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
292 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
293 if g:gutentags_trace
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
294 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
295 if l:projnfo != {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
296 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
297 else
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
298 call gutentags#trace("No specific project type.")
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
299 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
300 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
301
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 let b:gutentags_files = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 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
305 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306 catch /^gutentags\:/
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
307 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
308 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 " 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
312 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
313
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 " 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
315 " 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
316 " 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
317 " 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
318 " errors.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 let l:bn = bufnr('%')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 execute 'augroup gutentags_buffer_' . l:bn
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 execute ' autocmd!'
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
322 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
323 execute 'augroup end'
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 " Miscellaneous commands.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 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
327
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 " 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
329 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
330 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
331 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
332 if l:found < 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 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
334
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 " 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
336 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
337 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
338 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
339 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
340 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
341 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
342 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
343 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 " }}}
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 " Job Management {{{
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 " 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
354 let s:update_queue = {}
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
355 let s:update_in_progress = {}
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 let s:update_queue[module] = []
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
358 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
359 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
361 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
362 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
363 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
364
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
365 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
366 let l:idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
367 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
368 let l:idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
369 if upd_info[0] == a:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
370 return l:idx
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
371 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
372 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
373 return -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
374 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
375
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
376 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
377 let l:idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
378 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
379 let l:idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
380 if upd_info[1] == a:data
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
381 return l:idx
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
382 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
383 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
384 return -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
385 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
386
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
387 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
388 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
389 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
391 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
392 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
393 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
394
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
395 function! gutentags#remove_job(module, job_idx) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
396 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
397 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
398
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
399 " Run the user callback for finished jobs.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
400 silent doautocmd User GutentagsUpdated
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
401
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
402 " 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
403 let l:qu_idx = -1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
404 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
405 let l:qu_idx += 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
406 if qu_info[0] == l:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
407 break
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
409 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
410 if l:qu_idx >= 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
411 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
412 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
413
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
414 if bufexists(l:qu_info[1])
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
415 call gutentags#trace("Finished ".a:module." job, ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
416 \"running queued update for '".l:tags_file."'.")
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
417 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
418 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
419 call gutentags#trace("Finished ".a:module." job, ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
420 \"but skipping queued update for '".l:tags_file."' ".
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
421 \"because originating buffer doesn't exist anymore.")
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
422 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 else
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
424 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
425 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
428 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
429 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
430 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
431 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
433 " }}}
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
434
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
435 " Tags File Management {{{
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
436
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 " (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
438 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
439 let l:restore_prev_trace = 0
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
440 let l:prev_trace = g:gutentags_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
441 if &verbose > 0
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
442 let g:gutentags_trace = 1
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
443 let l:restore_prev_trace = 1
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
444 endif
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
445
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
446 try
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
447 let l:bn = bufnr('%')
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
448 for module in g:gutentags_modules
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
449 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
450 endfor
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
451 silent doautocmd User GutentagsUpdating
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
452 finally
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
453 if l:restore_prev_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
454 let g:gutentags_trace = l:prev_trace
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
455 endif
93c492ed3d62 Add support for using `:verbose` with `:GutentagsUpdate`.
Ludovic Chabant <ludovic@chabant.com>
parents: 220
diff changeset
456 endtry
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 " (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
460 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
461 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
462 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
463 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
464 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
466 silent doautocmd User GutentagsUpdating
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
467 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469 " 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
470 " write_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
471 " 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
472 " 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
473 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474 " queue_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
475 " 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
476 " 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
477 " 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
478 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
479 " Figure out where to save.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
480 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
481 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
482 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
483
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
484 " 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
485 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
486 \a:module, l:tags_file)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
487 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
488 if a:queue_mode == 2
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
489 let l:needs_queuing = 1
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
490 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
491 if qu_info[0] == l:tags_file
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
492 let l:needs_queuing = 0
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
493 break
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
494 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
495 endfor
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
496 if l:needs_queuing
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
497 call add(s:update_queue[a:module],
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
498 \[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
499 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
500 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
501 \"' 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
502 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
503 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
504 \"' 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
505 elseif a:queue_mode == 0
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
506 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
507 \"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
508 else
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
509 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
510 endif
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
511
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
512 " 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
513 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
514 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
515
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
516 " 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
517 " 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
518 " doing an incremental update.
179
411f3fa915f5 Back to getcwd()
Henry Kupty <hkupty@gmail.com>
parents: 178
diff changeset
519 let l:prev_cwd = getcwd()
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
520 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
521 try
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
522 call call("gutentags#".a:module."#generate",
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
523 \[l:proj_dir, l:tags_file,
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
524 \ {
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
525 \ 'write_mode': a:write_mode,
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
526 \ }])
84
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
527 catch /^gutentags\:/
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
528 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
529 echom v:exception
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
530 finally
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
531 " Restore the current directory...
168
e59321cbaff7 Use scope-local functions
Henry Kupty <hkupty@gmail.com>
parents: 136
diff changeset
532 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
533 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
534 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
535
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
536 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
537
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
538 " Utility Functions {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
539
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
540 function! gutentags#rescan(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
541 if exists('b:gutentags_files')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
542 unlet b:gutentags_files
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
543 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
544 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
545 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
546 let l:gutentags_trace = 1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
547 endif
82
a837021a2388 Fix broken call debug function.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
548 call gutentags#setup_gutentags()
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
549 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
550 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
551 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
552 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
553
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
554 function! gutentags#toggletrace(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
555 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
556 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
557 let g:gutentags_trace = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
558 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
559 if g:gutentags_trace
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
560 echom "gutentags: Tracing is enabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
561 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
562 echom "gutentags: Tracing is disabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
563 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
564 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
565 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
566
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
567 function! gutentags#fake(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
568 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
569 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
570 let g:gutentags_fake = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
571 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
572 if g:gutentags_fake
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
573 echom "gutentags: Now faking gutentags."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
574 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
575 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
576 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
577 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
578 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
579
203
6e96ddda0fd3 Fix some stupid typo for Vim8 code path.
Ludovic Chabant <ludovic@chabant.com>
parents: 202
diff changeset
580 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
581 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
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 if has('nvim')
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
585 " Neovim job API.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
586 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
587 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
588 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
589
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
590 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
591 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
592 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
593
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
594 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
595 " 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
596 let l:job_opts = {
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
597 \'on_exit': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
598 \ '<SID>nvim_job_exit_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
599 \ ['gutentags#'.a:module.'#on_job_exit']),
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
600 \'on_stdout': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
601 \ '<SID>nvim_job_out_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
602 \ ['gutentags#default_io_cb']),
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
603 \'on_stderr': function(
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
604 \ '<SID>nvim_job_out_wrapper',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
605 \ ['gutentags#default_io_cb'])
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
606 \}
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
607 return l:job_opts
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
608 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
609
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
610 function! gutentags#start_job(cmd, opts) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
611 return jobstart(a:cmd, a:opts)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
612 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
613 else
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
614 " Vim8 job API.
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
615 function! gutentags#build_default_job_options(module) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
616 let l:job_opts = {
211
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
617 \'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
618 \'out_cb': 'gutentags#default_io_cb',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
619 \'err_cb': 'gutentags#default_io_cb',
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
620 \'stoponexit': 'term'
011d855724bf Make Vim8 terminate the background job on exit.
Ludovic Chabant <ludovic@chabant.com>
parents: 209
diff changeset
621 \}
202
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
622 return l:job_opts
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
623 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
624
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
625 function! gutentags#start_job(cmd, opts) abort
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
626 return job_start(a:cmd, a:opts)
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
627 endfunction
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
628 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
629
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
630 " Returns which modules are currently generating something for the
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
631 " current buffer.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
632 function! gutentags#inprogress()
220
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
633 " Does this buffer have gutentags enabled?
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
634 if !exists('b:gutentags_files')
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
635 return []
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
636 endif
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
637
220
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
638 " 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
639 " tags files.
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
640 let l:modules_in_progress = []
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
641 for [module, tags_file] in items(b:gutentags_files)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
642 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
643 if l:jobidx >= 0
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
644 call add(l:modules_in_progress, module)
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
645 endif
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
646 endfor
60229a0ea17d Fix indenting.
Ludovic Chabant <ludovic@chabant.com>
parents: 211
diff changeset
647 return l:modules_in_progress
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
648 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
649
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
650 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
651
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
652 " Statusline Functions {{{
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 " 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
655 " buffer in the status line.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
656 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
657 " Arguments can be passed:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
658 " - 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
659 " 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
660 " (defaults to empty strings)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
661 " - 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
662 " (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
663
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
664 function! gutentags#statusline(...) abort
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
665 let l:modules_in_progress = gutentags#inprogress()
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
666 if empty(l:modules_in_progress)
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
667 return ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
668 endif
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
669
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
670 let l:prefix = ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
671 let l:suffix = ''
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
672 if a:0 > 0
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
673 let l:prefix = a:1
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
674 endif
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
675 if a:0 > 1
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
676 let l:suffix = a:2
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
677 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
678
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
679 if a:0 > 2
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
680 let l:genmsg = a:3
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
681 else
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
682 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
683 endif
b50b6d0f82dd Refactor for Vim8/Neovim job support.
Ludovic Chabant <ludovic@chabant.com>
parents: 199
diff changeset
684
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
685 return l:prefix.l:genmsg.l:suffix
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
686 endfunction
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
687
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
688 " 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
689 " 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
690 " something. This formatter function should return the string to display in
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
691 " the status line.
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
692
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
693 function! gutentags#statusline_cb(fmt_cb, ...) abort
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
694 let l:modules_in_progress = gutentags#inprogress()
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
695
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
696 if (a:0 == 0 || !a:1) && empty(l:modules_in_progress)
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
697 return ''
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
698 endif
207
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
699
20bfab5b054f Status-line improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 205
diff changeset
700 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
701 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
702
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
703 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
704