annotate plugin/autotags.vim @ 11:478638833c3b

Fix Win32 update script, add option to pause it.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 23 Jul 2014 17:04:34 -0700
parents b853ad0e7afd
children b8f23bf7b20f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 " autotags.vim - Automatic ctags management for Vim
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 " Maintainer: Ludovic Chabant <http://ludovic.chabant.com>
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 " Version: 0.0.1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 " Globals {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 if !exists('g:autotags_debug')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 let g:autotags_debug = 0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 if (exists('g:loaded_autotags') || &cp) && !g:autotags_debug
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 finish
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 if (exists('g:loaded_autotags') && g:autotags_debug)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 echom "Reloaded autotags."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 let g:loaded_autotags = 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 if !exists('g:autotags_trace')
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
20 let g:autotags_trace = 0
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 if !exists('g:autotags_fake')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 let g:autotags_fake = 0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 if !exists('g:autotags_background_update')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 let g:autotags_background_update = 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
11
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
31 if !exists('g:autotags_pause_after_update')
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
32 let g:autotags_pause_after_update = 0
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
33 endif
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
34
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 if !exists('g:autotags_enabled')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 let g:autotags_enabled = 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 if !exists('g:autotags_executable')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 let g:autotags_executable = 'ctags'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 if !exists('g:autotags_tagfile')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 let g:autotags_tagfile = 'tags'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 if !exists('g:autotags_project_root')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 let g:autotags_project_root = []
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 let g:autotags_project_root += ['.git', '.hg', '.bzr', '_darcs']
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
52 if !exists('g:autotags_exclude')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
53 let g:autotags_exclude = []
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
54 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
55
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
56 if !exists('g:autotags_generate_on_missing')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
57 let g:autotags_generate_on_missing = 1
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
58 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
59
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
60 if !exists('g:autotags_generate_on_write')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
61 let g:autotags_generate_on_write = 1
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
62 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
63
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
64 if !exists('g:autotags_auto_set_tags')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
65 let g:autotags_auto_set_tags = 1
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
66 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
67
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 " Utilities {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 " Throw an exception message.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 function! s:throw(message)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 let v:errmsg = "autotags: " . a:message
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 throw v:errmsg
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 " Prints a message if debug tracing is enabled.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 function! s:trace(message, ...)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 if g:autotags_trace || (a:0 && a:1)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 let l:message = "autotags: " . a:message
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 echom l:message
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 " Strips the ending slash in a path.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 function! s:stripslash(path)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 return fnamemodify(a:path, ':s?[/\\]$??')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 " Normalizes the slashes in a path.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 function! s:normalizepath(path)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 if exists('+shellslash') && &shellslash
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 return substitute(a:path, '\v/', '\\', 'g')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 elseif has('win32')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 return substitute(a:path, '\v/', '\\', 'g')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 return a:path
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 " Shell-slashes the path (opposite of `normalizepath`).
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 function! s:shellslash(path)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 if exists('+shellslash') && !&shellslash
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 return substitute(a:path, '\v\\', '/', 'g')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 return a:path
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 " Autotags Setup {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 " Finds the tag file path for the given current directory
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 " (typically the directory of the file being edited)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 function! s:get_tagfile_for(path) abort
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 let l:path = s:stripslash(a:path)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 let l:previous_path = ""
5
12f4f50f4d3a Use CtrlP root markers if they've been defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
120 let l:markers = g:autotags_project_root[:]
12f4f50f4d3a Use CtrlP root markers if they've been defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
121 if exists('g:ctrlp_root_markers')
12f4f50f4d3a Use CtrlP root markers if they've been defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
122 let l:markers += g:ctrlp_root_markers
12f4f50f4d3a Use CtrlP root markers if they've been defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
123 endif
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 while l:path != l:previous_path
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 for root in g:autotags_project_root
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 if getftype(l:path . '/' . root) != ""
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 return simplify(fnamemodify(l:path, ':p') . g:autotags_tagfile)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 endfor
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 let l:previous_path = l:path
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 let l:path = fnamemodify(l:path, ':h')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 endwhile
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 call s:throw("Can't figure out what tag file to use for: " . a:path)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 " Setup autotags for the current buffer.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 function! s:setup_autotags() abort
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
138 if exists('b:autotags_file') && !g:autotags_debug
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
139 " This buffer already has autotags support.
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 return
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 endif
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
142
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
143 " Try and file what tags file we should manage.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
144 call s:trace("Scanning buffer '" . bufname('%') . "' for autotags setup...")
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 try
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 let b:autotags_file = s:get_tagfile_for(expand('%:h'))
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 catch /^autotags\:/
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
148 call s:trace("Can't figure out what tag file to use... no autotags support.")
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 return
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 endtry
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
152 " We know what tags file to manage! Now set things up.
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 call s:trace("Setting autotags for buffer '" . bufname('%') . "' with tagfile: " . b:autotags_file)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
155 " Set the tags file for Vim to use.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
156 if g:autotags_auto_set_tags
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
157 execute 'setlocal tags^=' . b:autotags_file
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
158 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
159
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
160 " Autocommands for updating the tags on save.
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 let l:bn = bufnr('%')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 execute 'augroup autotags_buffer_' . l:bn
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 execute ' autocmd!'
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
164 execute ' autocmd BufWritePost <buffer=' . l:bn . '> call s:write_triggered_update_tags()'
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 execute 'augroup end'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
167 " Miscellaneous commands.
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 command! -buffer -bang AutotagsUpdate :call s:manual_update_tags(<bang>0)
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
169
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
170 " If the tags file doesn't exist, start generating it now.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
171 if g:autotags_generate_on_missing && !filereadable(b:autotags_file)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
172 call s:trace("Generating missing tags file: " . b:autotags_file)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
173 call s:update_tags(1, 0)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
174 endif
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 augroup autotags_detect
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 autocmd!
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 autocmd BufNewFile,BufReadPost * call s:setup_autotags()
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 autocmd VimEnter * if expand('<amatch>')==''|call s:setup_autotags()|endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 augroup end
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 " Tags File Management {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 let s:runner_exe = expand('<sfile>:h:h') . '/plat/unix/update_tags.sh'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 if has('win32')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189 let s:runner_exe = expand('<sfile>:h:h') . '\plat\win32\update_tags.cmd'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 let s:update_queue = []
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
193 let s:maybe_in_progress = []
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 " Get how to execute an external command depending on debug settings.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 function! s:get_execute_cmd() abort
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 if has('win32')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 let l:cmd = '!start '
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 if g:autotags_background_update
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 let l:cmd .= '/b '
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 return l:cmd
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 return '!'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
208 " Get the suffix for how to execute an external command.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
209 function! s:get_execute_cmd_suffix() abort
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
210 if has('win32')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
211 return ''
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
212 else
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
213 return ' &'
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
214 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
215 endfunction
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
216
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 " (Re)Generate the tags file for the current buffer's file.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 function! s:manual_update_tags(bang) abort
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 call s:update_tags(a:bang, 0)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
222 " (Re)Generate the tags file for a buffer that just go saved.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
223 function! s:write_triggered_update_tags() abort
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
224 if g:autotags_enabled && g:autotags_generate_on_write
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
225 call s:update_tags(0, 1)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
226 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
227 endfunction
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
228
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 " Update the tags file for the current buffer's file.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 " write_mode:
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 " 0: update the tags file if it exists, generate it otherwise.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 " 1: always generate (overwrite) the tags file.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 "
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 " queue_mode:
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 " 0: if an update is already in progress, report it and abort.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 " 1: if an update is already in progress, queue another one.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 "
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 " An additional argument specifies where to write the tags file. If nothing
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 " is specified, it will go to the autotags-defined file.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 function! s:update_tags(write_mode, queue_mode, ...) abort
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 " Figure out where to save.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 if a:0 == 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 let l:tags_file = a:1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 let l:tags_file = b:autotags_file
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 " Check that there's not already an update in progress.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 let l:lock_file = l:tags_file . '.lock'
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 if filereadable(l:lock_file)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 if a:queue_mode == 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 let l:idx = index(s:update_queue, l:tags_file)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 if l:idx < 0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 call add(s:update_queue, l:tags_file)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 call s:trace("Tag file '" . l:tags_file . "' is already being updated. Queuing it up...")
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 call s:trace("")
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 echom "autotags: The tags file is already being updated, please try again later."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 echom ""
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 return
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 " Switch to the project root to make the command line smaller, and make
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 " it possible to get the relative path of the filename to parse if we're
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 " doing an incremental update.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 let l:prev_cwd = getcwd()
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 let l:work_dir = fnamemodify(l:tags_file, ':h')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 execute "chdir " . l:work_dir
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 try
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 " Build the command line.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 let l:cmd = s:get_execute_cmd() . s:runner_exe
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
275 let l:cmd .= ' -e "' . g:autotags_executable . '"'
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
276 let l:cmd .= ' -t "' . fnamemodify(l:tags_file, ':t') . '"'
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 if a:write_mode == 0 && filereadable(l:tags_file)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 " CTags specifies paths relative to the tags file with a `./`
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 " prefix, so we need to specify the same prefix otherwise it will
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 " think those are different files and we'll end up with duplicate
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 " entries.
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 let l:rel_path = s:normalizepath('./' . expand('%:.'))
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
283 let l:cmd .= ' -s "' . l:rel_path . '"'
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 endif
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
285 for ign in split(&wildignore, ',')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
286 let l:cmd .= ' -x ' . ign
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
287 endfor
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
288 for exc in g:autotags_exclude
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
289 let l:cmd .= ' -x ' . exc
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
290 endfor
11
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
291 if g:autotags_pause_after_update
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
292 let l:cmd .= ' -p'
478638833c3b Fix Win32 update script, add option to pause it.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
293 endif
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 if g:autotags_trace
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
295 if has('win32')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
296 let l:cmd .= ' -l "' . fnamemodify(l:tags_file, ':t') . '.log"'
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
297 else
9
f0f1d20d6f5c On Unix, either log to file or don't log at all.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
298 let l:cmd .= ' > "' . fnamemodify(l:tags_file, ':t') . '.log" 2>&1'
f0f1d20d6f5c On Unix, either log to file or don't log at all.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
299 endif
f0f1d20d6f5c On Unix, either log to file or don't log at all.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
300 else
f0f1d20d6f5c On Unix, either log to file or don't log at all.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
301 if !has('win32')
f0f1d20d6f5c On Unix, either log to file or don't log at all.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
302 let l:cmd .= ' > /dev/null 2>&1'
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
303 endif
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 endif
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
305 let l:cmd .= s:get_execute_cmd_suffix()
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
306
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
307 " Run the background process.
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 call s:trace("Running: " . l:cmd)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 call s:trace("In: " . l:work_dir)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 if !g:autotags_fake
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
311 " Flag this tags file as being in progress
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
312 call add(s:maybe_in_progress, fnamemodify(l:tags_file, ':p'))
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
313
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 if !g:autotags_trace
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 silent execute l:cmd
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 execute l:cmd
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 call s:trace("(fake... not actually running)")
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 call s:trace("")
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 finally
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 " Restore the current directory...
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 execute "chdir " . l:prev_cwd
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 endtry
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 " Manual Tagfile Generation {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 function! s:generate_tags(bang, ...) abort
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 call s:update_tags(1, 0, a:1)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 command! -bang -nargs=1 -complete=file AutotagsGenerate :call s:generate_tags(<bang>0, <f-args>)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
341 " Toggles and Miscellaneous Commands {{{
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 command! AutotagsToggleEnabled :let g:autotags_enabled=!g:autotags_enabled
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 command! AutotagsToggleTrace :call autotags#trace()
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 command! AutotagsUnlock :call delete(b:autotags_file . '.lock')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346
10
b853ad0e7afd Only define `:AutotagsToggleFake` if debug mode is on.
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
347 if g:autotags_debug
b853ad0e7afd Only define `:AutotagsToggleFake` if debug mode is on.
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
348 command! AutotagsToggleFake :call autotags#fake()
b853ad0e7afd Only define `:AutotagsToggleFake` if debug mode is on.
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
349 endif
b853ad0e7afd Only define `:AutotagsToggleFake` if debug mode is on.
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
350
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 " Autoload Functions {{{
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 function! autotags#rescan(...)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 if exists('b:autotags_file')
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 unlet b:autotags_file
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 if a:0 && a:1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 let l:trace_backup = g:autotags_trace
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 let l:autotags_trace = 1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 call s:setup_autotags()
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 if a:0 && a:1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 let g:autotags_trace = l:trace_backup
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369 function! autotags#trace(...)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
370 let g:autotags_trace = !g:autotags_trace
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
371 if a:0 > 0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
372 let g:autotags_trace = a:1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374 if g:autotags_trace
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375 echom "autotags: Tracing is enabled."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 echom "autotags: Tracing is disabled."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 echom ""
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
381
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
382 function! autotags#fake(...)
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383 let g:autotags_fake = !g:autotags_fake
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 if a:0 > 0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 let g:autotags_fake = a:1
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 if g:autotags_fake
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 echom "autotags: Now faking autotags."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 else
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390 echom "autotags: Now running autotags for real."
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 endif
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 echom ""
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 endfunction
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
395 function! autotags#inprogress()
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
396 echom "autotags: generations in progress:"
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
397 for mip in s:maybe_in_progress
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
398 echom mip
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
399 endfor
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
400 echom ""
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
401 endfunction
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
402
0
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 " }}}
a3a37124558b Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404
3
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
405 " Statusline Functions {{{
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
406
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
407 " Prints whether a tag file is being generated right now for the current
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
408 " buffer in the status line.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
409 "
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
410 " Arguments can be passed:
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
411 " - args 1 and 2 are the prefix and suffix, respectively, of whatever output,
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
412 " if any, is going to be produced.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
413 " (defaults to empty strings)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
414 " - arg 3 is the text to be shown if tags are currently being generated.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
415 " (defaults to 'TAGS')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
416 "
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
417 function! autotags#statusline(...) abort
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
418 if !exists('b:autotags_file')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
419 " This buffer doesn't have autotags.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
420 return ''
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
421 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
422
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
423 " Figure out what the user is customizing.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
424 let l:gen_msg = 'TAGS'
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
425 if a:0 >= 0
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
426 let l:gen_msg = a:1
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
427 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
428
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
429 " To make this function as fast as possible, we first check whether the
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
430 " current buffer's tags file is 'maybe' being generated. This provides a
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
431 " nice and quick bail out for 99.9% of cases before we need to this the
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
432 " file-system to check the lock file.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
433 let l:abs_tag_file = fnamemodify(b:autotags_file, ':p')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
434 let l:found = index(s:maybe_in_progress, l:abs_tag_file)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
435 if l:found < 0
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
436 return ''
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
437 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
438 " It's maybe generating! Check if the lock file is still there.
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
439 if !filereadable(l:abs_tag_file . '.lock')
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
440 call remove(s:maybe_in_progress, l:found)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
441 return ''
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
442 endif
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
443 " It's still there! So probably `ctags` is still running...
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
444 " (although there's a chance it crashed, or the script had a problem, and
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
445 " the lock file has been left behind... we could try and run some
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
446 " additional checks here to see if it's legitimately running, and
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
447 " otherwise delete the lock file... maybe in the future...)
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
448 return l:gen_msg
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
449 endfunction
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
450
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
451 " }}}
60adce96ac2d Lots of changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
452