-
Notifications
You must be signed in to change notification settings - Fork 3
/
gtags.vim
431 lines (382 loc) · 13.9 KB
/
gtags.vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
" Copyright 2004 Google Inc.
" All Rights Reserved.
"
" This program is free software; you can redistribute it and/or
" modify it under the terms of the GNU General Public License
" as published by the Free Software Foundation; either version 2
" of the License, or (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program; if not, write to the Free Software
" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"
"
" Vim script for handling google tags. Note that it depends on
" gtags_vim.py, and requires a vim executable with python support
" compiled in.
"
" $Id: //depot/opensource/gtags/gtags.vim#5 $
"
" Author: Laurence Gonsalves ([email protected])
" Leandro Groisman ([email protected])
"
" Tip: you might want to map CTRL-] to use Gtag. You can do that like
" this:
" nmap <C-]> :call Gtag(expand('<cword>'))<CR>
" Set Vim compatibility for this script
let s:cpo_save = &cpo
set cpo&vim
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Configuration variables - you can override these in your .vimrc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if ! exists('g:google_tags_corpus')
let g:google_tags_corpus = 'google3'
endif
if ! exists('g:google_tags_default_filetype')
let g:google_tags_default_filetype = 'c++'
endif
" Set the proxy(e.g.: proxy:port) if you need to access gtags server via proxy.
if ! exists('g:google_tags_proxy')
let g:google_tags_proxy = ''
endif
" GTags mixer settings. Set g:google_tags_user_mixer to 1 to enable mixer.
if ! exists('g:google_tags_use_mixer')
let g:google_tags_use_mixer = 1
endif
if ! exists('g:google_tags_mixer_port')
let g:google_tags_mixer_port = 2220
endif
" Gtlist format: 'long' for 2-line or 'short' for 1-line
if ! exists('g:google_tags_list_format')
let g:google_tags_list_format = 'short'
endif
" Gtlist height in lines, or empty string to split window equally
if ! exists('g:google_tags_list_height')
let g:google_tags_list_height = ''
endif
if ! exists('g:google_tags_list_orientation')
let g:google_tags_list_orientation = 'horizontal'
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Setup
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" create temp tags file - we'll rewrite this whenever GtagWrite is
" called. Note that we add it to the *end* of the tags search path, so a
" local tags file takes precedence
let g:google_tags = tempname()
call system('touch ' . g:google_tags)
exe 'set tags+=' . g:google_tags
let g:google_grep = tempname()
call system('touch ' . g:google_grep)
let g:google_tags_pydir = expand('<sfile>:p:h')
let g:google_tags_vimfile = expand('<sfile>')
let g:google_tags_initialized = 0
" Lazy loading of python code to avoid slow vim startup times
function! GtagInitialize()
if ! g:google_tags_initialized
exe 'pyfile ' . substitute(g:google_tags_vimfile, '\.vim$', '_vim', '') . '.py'
augroup gtags
autocmd BufReadCmd gtags://* py ReadGtagsFile()
augroup end
endif
let g:google_tags_initialized = 1
endfunction
""""""""""""""""""""""""""""""""
" define python helper functions
""""""""""""""""""""""""""""""""
function! GtagWriteExactMatch(name)
call GtagInitialize()
python WriteTagFileExact(vim.eval('a:name'))
endfunction
function! GtagWriteRegExpMatch(name)
call GtagInitialize()
python WriteTagFileRegExp(vim.eval('a:name'))
endfunction
function! GtagWriteSnippetMatch(name)
call GtagInitialize()
python WriteTagFileSnippets(vim.eval('a:name'))
endfunction
function! GtagWriteExactMatch_callers(name)
call GtagInitialize()
python WriteTagFileExact_callers(vim.eval('a:name'))
endfunction
function! GtagWriteRegExpMatch_callers(name)
call GtagInitialize()
python WriteTagFileRegExp_callers(vim.eval('a:name'))
endfunction
function! GtagWriteSnippetMatch_callers(name)
call GtagInitialize()
python WriteTagFileSnippets_callers(vim.eval('a:name'))
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Functions for displaying a list of results (from Gtlist, etc).
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let g:google_tags_list_buffer = '__GTags__'
" Set up options, input mappings and highlighting for the GTags list window.
function! s:SetListWindowOptions()
setlocal buftype=nofile
setlocal bufhidden=delete
setlocal noswapfile
setlocal nobuflisted
setlocal nonumber
setlocal noro
if v:version >= 700
setlocal cursorline
endif
nnoremap <buffer> <silent> <CR> :py OpenListTag(close=1,use_stack=1)<CR>
nnoremap <buffer> <silent> <S-CR> :py OpenListTag(split=1, close=1)<CR>
nnoremap <buffer> <silent> v :py OpenListTag()<CR><C-W>p
nnoremap <buffer> <silent> s :py OpenListTag(split=1)<CR><C-W>p
nnoremap <buffer> <silent> e :py OpenListTag()<CR>
nnoremap <buffer> <silent> <S-e> :py OpenListTag(split=1)<CR>
nnoremap <buffer> <silent> <2-LeftMouse> :py OpenListTag()<CR>
nnoremap <buffer> <silent> <MiddleMouse> <LeftMouse>:py OpenListTag(split=1)<CR>
nnoremap <buffer> <silent> q :close<CR>
if has('syntax')
syntax match gtagsFile /^[^|]*/ nextgroup=gtagsSeparator
syntax match gtagsSeparator /|/ contained nextgroup=gtagsLine
syntax match gtagsLine /[0-9]*/ contained
highlight link gtagsFile Directory
highlight link gtagsLine LineNr
endif
endfunction
" Switch to the GTags list window, creating it and its buffer if necessary.
function! s:SwitchToListWindow()
let buf = g:google_tags_list_buffer
let height = g:google_tags_list_height
let vert = (g:google_tags_list_orientation == 'vertical') ? 'vertical' : ''
" If the window exists, just jump to it
if bufwinnr(buf) != -1
exe bufwinnr(buf) . 'wincmd w'
return
endif
" Create a window, using the previous buffer number if a buffer
" exists or creating a new buffer otherwise.
if bufnr(buf) != -1
exe 'silent! bo ' . height . ' ' . vert . ' split +buffer' . bufnr(buf)
else
exe 'silent! bo ' . height . ' ' . vert . ' split ' . buf
endif
call s:SetListWindowOptions()
endfunction
" Display a list with the results of the given find-tags function.
function! GtagList(findFunction, name)
call GtagInitialize()
exe 'python GtagList(' . a:findFunction . '(vim.eval("a:name")))'
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Public functions/command
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" position the cursor under the word and add it to the current
" search list
function! s:MoveCursor(name)
endfunction
"""""""""""""""""""""
" Completion function
"""""""""""""""""""""
function! Gtag_complete(ArgLead, CmdLine, CursorPos)
call GtagInitialize()
python GtagComplete()
return r
endfunction
""""""""""""""""""""
" Commands like tag
""""""""""""""""""""
" Exact matches
function! Gtag(name)
call GtagWriteExactMatch(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtag call Gtag("<args>")
" regexp matches
function! Gtagregexp(name)
call GtagWriteRegExpMatch(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtagregexp call Gtagregexp("<args>")
" snippet matches
function! Gtagsnippet(name)
call GtagWriteSnippetMatch(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtagsnippet call Gtagsnippet("<args>")
" Exact matches - callers
function! Gtagcallers(name)
call GtagWriteExactMatch_callers(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtagcallers call Gtagcallers("<args>")
" regexp matches - callers
function! Gtagregexpcallers(name)
call GtagWriteRegExpMatch_callers(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtagregexpcallers call Gtagregexpcallers("<args>")
" snippet matches - callers
function! Gtagsnippetcallers(name)
call GtagWriteSnippetMatch_callers(a:name)
exe 'ta ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtagsnippetcallers call Gtagsnippetcallers("<args>")
""""""""""""""""""""""
" Command like tselect
""""""""""""""""""""""
" Exact matches
" TODO: doesn't support no-arg version like tselect
function! Gtselect(name)
call GtagWriteExactMatch(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselect call Gtselect("<args>")
" regexp matches
function! Gtselectregexp(name)
call GtagWriteRegExpMatch(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselectregexp call Gtselectregexp("<args>")
" snippet matches
function! Gtselectsnippet(name)
call GtagWriteSnippetMatch(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselectsnippet call Gtselectsnippet("<args>")
" Exact matches - callers
function! Gtselectcallers(name)
call GtagWriteExactMatch_callers(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselectcallers call Gtselectcallers("<args>")
" regexp matches - callers
function! Gtselectregexpcallers(name)
call GtagWriteRegExpMatch_callers(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselectregexpcallers call Gtselectregexpcallers("<args>")
" snippet matches - callers
function! Gtselectsnippetcallers(name)
call GtagWriteSnippetMatch_callers(a:name)
exe 'ts ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtselectsnippetcallers call Gtselectsnippetcallers("<args>")
""""""""""""""""""""
" Command like tjump
""""""""""""""""""""
" Exact matches
" TODO: doesn't support no-arg version like tjump
function! Gtjump(name)
call GtagWriteExactMatch(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjump call Gtjump("<args>")
" regexp matches
function! Gtjumpregexp(name)
call GtagWriteRegExpMatch(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjumpregexp call Gtjumpregexp("<args>")
" snippet matches
function! Gtjumpsnippet(name)
call GtagWriteSnippetMatch(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjumpsnippet call Gtjumpsnippet("<args>")
" Exact matches - callers
function! Gtjumpcallers(name)
call GtagWriteExactMatch_callers(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjumpcallers call Gtjumpcallers("<args>")
" regexp matches - callers
function! Gtjumpregexpcallers(name)
call GtagWriteRegExpMatch_callers(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjumpregexpcallers call Gtjumpregexpcallers("<args>")
" snippet matches - callers
function! Gtjumpsnippetcallers(name)
call GtagWriteSnippetMatch_callers(a:name)
exe 'tj ' . a:name
call s:MoveCursor(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtjumpsnippetcallers call Gtjumpsnippetcallers("<args>")
""""""""""""""""""""
" sort of like :grep, except that the search is done in gtags, rather
" than in files you specify.
function! Gtgrep(pattern)
call GtagInitialize()
python Gtgrep()
" save options
let errorformat=&errorformat
" load
let &errorformat='%f|%l|%m'
copen
exe 'cgetfile ' . g:google_grep
" restore options
let &errorformat=errorformat
endfunction
command! -nargs=1 -complete=custom,Gtag_complete Gtgrep call Gtgrep("<args>")
""""""""""""""""""""
" Commands for displaying a list of results in the GTags list window
command! -nargs=1 -complete=custom,Gtag_complete Gtlist
\ call GtagList("FindExactTag", "<args>")
command! -nargs=1 -complete=custom,Gtag_complete Gtlistregexp
\ call GtagList("FindTagByPattern", "<args>")
command! -nargs=1 -complete=custom,Gtag_complete Gtlistsnippet
\ call GtagList("SearchTagSnippets", "<args>")
command! -nargs=1 -complete=custom,Gtag_complete Gtlistcallers
\ call GtagList("FindExactTagCallers", "<args>")
command! -nargs=1 -complete=custom,Gtag_complete Gtlistregexpcallers
\ call GtagList("FindTagCallersByPattern", "<args>")
command! -nargs=1 -complete=custom,Gtag_complete Gtlistsnippetcallers
\ call GtagList("SearchTagCallersSnippets", "<args>")
""""""""""""""""""""
" Restart GTags mixer
function! Gtrestartmixer()
call GtagInitialize()
py RestartMixer()
endfunction
command! -nargs=0 Gtrestartmixer call Gtrestartmixer()
""""""""""""""""""""
" Set GTags corpus
command! -nargs=1 Gtcorpus let g:google_tags_corpus="<args>"
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" These are for backwards compatibility with the messed up
" capitalization I used before
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! GTag(name)
call Gtag(a:name)
endfunction
function! GTJump(name)
call Gtjump(a:name)
endfunction
function! GTSelect(name)
call Gtselect(a:name)
endfunction
command! -nargs=1 -complete=custom,Gtag_complete GTag call Gtag("<args>")
command! -nargs=1 -complete=custom,Gtag_complete GTJump call Gtjump("<args>")
command! -nargs=1 -complete=custom,Gtag_complete GTSelect call Gtselect("<args>")
" Restore user's compatibility options
let &cpo = s:cpo_save
unlet s:cpo_save