annotate autoload/gutentags.vim @ 136:286e5b3095d0

Allow restricting tag generation to files listed by custom commands This adds a new setting, g:gutentags_file_list_command, which specifies command(s) to use to list files for which tags should be generated, instead of recursively examining all files within the project root. This is useful in projects using source control to restrict tag generation to only files tracked in the repository. This setting is conceptually similar to CtrlP's ctrlp_user_command option. This implements the feature requested in https://github.com/ludovicchabant/vim-gutentags/issues/90
author Stephen Kent <smkent@smkent.net>
date Fri, 22 Jul 2016 19:25:05 -0700
parents 04288637e595
children 7bc4df0225d1 3459a2522a3b e59321cbaff7
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
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 " Throw an exception message.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 function! gutentags#throw(message)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 let v:errmsg = "gutentags: " . a:message
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 throw v:errmsg
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 " 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
12 function! gutentags#trace(message, ...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 if g:gutentags_trace || (a:0 && a:1)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 let l:message = "gutentags: " . a:message
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 echom l:message
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 " 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
20 function! gutentags#stripslash(path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 return fnamemodify(a:path, ':s?[/\\]$??')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 " Normalizes the slashes in a path.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 function! gutentags#normalizepath(path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 if exists('+shellslash') && &shellslash
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return substitute(a:path, '\v/', '\\', 'g')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 elseif has('win32')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 return substitute(a:path, '\v/', '\\', 'g')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 return a:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 " 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
36 function! gutentags#shellslash(path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 if exists('+shellslash') && !&shellslash
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 return substitute(a:path, '\v\\', '/', 'g')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 return a:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 " 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
45 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
46 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
47 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
75
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
49 " 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
50 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
51 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
52 endfunction
d12543f11eb9 Move the default `-R` option to an overridable "global" options file.
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
53
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 " }}}
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 " Gutentags Setup {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 let s:known_files = []
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
59 let s:known_projects = {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
60
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
61 function! s:cache_project_root(path) abort
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
62 let l:result = {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
63
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
64 for proj_info in g:gutentags_project_info
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
65 let l:filematch = get(proj_info, 'file', '')
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
66 if l:filematch != '' && filereadable(a:path . '/'. l:filematch)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
67 let l:result = copy(proj_info)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
68 break
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
69 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
70
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
71 let l:globmatch = get(proj_info, 'glob', '')
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
72 if l:globmatch != '' && glob(a:path . '/' . l:globmatch) != ''
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
73 let l:result = copy(proj_info)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
74 break
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
75 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
76 endfor
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
77
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
78 let s:known_projects[a:path] = l:result
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
79 endfunction
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80
136
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
81 function! gutentags#validate_cmd(cmd) abort
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
82 if !empty(a:cmd) && executable(split(a:cmd)[0])
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
83 return a:cmd
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
84 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
85 return ""
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
86 endfunction
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
87
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
88 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
89 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
90 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
91 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
92 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
93 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
94 for [marker, file_list_cmd] in items(l:markers)
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
95 if getftype(a:path . '/' . marker) != ""
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
96 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
97 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
98 endfor
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
99 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
100 endif
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
101 return ""
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
102 endfunction
286e5b3095d0 Allow restricting tag generation to files listed by custom commands
Stephen Kent <smkent@smkent.net>
parents: 134
diff changeset
103
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 " 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
105 " file path.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 function! gutentags#get_project_root(path) abort
132
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
107 if g:gutentags_project_root_finder
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
108 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
109 endif
a6ef1c860d07 Add support for custom root finders like `vim-projectroot`.
Ludovic Chabant <ludovic@chabant.com>
parents: 131
diff changeset
110
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 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
112 let l:previous_path = ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 let l:markers = g:gutentags_project_root[:]
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 if exists('g:ctrlp_root_markers')
134
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
115 for crm in g:ctrlp_root_markers
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
116 if index(l:markers, crm) < 0
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
117 call add(l:markers, crm)
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
118 endif
04288637e595 Don't use `uniq`.
Ludovic Chabant <ludovic@chabant.com>
parents: 132
diff changeset
119 endfor
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 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
122 for root in l:markers
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 if getftype(l:path . '/' . root) != ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 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
125 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
126 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
127 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
128 \"' 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
129 \" 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
130 \"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
131 \1)
b9965d1288c3 Don't enable Gutentags for markers at the root of the file-system.
Ludovic Chabant <ludovic@chabant.com>
parents: 89
diff changeset
132 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
133 endif
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
134 for ign in g:gutentags_exclude_project_root
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
135 if l:proj_dir == ign
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
136 call gutentags#trace(
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
137 \"Ignoring project root '" . l:proj_dir .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
138 \"' because it is in the list of ignored" .
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
139 \" projects.")
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
140 call gutentags#throw("Ignore project: " . l:proj_dir)
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
141 endif
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
142 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
143 return l:proj_dir
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 let l:previous_path = l:path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 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
148 endwhile
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 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
150 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
152 " Get info on the project we're inside of.
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
153 function! gutentags#get_project_info(path) abort
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
154 return get(s:known_projects, a:path, {})
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
155 endfunction
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
156
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 " Generate a path for a given filename in the cache directory.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 function! gutentags#get_cachefile(root_dir, filename) abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159 let l:tag_path = gutentags#stripslash(a:root_dir) . '/' . a:filename
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 if g:gutentags_cache_dir != ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 " Put the tag file in the cache dir instead of inside the
121
8310e4602de9 minor: fix typos / unbalanced quotes
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
162 " project root.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 let l:tag_path = g:gutentags_cache_dir . '/' .
98
d645125192aa Fix more problems with paths and spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 90
diff changeset
164 \tr(l:tag_path, '\/: ', '---_')
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 let l:tag_path = substitute(l:tag_path, '/\-', '/', '')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 let l:tag_path = gutentags#normalizepath(l:tag_path)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 return l:tag_path
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171 " Setup gutentags for the current buffer.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 function! gutentags#setup_gutentags() abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 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
174 " This buffer already has gutentags support.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177
63
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
178 " 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
179 " (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
180 " other such things)
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
181 if &buftype != ''
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
182 return
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
183 endif
0f5b4a36c920 Don't try to setup Gutentags for non normal buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
184
88
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
185 " Let the user specify custom ways to disable Gutentags.
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
186 if g:gutentags_enabled_user_func != '' &&
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
187 \!call(g:gutentags_enabled_user_func, [expand('%:p')])
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
188 call gutentags#trace("Ignoring '" . bufname('%') . "' because of " .
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
189 \"custom user function.")
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
190 return
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
191 endif
073e63cc0456 Add `gutentags_enabled_user_func` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
192
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 " 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
194 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
195 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
196 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
197 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
198 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
199 endif
123
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
200 if !exists('b:gutentags_root')
76a4822aab76 Use existing b:gutentags_root
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
201 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
202 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
203 if filereadable(b:gutentags_root . '/.notags')
121
8310e4602de9 minor: fix typos / unbalanced quotes
Daniel Hahler <git@thequod.de>
parents: 102
diff changeset
204 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
205 return
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
206 endif
7b419abf7fba Add ability to disable Gutentags if a `.notags` file is at the root.
Ludovic Chabant <ludovic@chabant.com>
parents: 46
diff changeset
207
89
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
208 if !has_key(s:known_projects, b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
209 call s:cache_project_root(b:gutentags_root)
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
210 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
211 if g:gutentags_trace
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
212 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
213 if l:projnfo != {}
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
214 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
215 else
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
216 call gutentags#trace("No specific project type.")
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
217 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
218 endif
8bf96f9f649c Add support for project types.
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
219
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 let b:gutentags_files = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 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
223 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 catch /^gutentags\:/
118
2838af9ff980 Add `g:gutentags_exclude_project_root`.
Ludovic Chabant <ludovic@chabant.com>
parents: 102
diff changeset
225 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
226 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 " 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
230 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
231
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 " 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
233 " 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
234 " 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
235 " 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
236 " errors.
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 let l:bn = bufnr('%')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 execute 'augroup gutentags_buffer_' . l:bn
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 execute ' autocmd!'
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
240 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
241 execute 'augroup end'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 " Miscellaneous commands.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 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
245
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 " 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
247 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
248 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
249 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
250 if l:found < 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 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
252
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 " 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
254 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
255 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
256 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
257 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
258 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
259 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
260 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
261 endif
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 " Tags File Management {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 " 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
272 let s:update_queue = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 let s:maybe_in_progress = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 for module in g:gutentags_modules
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 let s:update_queue[module] = []
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 let s:maybe_in_progress[module] = {}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 " Make a given file known as being currently generated or updated.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 function! gutentags#add_progress(module, file) abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 let s:maybe_in_progress[a:module][a:file] = localtime()
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 " Get how to execute an external command depending on debug settings.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 function! gutentags#get_execute_cmd() abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 if has('win32')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 let l:cmd = '!start '
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 if g:gutentags_background_update
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 let l:cmd .= '/b '
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 return l:cmd
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 return '!'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 " Get the suffix for how to execute an external command.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 function! gutentags#get_execute_cmd_suffix() abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 if has('win32')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 return ''
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 return ' &'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306 " (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
307 function! s:manual_update_tags(bang) abort
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
308 let l:bn = bufnr('%')
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 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
310 call s:update_tags(l:bn, module, a:bang, 0)
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 endfor
101
32e3d047e54e add user autocmds for after tags updated
David O'Trakoun <me@davidosomething.com>
parents: 90
diff changeset
312 silent doautocmd User GutentagsUpdated
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 " (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
316 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
317 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
318 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
319 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
320 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 endif
101
32e3d047e54e add user autocmds for after tags updated
David O'Trakoun <me@davidosomething.com>
parents: 90
diff changeset
322 silent doautocmd User GutentagsUpdated
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 endfunction
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 " 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
326 " write_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 " 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
328 " 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
329 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 " queue_mode:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 " 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
332 " 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
333 " 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
334 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
335 " Figure out where to save.
130
b6ec4caa22ff Remember the buffer number in the `BufWritePost` callback.
Ludovic Chabant <ludovic@chabant.com>
parents: 124
diff changeset
336 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
337 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
338 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
339
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 " Check that there's not already an update in progress.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 let l:lock_file = l:tags_file . '.lock'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 if filereadable(l:lock_file)
83
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
343 if a:queue_mode == 2
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 let l:idx = index(s:update_queue[a:module], l:tags_file)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 if l:idx < 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 call add(s:update_queue[a:module], l:tags_file)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 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
349 \"' 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
350 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
351 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
352 \"' 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
353 elseif a:queue_mode == 0
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 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
355 \"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
356 else
e7e392be4141 Only show message about an existing update job for user-initiated actions.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
357 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
358 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 return
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 " 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
363 " 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
364 " doing an incremental update.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 let l:prev_cwd = getcwd()
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366 execute "chdir " . fnameescape(l:proj_dir)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 try
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 call call("gutentags#".a:module."#generate",
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369 \[l:proj_dir, l:tags_file, a:write_mode])
84
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
370 catch /^gutentags\:/
96bfe5c37f37 Error and abort if we'll be overwriting a non-ctags file.
Ludovic Chabant <ludovic@chabant.com>
parents: 83
diff changeset
371 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
372 echom v:exception
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 finally
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374 " Restore the current directory...
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375 execute "chdir " . fnameescape(l:prev_cwd)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 endtry
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
381 " Utility Functions {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
382
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383 function! gutentags#rescan(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 if exists('b:gutentags_files')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 unlet b:gutentags_files
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 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
389 let l:gutentags_trace = 1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390 endif
82
a837021a2388 Fix broken call debug function.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
391 call gutentags#setup_gutentags()
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 if a:0 && a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 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
394 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
395 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396
46
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
397 function! gutentags#delete_lock_files() abort
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
398 if exists('b:gutentags_files')
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
399 for tagfile in values(b:gutentags_files)
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
400 silent call delete(tagfile.'.lock')
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
401 endfor
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
402 endif
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
403 endfunction
c0f56e4d52bd Make a bunch of advanced commands opt-in only.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
404
41
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 function! gutentags#toggletrace(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
406 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
407 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408 let g:gutentags_trace = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
409 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
410 if g:gutentags_trace
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
411 echom "gutentags: Tracing is enabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
412 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413 echom "gutentags: Tracing is disabled."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
414 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418 function! gutentags#fake(...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
419 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
420 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 let g:gutentags_fake = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 if g:gutentags_fake
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424 echom "gutentags: Now faking gutentags."
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
425 else
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 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
427 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
431 function! gutentags#inprogress()
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432 echom "gutentags: generations in progress:"
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
433 for mip in keys(s:maybe_in_progress)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
434 echom mip
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
436 echom ""
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
438
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
439 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
440
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
441 " Statusline Functions {{{
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
442
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
443 " 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
444 " buffer in the status line.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
445 "
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446 " Arguments can be passed:
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 " - 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
448 " 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
449 " (defaults to empty strings)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450 " - arg 3 is the text to be shown if tags are currently being generated.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 " (defaults to 'TAGS')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453 function! gutentags#statusline(...) abort
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
454 if !exists('b:gutentags_files')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 " This buffer doesn't have gutentags.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
456 return ''
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457 endif
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 " Figure out what the user is customizing.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460 let l:gen_msg = 'TAGS'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
461 if a:0 > 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 let l:gen_msg = a:1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
463 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
464
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 " To make this function as fast as possible, we first check whether the
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
466 " current buffer's tags file is 'maybe' being generated. This provides a
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
467 " nice and quick bail out for 99.9% of cases before we need to this the
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468 " file-system to check the lock file.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469 let l:modules_in_progress = []
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
470 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
471 let l:abs_tag_file = fnamemodify(b:gutentags_files[module], ':p')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
472 let l:progress_queue = s:maybe_in_progress[module]
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
473 let l:timestamp = get(l:progress_queue, l:abs_tag_file)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474 if l:timestamp == 0
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
475 return ''
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
476 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
477 " It's maybe generating! Check if the lock file is still there... but
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
478 " don't do it too soon after the script was originally launched, because
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
479 " there can be a race condition where we get here just before the script
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
480 " had a chance to write the lock file.
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
481 if (localtime() - l:timestamp) > 1 &&
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
482 \!filereadable(l:abs_tag_file . '.lock')
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
483 call remove(l:progress_queue, l:abs_tag_file)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
484 return ''
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
485 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
486 call add(l:modules_in_progress, module)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
487 endfor
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
488
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
489 " It's still there! So probably `ctags` is still running...
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
490 " (although there's a chance it crashed, or the script had a problem, and
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
491 " the lock file has been left behind... we could try and run some
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
492 " additional checks here to see if it's legitimately running, and
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
493 " otherwise delete the lock file... maybe in the future...)
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
494 if len(g:gutentags_modules) > 1
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
495 let l:gen_msg .= '['.join(l:modules_in_progress, ',').']'
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
496 endif
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
497 return l:gen_msg
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
498 endfunction
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
499
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
500 " }}}
99328cb71e75 Refactor Gutentags so functionality can be implemented in "modules".
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
501