utils 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/Rakefile +68 -0
  2. data/VERSION +1 -0
  3. data/bin/chroot-exec +12 -0
  4. data/bin/chroot-libs +18 -0
  5. data/bin/classify +37 -0
  6. data/bin/discover +137 -0
  7. data/bin/edit +74 -0
  8. data/bin/errf +32 -0
  9. data/bin/git-empty +8 -0
  10. data/bin/myex +90 -0
  11. data/bin/number_files +26 -0
  12. data/bin/same_files +37 -0
  13. data/bin/search +205 -0
  14. data/bin/sedit +3 -0
  15. data/bin/sshscreen +68 -0
  16. data/bin/term +21 -0
  17. data/bin/unquarantine_apps +8 -0
  18. data/bin/untest +17 -0
  19. data/bin/utils-install-config +10 -0
  20. data/bin/vacuum_firefox_sqlite +22 -0
  21. data/bin/xmp +74 -0
  22. data/lib/utils.rb +8 -0
  23. data/lib/utils/config.rb +23 -0
  24. data/lib/utils/config/gdb/asm +179 -0
  25. data/lib/utils/config/gdb/ruby +528 -0
  26. data/lib/utils/config/gdbinit +8 -0
  27. data/lib/utils/config/irbrc +455 -0
  28. data/lib/utils/config/rdebugrc +2 -0
  29. data/lib/utils/config/screenrc +143 -0
  30. data/lib/utils/config/vim/autoload/Align.vim +1029 -0
  31. data/lib/utils/config/vim/autoload/AlignMaps.vim +330 -0
  32. data/lib/utils/config/vim/autoload/rails.vim +4744 -0
  33. data/lib/utils/config/vim/autoload/rubycomplete.vim +801 -0
  34. data/lib/utils/config/vim/autoload/sqlcomplete.vim +741 -0
  35. data/lib/utils/config/vim/autoload/vimball.vim +750 -0
  36. data/lib/utils/config/vim/colors/flori.vim +113 -0
  37. data/lib/utils/config/vim/compiler/eruby.vim +40 -0
  38. data/lib/utils/config/vim/compiler/ruby.vim +67 -0
  39. data/lib/utils/config/vim/compiler/rubyunit.vim +34 -0
  40. data/lib/utils/config/vim/ftdetect/ragel.vim +2 -0
  41. data/lib/utils/config/vim/ftdetect/ruby.vim +17 -0
  42. data/lib/utils/config/vim/ftplugin/eruby.vim +100 -0
  43. data/lib/utils/config/vim/ftplugin/ruby.vim +260 -0
  44. data/lib/utils/config/vim/ftplugin/xml.vim +941 -0
  45. data/lib/utils/config/vim/indent/IndentAnything_html.vim +35 -0
  46. data/lib/utils/config/vim/indent/eruby.vim +77 -0
  47. data/lib/utils/config/vim/indent/javascript.vim +116 -0
  48. data/lib/utils/config/vim/indent/ruby.vim +377 -0
  49. data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +242 -0
  50. data/lib/utils/config/vim/plugin/AlignPlugin.vim +41 -0
  51. data/lib/utils/config/vim/plugin/Decho.vim +592 -0
  52. data/lib/utils/config/vim/plugin/IndentAnything.vim +675 -0
  53. data/lib/utils/config/vim/plugin/bufexplorer.vim +1144 -0
  54. data/lib/utils/config/vim/plugin/cecutil.vim +482 -0
  55. data/lib/utils/config/vim/plugin/fugitive.vim +1703 -0
  56. data/lib/utils/config/vim/plugin/lusty-explorer.vim +1509 -0
  57. data/lib/utils/config/vim/plugin/rails.vim +340 -0
  58. data/lib/utils/config/vim/plugin/rubyextra.vim +193 -0
  59. data/lib/utils/config/vim/plugin/surround.vim +628 -0
  60. data/lib/utils/config/vim/plugin/taglist.vim +4546 -0
  61. data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +131 -0
  62. data/lib/utils/config/vim/plugin/vimballPlugin.vim +40 -0
  63. data/lib/utils/config/vim/syntax/Decho.vim +101 -0
  64. data/lib/utils/config/vim/syntax/eruby.vim +73 -0
  65. data/lib/utils/config/vim/syntax/javascript.vim +246 -0
  66. data/lib/utils/config/vim/syntax/ragel.vim +165 -0
  67. data/lib/utils/config/vim/syntax/ruby.vim +367 -0
  68. data/lib/utils/config/vimrc +461 -0
  69. data/lib/utils/file.rb +49 -0
  70. data/lib/utils/find.rb +54 -0
  71. data/lib/utils/md5.rb +23 -0
  72. data/lib/utils/patterns.rb +34 -0
  73. data/lib/utils/version.rb +8 -0
  74. data/utils.gemspec +33 -0
  75. metadata +183 -0
@@ -0,0 +1,4546 @@
1
+ " File: taglist.vim
2
+ " Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
3
+ " Version: 4.5
4
+ " Last Modified: September 21, 2007
5
+ " Copyright: Copyright (C) 2002-2007 Yegappan Lakshmanan
6
+ " Permission is hereby granted to use and distribute this code,
7
+ " with or without modifications, provided that this copyright
8
+ " notice is copied with it. Like anything else that's free,
9
+ " taglist.vim is provided *as is* and comes with no warranty of any
10
+ " kind, either expressed or implied. In no event will the copyright
11
+ " holder be liable for any damamges resulting from the use of this
12
+ " software.
13
+ "
14
+ " The "Tag List" plugin is a source code browser plugin for Vim and provides
15
+ " an overview of the structure of the programming language files and allows
16
+ " you to efficiently browse through source code files for different
17
+ " programming languages. You can visit the taglist plugin home page for more
18
+ " information:
19
+ "
20
+ " http://vim-taglist.sourceforge.net
21
+ "
22
+ " You can subscribe to the taglist mailing list to post your questions
23
+ " or suggestions for improvement or to report bugs. Visit the following
24
+ " page for subscribing to the mailing list:
25
+ "
26
+ " http://groups.yahoo.com/group/taglist/
27
+ "
28
+ " For more information about using this plugin, after installing the
29
+ " taglist plugin, use the ":help taglist" command.
30
+ "
31
+ " Installation
32
+ " ------------
33
+ " 1. Download the taglist.zip file and unzip the files to the $HOME/.vim
34
+ " or the $HOME/vimfiles or the $VIM/vimfiles directory. This should
35
+ " unzip the following two files (the directory structure should be
36
+ " preserved):
37
+ "
38
+ " plugin/taglist.vim - main taglist plugin file
39
+ " doc/taglist.txt - documentation (help) file
40
+ "
41
+ " Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath'
42
+ " Vim help pages for more details about installing Vim plugins.
43
+ " 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or
44
+ " $VIM/vimfiles/doc directory, start Vim and run the ":helptags ."
45
+ " command to process the taglist help file.
46
+ " 3. If the exuberant ctags utility is not present in your PATH, then set the
47
+ " Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags
48
+ " utility (not to the directory) in the .vimrc file.
49
+ " 4. If you are running a terminal/console version of Vim and the
50
+ " terminal doesn't support changing the window width then set the
51
+ " 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file.
52
+ " 5. Restart Vim.
53
+ " 6. You can now use the ":TlistToggle" command to open/close the taglist
54
+ " window. You can use the ":help taglist" command to get more
55
+ " information about using the taglist plugin.
56
+ "
57
+ " ****************** Do not modify after this line ************************
58
+
59
+ " Line continuation used here
60
+ let s:cpo_save = &cpo
61
+ set cpo&vim
62
+
63
+ if !exists('loaded_taglist')
64
+ " First time loading the taglist plugin
65
+ "
66
+ " To speed up the loading of Vim, the taglist plugin uses autoload
67
+ " mechanism to load the taglist functions.
68
+ " Only define the configuration variables, user commands and some
69
+ " auto-commands and finish sourcing the file
70
+
71
+ " The taglist plugin requires the built-in Vim system() function. If this
72
+ " function is not available, then don't load the plugin.
73
+ if !exists('*system')
74
+ "echomsg 'Taglist: Vim system() built-in function is not available. ' .
75
+ " \ 'Plugin is not loaded.'
76
+ let loaded_taglist = 'no'
77
+ let &cpo = s:cpo_save
78
+ finish
79
+ endif
80
+
81
+ " Location of the exuberant ctags tool
82
+ if !exists('Tlist_Ctags_Cmd')
83
+ if executable('exuberant-ctags')
84
+ " On Debian Linux, exuberant ctags is installed
85
+ " as exuberant-ctags
86
+ let Tlist_Ctags_Cmd = 'exuberant-ctags'
87
+ elseif executable('exctags')
88
+ " On Free-BSD, exuberant ctags is installed as exctags
89
+ let Tlist_Ctags_Cmd = 'exctags'
90
+ elseif executable('ctags')
91
+ let Tlist_Ctags_Cmd = 'ctags'
92
+ elseif executable('ctags.exe')
93
+ let Tlist_Ctags_Cmd = 'ctags.exe'
94
+ elseif executable('tags')
95
+ let Tlist_Ctags_Cmd = 'tags'
96
+ else
97
+ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' .
98
+ \ 'not found in PATH. Plugin is not loaded.'
99
+ " Skip loading the plugin
100
+ let loaded_taglist = 'no'
101
+ let &cpo = s:cpo_save
102
+ finish
103
+ endif
104
+ endif
105
+
106
+
107
+ " Automatically open the taglist window on Vim startup
108
+ if !exists('Tlist_Auto_Open')
109
+ let Tlist_Auto_Open = 0
110
+ endif
111
+
112
+ " When the taglist window is toggle opened, move the cursor to the
113
+ " taglist window
114
+ if !exists('Tlist_GainFocus_On_ToggleOpen')
115
+ let Tlist_GainFocus_On_ToggleOpen = 0
116
+ endif
117
+
118
+ " Process files even when the taglist window is not open
119
+ if !exists('Tlist_Process_File_Always')
120
+ let Tlist_Process_File_Always = 0
121
+ endif
122
+
123
+ if !exists('Tlist_Show_Menu')
124
+ let Tlist_Show_Menu = 0
125
+ endif
126
+
127
+ " Tag listing sort type - 'name' or 'order'
128
+ if !exists('Tlist_Sort_Type')
129
+ let Tlist_Sort_Type = 'order'
130
+ endif
131
+
132
+ " Tag listing window split (horizontal/vertical) control
133
+ if !exists('Tlist_Use_Horiz_Window')
134
+ let Tlist_Use_Horiz_Window = 0
135
+ endif
136
+
137
+ " Open the vertically split taglist window on the left or on the right
138
+ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to
139
+ " zero (i.e. only for vertically split windows)
140
+ if !exists('Tlist_Use_Right_Window')
141
+ let Tlist_Use_Right_Window = 0
142
+ endif
143
+
144
+ " Increase Vim window width to display vertically split taglist window.
145
+ " For MS-Windows version of Vim running in a MS-DOS window, this must be
146
+ " set to 0 otherwise the system may hang due to a Vim limitation.
147
+ if !exists('Tlist_Inc_Winwidth')
148
+ if (has('win16') || has('win95')) && !has('gui_running')
149
+ let Tlist_Inc_Winwidth = 0
150
+ else
151
+ let Tlist_Inc_Winwidth = 1
152
+ endif
153
+ endif
154
+
155
+ " Vertically split taglist window width setting
156
+ if !exists('Tlist_WinWidth')
157
+ let Tlist_WinWidth = 30
158
+ endif
159
+
160
+ " Horizontally split taglist window height setting
161
+ if !exists('Tlist_WinHeight')
162
+ let Tlist_WinHeight = 10
163
+ endif
164
+
165
+ " Display tag prototypes or tag names in the taglist window
166
+ if !exists('Tlist_Display_Prototype')
167
+ let Tlist_Display_Prototype = 0
168
+ endif
169
+
170
+ " Display tag scopes in the taglist window
171
+ if !exists('Tlist_Display_Tag_Scope')
172
+ let Tlist_Display_Tag_Scope = 1
173
+ endif
174
+
175
+ " Use single left mouse click to jump to a tag. By default this is disabled.
176
+ " Only double click using the mouse will be processed.
177
+ if !exists('Tlist_Use_SingleClick')
178
+ let Tlist_Use_SingleClick = 0
179
+ endif
180
+
181
+ " Control whether additional help is displayed as part of the taglist or
182
+ " not. Also, controls whether empty lines are used to separate the tag
183
+ " tree.
184
+ if !exists('Tlist_Compact_Format')
185
+ let Tlist_Compact_Format = 0
186
+ endif
187
+
188
+ " Exit Vim if only the taglist window is currently open. By default, this is
189
+ " set to zero.
190
+ if !exists('Tlist_Exit_OnlyWindow')
191
+ let Tlist_Exit_OnlyWindow = 0
192
+ endif
193
+
194
+ " Automatically close the folds for the non-active files in the taglist
195
+ " window
196
+ if !exists('Tlist_File_Fold_Auto_Close')
197
+ let Tlist_File_Fold_Auto_Close = 0
198
+ endif
199
+
200
+ " Close the taglist window when a tag is selected
201
+ if !exists('Tlist_Close_On_Select')
202
+ let Tlist_Close_On_Select = 0
203
+ endif
204
+
205
+ " Automatically update the taglist window to display tags for newly
206
+ " edited files
207
+ if !exists('Tlist_Auto_Update')
208
+ let Tlist_Auto_Update = 1
209
+ endif
210
+
211
+ " Automatically highlight the current tag
212
+ if !exists('Tlist_Auto_Highlight_Tag')
213
+ let Tlist_Auto_Highlight_Tag = 1
214
+ endif
215
+
216
+ " Automatically highlight the current tag on entering a buffer
217
+ if !exists('Tlist_Highlight_Tag_On_BufEnter')
218
+ let Tlist_Highlight_Tag_On_BufEnter = 1
219
+ endif
220
+
221
+ " Enable fold column to display the folding for the tag tree
222
+ if !exists('Tlist_Enable_Fold_Column')
223
+ let Tlist_Enable_Fold_Column = 1
224
+ endif
225
+
226
+ " Display the tags for only one file in the taglist window
227
+ if !exists('Tlist_Show_One_File')
228
+ let Tlist_Show_One_File = 0
229
+ endif
230
+
231
+ if !exists('Tlist_Max_Submenu_Items')
232
+ let Tlist_Max_Submenu_Items = 20
233
+ endif
234
+
235
+ if !exists('Tlist_Max_Tag_Length')
236
+ let Tlist_Max_Tag_Length = 10
237
+ endif
238
+
239
+ " Do not change the name of the taglist title variable. The winmanager
240
+ " plugin relies on this name to determine the title for the taglist
241
+ " plugin.
242
+ let TagList_title = "__Tag_List__"
243
+
244
+ " Taglist debug messages
245
+ let s:tlist_msg = ''
246
+
247
+ " Define the taglist autocommand to automatically open the taglist window
248
+ " on Vim startup
249
+ if g:Tlist_Auto_Open
250
+ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open()
251
+ endif
252
+
253
+ " Refresh the taglist
254
+ if g:Tlist_Process_File_Always
255
+ autocmd BufEnter * call s:Tlist_Refresh()
256
+ endif
257
+
258
+ if g:Tlist_Show_Menu
259
+ autocmd GUIEnter * call s:Tlist_Menu_Init()
260
+ endif
261
+
262
+ " When the taglist buffer is created when loading a Vim session file,
263
+ " the taglist buffer needs to be initialized. The BufFilePost event
264
+ " is used to handle this case.
265
+ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load()
266
+
267
+ " Define the user commands to manage the taglist window
268
+ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle()
269
+ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open()
270
+ " For backwards compatiblity define the Tlist command
271
+ command! -nargs=0 -bar Tlist TlistToggle
272
+ command! -nargs=+ -complete=file TlistAddFiles
273
+ \ call s:Tlist_Add_Files(<f-args>)
274
+ command! -nargs=+ -complete=dir TlistAddFilesRecursive
275
+ \ call s:Tlist_Add_Files_Recursive(<f-args>)
276
+ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close()
277
+ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File()
278
+ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag(
279
+ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1)
280
+ " For backwards compatiblity define the TlistSync command
281
+ command! -nargs=0 -bar TlistSync TlistHighlightTag
282
+ command! -nargs=* -complete=buffer TlistShowPrototype
283
+ \ echo Tlist_Get_Tag_Prototype_By_Line(<f-args>)
284
+ command! -nargs=* -complete=buffer TlistShowTag
285
+ \ echo Tlist_Get_Tagname_By_Line(<f-args>)
286
+ command! -nargs=* -complete=file TlistSessionLoad
287
+ \ call s:Tlist_Session_Load(<q-args>)
288
+ command! -nargs=* -complete=file TlistSessionSave
289
+ \ call s:Tlist_Session_Save(<q-args>)
290
+ command! -bar TlistLock let Tlist_Auto_Update=0
291
+ command! -bar TlistUnlock let Tlist_Auto_Update=1
292
+
293
+ " Commands for enabling/disabling debug and to display debug messages
294
+ command! -nargs=? -complete=file -bar TlistDebug
295
+ \ call s:Tlist_Debug_Enable(<q-args>)
296
+ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable()
297
+ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show()
298
+
299
+ " Define autocommands to autoload the taglist plugin when needed.
300
+
301
+ " Trick to get the current script ID
302
+ map <SID>xx <SID>xx
303
+ let s:tlist_sid = substitute(maparg('<SID>xx'), '<SNR>\(\d\+_\)xx$',
304
+ \ '\1', '')
305
+ unmap <SID>xx
306
+
307
+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' .
308
+ \ escape(expand('<sfile>'), ' ')
309
+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' .
310
+ \ escape(expand('<sfile>'), ' ')
311
+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' .
312
+ \ escape(expand('<sfile>'), ' ')
313
+ exe 'autocmd FuncUndefined Tlist_* source ' .
314
+ \ escape(expand('<sfile>'), ' ')
315
+ exe 'autocmd FuncUndefined TagList_* source ' .
316
+ \ escape(expand('<sfile>'), ' ')
317
+
318
+ let loaded_taglist = 'fast_load_done'
319
+
320
+ if g:Tlist_Show_Menu && has('gui_running')
321
+ call s:Tlist_Menu_Init()
322
+ endif
323
+
324
+ " restore 'cpo'
325
+ let &cpo = s:cpo_save
326
+ finish
327
+ endif
328
+
329
+ if !exists('s:tlist_sid')
330
+ " Two or more versions of taglist plugin are installed. Don't
331
+ " load this version of the plugin.
332
+ finish
333
+ endif
334
+
335
+ unlet! s:tlist_sid
336
+
337
+ if loaded_taglist != 'fast_load_done'
338
+ " restore 'cpo'
339
+ let &cpo = s:cpo_save
340
+ finish
341
+ endif
342
+
343
+ " Taglist plugin functionality is available
344
+ let loaded_taglist = 'available'
345
+
346
+ "------------------- end of user configurable options --------------------
347
+
348
+ " Default language specific settings for supported file types and tag types
349
+ "
350
+ " Variable name format:
351
+ "
352
+ " s:tlist_def_{vim_ftype}_settings
353
+ "
354
+ " vim_ftype - Filetype detected by Vim
355
+ "
356
+ " Value format:
357
+ "
358
+ " <ctags_ftype>;<flag>:<name>;<flag>:<name>;...
359
+ "
360
+ " ctags_ftype - File type supported by exuberant ctags
361
+ " flag - Flag supported by exuberant ctags to generate a tag type
362
+ " name - Name of the tag type used in the taglist window to display the
363
+ " tags of this type
364
+ "
365
+
366
+ " assembly language
367
+ let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type'
368
+
369
+ " aspperl language
370
+ let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable'
371
+
372
+ " aspvbs language
373
+ let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable'
374
+
375
+ " awk language
376
+ let s:tlist_def_awk_settings = 'awk;f:function'
377
+
378
+ " beta language
379
+ let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern'
380
+
381
+ " c language
382
+ let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' .
383
+ \ 'v:variable;f:function'
384
+
385
+ " c++ language
386
+ let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' .
387
+ \ 'c:class;g:enum;s:struct;u:union;f:function'
388
+
389
+ " c# language
390
+ let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' .
391
+ \ 'E:event;g:enum;s:struct;i:interface;' .
392
+ \ 'p:properties;m:method'
393
+
394
+ " cobol language
395
+ let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' .
396
+ \ 'P:program;s:section'
397
+
398
+ " eiffel language
399
+ let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature'
400
+
401
+ " erlang language
402
+ let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function'
403
+
404
+ " expect (same as tcl) language
405
+ let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure'
406
+
407
+ " fortran language
408
+ let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' .
409
+ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' .
410
+ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine'
411
+
412
+ " HTML language
413
+ let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function'
414
+
415
+ " java language
416
+ let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
417
+ \ 'f:field;m:method'
418
+
419
+ " javascript language
420
+ let s:tlist_def_javascript_settings = 'javascript;f:function'
421
+
422
+ " lisp language
423
+ let s:tlist_def_lisp_settings = 'lisp;f:function'
424
+
425
+ " lua language
426
+ let s:tlist_def_lua_settings = 'lua;f:function'
427
+
428
+ " makefiles
429
+ let s:tlist_def_make_settings = 'make;m:macro'
430
+
431
+ " pascal language
432
+ let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure'
433
+
434
+ " perl language
435
+ let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine'
436
+
437
+ " php language
438
+ let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function'
439
+
440
+ " python language
441
+ let s:tlist_def_python_settings = 'python;c:class;m:member;f:function'
442
+
443
+ " rexx language
444
+ let s:tlist_def_rexx_settings = 'rexx;s:subroutine'
445
+
446
+ " ruby language
447
+ let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' .
448
+ \ 'm:singleton method'
449
+
450
+ " scheme language
451
+ let s:tlist_def_scheme_settings = 'scheme;s:set;f:function'
452
+
453
+ " shell language
454
+ let s:tlist_def_sh_settings = 'sh;f:function'
455
+
456
+ " C shell language
457
+ let s:tlist_def_csh_settings = 'sh;f:function'
458
+
459
+ " Z shell language
460
+ let s:tlist_def_zsh_settings = 'sh;f:function'
461
+
462
+ " slang language
463
+ let s:tlist_def_slang_settings = 'slang;n:namespace;f:function'
464
+
465
+ " sml language
466
+ let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' .
467
+ \ 'r:structure;t:type;v:value;f:function'
468
+
469
+ " sql language
470
+ let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' .
471
+ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure'
472
+
473
+ " tcl language
474
+ let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure'
475
+
476
+ " vera language
477
+ let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' .
478
+ \ 'f:function;g:enum;m:member;p:program;' .
479
+ \ 'P:prototype;t:task;T:typedef;v:variable;' .
480
+ \ 'x:externvar'
481
+
482
+ "verilog language
483
+ let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' .
484
+ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function'
485
+
486
+ " vim language
487
+ let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function'
488
+
489
+ " yacc language
490
+ let s:tlist_def_yacc_settings = 'yacc;l:label'
491
+
492
+ "------------------- end of language specific options --------------------
493
+
494
+ " Vim window size is changed by the taglist plugin or not
495
+ let s:tlist_winsize_chgd = -1
496
+ " Taglist window is maximized or not
497
+ let s:tlist_win_maximized = 0
498
+ " Name of files in the taglist
499
+ let s:tlist_file_names=''
500
+ " Number of files in the taglist
501
+ let s:tlist_file_count = 0
502
+ " Number of filetypes supported by taglist
503
+ let s:tlist_ftype_count = 0
504
+ " Is taglist part of other plugins like winmanager or cream?
505
+ let s:tlist_app_name = "none"
506
+ " Are we displaying brief help text
507
+ let s:tlist_brief_help = 1
508
+ " List of files removed on user request
509
+ let s:tlist_removed_flist = ""
510
+ " Index of current file displayed in the taglist window
511
+ let s:tlist_cur_file_idx = -1
512
+ " Taglist menu is empty or not
513
+ let s:tlist_menu_empty = 1
514
+
515
+ " An autocommand is used to refresh the taglist window when entering any
516
+ " buffer. We don't want to refresh the taglist window if we are entering the
517
+ " file window from one of the taglist functions. The 'Tlist_Skip_Refresh'
518
+ " variable is used to skip the refresh of the taglist window and is set
519
+ " and cleared appropriately.
520
+ let s:Tlist_Skip_Refresh = 0
521
+
522
+ " Tlist_Window_Display_Help()
523
+ function! s:Tlist_Window_Display_Help()
524
+ if s:tlist_app_name == "winmanager"
525
+ " To handle a bug in the winmanager plugin, add a space at the
526
+ " last line
527
+ call setline('$', ' ')
528
+ endif
529
+
530
+ if s:tlist_brief_help
531
+ " Add the brief help
532
+ call append(0, '" Press <F1> to display help text')
533
+ else
534
+ " Add the extensive help
535
+ call append(0, '" <enter> : Jump to tag definition')
536
+ call append(1, '" o : Jump to tag definition in new window')
537
+ call append(2, '" p : Preview the tag definition')
538
+ call append(3, '" <space> : Display tag prototype')
539
+ call append(4, '" u : Update tag list')
540
+ call append(5, '" s : Select sort field')
541
+ call append(6, '" d : Remove file from taglist')
542
+ call append(7, '" x : Zoom-out/Zoom-in taglist window')
543
+ call append(8, '" + : Open a fold')
544
+ call append(9, '" - : Close a fold')
545
+ call append(10, '" * : Open all folds')
546
+ call append(11, '" = : Close all folds')
547
+ call append(12, '" [[ : Move to the start of previous file')
548
+ call append(13, '" ]] : Move to the start of next file')
549
+ call append(14, '" q : Close the taglist window')
550
+ call append(15, '" <F1> : Remove help text')
551
+ endif
552
+ endfunction
553
+
554
+ " Tlist_Window_Toggle_Help_Text()
555
+ " Toggle taglist plugin help text between the full version and the brief
556
+ " version
557
+ function! s:Tlist_Window_Toggle_Help_Text()
558
+ if g:Tlist_Compact_Format
559
+ " In compact display mode, do not display help
560
+ return
561
+ endif
562
+
563
+ " Include the empty line displayed after the help text
564
+ let brief_help_size = 1
565
+ let full_help_size = 16
566
+
567
+ setlocal modifiable
568
+
569
+ " Set report option to a huge value to prevent informational messages
570
+ " while deleting the lines
571
+ let old_report = &report
572
+ set report=99999
573
+
574
+ " Remove the currently highlighted tag. Otherwise, the help text
575
+ " might be highlighted by mistake
576
+ match none
577
+
578
+ " Toggle between brief and full help text
579
+ if s:tlist_brief_help
580
+ let s:tlist_brief_help = 0
581
+
582
+ " Remove the previous help
583
+ exe '1,' . brief_help_size . ' delete _'
584
+
585
+ " Adjust the start/end line numbers for the files
586
+ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size)
587
+ else
588
+ let s:tlist_brief_help = 1
589
+
590
+ " Remove the previous help
591
+ exe '1,' . full_help_size . ' delete _'
592
+
593
+ " Adjust the start/end line numbers for the files
594
+ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size)
595
+ endif
596
+
597
+ call s:Tlist_Window_Display_Help()
598
+
599
+ " Restore the report option
600
+ let &report = old_report
601
+
602
+ setlocal nomodifiable
603
+ endfunction
604
+
605
+ " Taglist debug support
606
+ let s:tlist_debug = 0
607
+
608
+ " File for storing the debug messages
609
+ let s:tlist_debug_file = ''
610
+
611
+ " Tlist_Debug_Enable
612
+ " Enable logging of taglist debug messages.
613
+ function! s:Tlist_Debug_Enable(...)
614
+ let s:tlist_debug = 1
615
+
616
+ " Check whether a valid file name is supplied.
617
+ if a:1 != ''
618
+ let s:tlist_debug_file = fnamemodify(a:1, ':p')
619
+
620
+ " Empty the log file
621
+ exe 'redir! > ' . s:tlist_debug_file
622
+ redir END
623
+
624
+ " Check whether the log file is present/created
625
+ if !filewritable(s:tlist_debug_file)
626
+ call s:Tlist_Warning_Msg('Taglist: Unable to create log file '
627
+ \ . s:tlist_debug_file)
628
+ let s:tlist_debug_file = ''
629
+ endif
630
+ endif
631
+ endfunction
632
+
633
+ " Tlist_Debug_Disable
634
+ " Disable logging of taglist debug messages.
635
+ function! s:Tlist_Debug_Disable(...)
636
+ let s:tlist_debug = 0
637
+ let s:tlist_debug_file = ''
638
+ endfunction
639
+
640
+ " Tlist_Debug_Show
641
+ " Display the taglist debug messages in a new window
642
+ function! s:Tlist_Debug_Show()
643
+ if s:tlist_msg == ''
644
+ call s:Tlist_Warning_Msg('Taglist: No debug messages')
645
+ return
646
+ endif
647
+
648
+ " Open a new window to display the taglist debug messages
649
+ new taglist_debug.txt
650
+ " Delete all the lines (if the buffer already exists)
651
+ silent! %delete _
652
+ " Add the messages
653
+ silent! put =s:tlist_msg
654
+ " Move the cursor to the first line
655
+ normal! gg
656
+ endfunction
657
+
658
+ " Tlist_Log_Msg
659
+ " Log the supplied debug message along with the time
660
+ function! s:Tlist_Log_Msg(msg)
661
+ if s:tlist_debug
662
+ if s:tlist_debug_file != ''
663
+ exe 'redir >> ' . s:tlist_debug_file
664
+ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n"
665
+ redir END
666
+ else
667
+ " Log the message into a variable
668
+ " Retain only the last 3000 characters
669
+ let len = strlen(s:tlist_msg)
670
+ if len > 3000
671
+ let s:tlist_msg = strpart(s:tlist_msg, len - 3000)
672
+ endif
673
+ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' .
674
+ \ a:msg . "\n"
675
+ endif
676
+ endif
677
+ endfunction
678
+
679
+ " Tlist_Warning_Msg()
680
+ " Display a message using WarningMsg highlight group
681
+ function! s:Tlist_Warning_Msg(msg)
682
+ echohl WarningMsg
683
+ echomsg a:msg
684
+ echohl None
685
+ endfunction
686
+
687
+ " Last returned file index for file name lookup.
688
+ " Used to speed up file lookup
689
+ let s:tlist_file_name_idx_cache = -1
690
+
691
+ " Tlist_Get_File_Index()
692
+ " Return the index of the specified filename
693
+ function! s:Tlist_Get_File_Index(fname)
694
+ if s:tlist_file_count == 0 || a:fname == ''
695
+ return -1
696
+ endif
697
+
698
+ " If the new filename is same as the last accessed filename, then
699
+ " return that index
700
+ if s:tlist_file_name_idx_cache != -1 &&
701
+ \ s:tlist_file_name_idx_cache < s:tlist_file_count
702
+ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname
703
+ " Same as the last accessed file
704
+ return s:tlist_file_name_idx_cache
705
+ endif
706
+ endif
707
+
708
+ " First, check whether the filename is present
709
+ let s_fname = a:fname . "\n"
710
+ let i = stridx(s:tlist_file_names, s_fname)
711
+ if i == -1
712
+ let s:tlist_file_name_idx_cache = -1
713
+ return -1
714
+ endif
715
+
716
+ " Second, compute the file name index
717
+ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g')
718
+ let s:tlist_file_name_idx_cache = strlen(nl_txt)
719
+ return s:tlist_file_name_idx_cache
720
+ endfunction
721
+
722
+ " Last returned file index for line number lookup.
723
+ " Used to speed up file lookup
724
+ let s:tlist_file_lnum_idx_cache = -1
725
+
726
+ " Tlist_Window_Get_File_Index_By_Linenum()
727
+ " Return the index of the filename present in the specified line number
728
+ " Line number refers to the line number in the taglist window
729
+ function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum)
730
+ call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')')
731
+
732
+ " First try to see whether the new line number is within the range
733
+ " of the last returned file
734
+ if s:tlist_file_lnum_idx_cache != -1 &&
735
+ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count
736
+ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start &&
737
+ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end
738
+ return s:tlist_file_lnum_idx_cache
739
+ endif
740
+ endif
741
+
742
+ let fidx = -1
743
+
744
+ if g:Tlist_Show_One_File
745
+ " Displaying only one file in the taglist window. Check whether
746
+ " the line is within the tags displayed for that file
747
+ if s:tlist_cur_file_idx != -1
748
+ if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start
749
+ \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end
750
+ let fidx = s:tlist_cur_file_idx
751
+ endif
752
+
753
+ endif
754
+ else
755
+ " Do a binary search in the taglist
756
+ let left = 0
757
+ let right = s:tlist_file_count - 1
758
+
759
+ while left < right
760
+ let mid = (left + right) / 2
761
+
762
+ if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end
763
+ let s:tlist_file_lnum_idx_cache = mid
764
+ return mid
765
+ endif
766
+
767
+ if a:lnum < s:tlist_{mid}_start
768
+ let right = mid - 1
769
+ else
770
+ let left = mid + 1
771
+ endif
772
+ endwhile
773
+
774
+ if left >= 0 && left < s:tlist_file_count
775
+ \ && a:lnum >= s:tlist_{left}_start
776
+ \ && a:lnum <= s:tlist_{left}_end
777
+ let fidx = left
778
+ endif
779
+ endif
780
+
781
+ let s:tlist_file_lnum_idx_cache = fidx
782
+
783
+ return fidx
784
+ endfunction
785
+
786
+ " Tlist_Exe_Cmd_No_Acmds
787
+ " Execute the specified Ex command after disabling autocommands
788
+ function! s:Tlist_Exe_Cmd_No_Acmds(cmd)
789
+ let old_eventignore = &eventignore
790
+ set eventignore=all
791
+ exe a:cmd
792
+ let &eventignore = old_eventignore
793
+ endfunction
794
+
795
+ " Tlist_Skip_File()
796
+ " Check whether tag listing is supported for the specified file
797
+ function! s:Tlist_Skip_File(filename, ftype)
798
+ " Skip buffers with no names and buffers with filetype not set
799
+ if a:filename == '' || a:ftype == ''
800
+ return 1
801
+ endif
802
+
803
+ " Skip files which are not supported by exuberant ctags
804
+ " First check whether default settings for this filetype are available.
805
+ " If it is not available, then check whether user specified settings are
806
+ " available. If both are not available, then don't list the tags for this
807
+ " filetype
808
+ let var = 's:tlist_def_' . a:ftype . '_settings'
809
+ if !exists(var)
810
+ let var = 'g:tlist_' . a:ftype . '_settings'
811
+ if !exists(var)
812
+ return 1
813
+ endif
814
+ endif
815
+
816
+ " Skip files which are not readable or files which are not yet stored
817
+ " to the disk
818
+ if !filereadable(a:filename)
819
+ return 1
820
+ endif
821
+
822
+ return 0
823
+ endfunction
824
+
825
+ " Tlist_User_Removed_File
826
+ " Returns 1 if a file is removed by a user from the taglist
827
+ function! s:Tlist_User_Removed_File(filename)
828
+ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1
829
+ endfunction
830
+
831
+ " Tlist_Update_Remove_List
832
+ " Update the list of user removed files from the taglist
833
+ " add == 1, add the file to the removed list
834
+ " add == 0, delete the file from the removed list
835
+ function! s:Tlist_Update_Remove_List(filename, add)
836
+ if a:add
837
+ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n"
838
+ else
839
+ let idx = stridx(s:tlist_removed_flist, a:filename . "\n")
840
+ let text_before = strpart(s:tlist_removed_flist, 0, idx)
841
+ let rem_text = strpart(s:tlist_removed_flist, idx)
842
+ let next_idx = stridx(rem_text, "\n")
843
+ let text_after = strpart(rem_text, next_idx + 1)
844
+
845
+ let s:tlist_removed_flist = text_before . text_after
846
+ endif
847
+ endfunction
848
+
849
+ " Tlist_FileType_Init
850
+ " Initialize the ctags arguments and tag variable for the specified
851
+ " file type
852
+ function! s:Tlist_FileType_Init(ftype)
853
+ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')')
854
+ " If the user didn't specify any settings, then use the default
855
+ " ctags args. Otherwise, use the settings specified by the user
856
+ let var = 'g:tlist_' . a:ftype . '_settings'
857
+ if exists(var)
858
+ " User specified ctags arguments
859
+ let settings = {var} . ';'
860
+ else
861
+ " Default ctags arguments
862
+ let var = 's:tlist_def_' . a:ftype . '_settings'
863
+ if !exists(var)
864
+ " No default settings for this file type. This filetype is
865
+ " not supported
866
+ return 0
867
+ endif
868
+ let settings = s:tlist_def_{a:ftype}_settings . ';'
869
+ endif
870
+
871
+ let msg = 'Taglist: Invalid ctags option setting - ' . settings
872
+
873
+ " Format of the option that specifies the filetype and ctags arugments:
874
+ "
875
+ " <language_name>;flag1:name1;flag2:name2;flag3:name3
876
+ "
877
+
878
+ " Extract the file type to pass to ctags. This may be different from the
879
+ " file type detected by Vim
880
+ let pos = stridx(settings, ';')
881
+ if pos == -1
882
+ call s:Tlist_Warning_Msg(msg)
883
+ return 0
884
+ endif
885
+ let ctags_ftype = strpart(settings, 0, pos)
886
+ if ctags_ftype == ''
887
+ call s:Tlist_Warning_Msg(msg)
888
+ return 0
889
+ endif
890
+ " Make sure a valid filetype is supplied. If the user didn't specify a
891
+ " valid filetype, then the ctags option settings may be treated as the
892
+ " filetype
893
+ if ctags_ftype =~ ':'
894
+ call s:Tlist_Warning_Msg(msg)
895
+ return 0
896
+ endif
897
+
898
+ " Remove the file type from settings
899
+ let settings = strpart(settings, pos + 1)
900
+ if settings == ''
901
+ call s:Tlist_Warning_Msg(msg)
902
+ return 0
903
+ endif
904
+
905
+ " Process all the specified ctags flags. The format is
906
+ " flag1:name1;flag2:name2;flag3:name3
907
+ let ctags_flags = ''
908
+ let cnt = 0
909
+ while settings != ''
910
+ " Extract the flag
911
+ let pos = stridx(settings, ':')
912
+ if pos == -1
913
+ call s:Tlist_Warning_Msg(msg)
914
+ return 0
915
+ endif
916
+ let flag = strpart(settings, 0, pos)
917
+ if flag == ''
918
+ call s:Tlist_Warning_Msg(msg)
919
+ return 0
920
+ endif
921
+ " Remove the flag from settings
922
+ let settings = strpart(settings, pos + 1)
923
+
924
+ " Extract the tag type name
925
+ let pos = stridx(settings, ';')
926
+ if pos == -1
927
+ call s:Tlist_Warning_Msg(msg)
928
+ return 0
929
+ endif
930
+ let name = strpart(settings, 0, pos)
931
+ if name == ''
932
+ call s:Tlist_Warning_Msg(msg)
933
+ return 0
934
+ endif
935
+ let settings = strpart(settings, pos + 1)
936
+
937
+ let cnt = cnt + 1
938
+
939
+ let s:tlist_{a:ftype}_{cnt}_name = flag
940
+ let s:tlist_{a:ftype}_{cnt}_fullname = name
941
+ let ctags_flags = ctags_flags . flag
942
+ endwhile
943
+
944
+ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype .
945
+ \ ' --' . ctags_ftype . '-types=' . ctags_flags
946
+ let s:tlist_{a:ftype}_count = cnt
947
+ let s:tlist_{a:ftype}_ctags_flags = ctags_flags
948
+
949
+ " Save the filetype name
950
+ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype
951
+ let s:tlist_ftype_count = s:tlist_ftype_count + 1
952
+
953
+ return 1
954
+ endfunction
955
+
956
+ " Tlist_Detect_Filetype
957
+ " Determine the filetype for the specified file using the filetypedetect
958
+ " autocmd.
959
+ function! s:Tlist_Detect_Filetype(fname)
960
+ " Ignore the filetype autocommands
961
+ let old_eventignore = &eventignore
962
+ set eventignore=FileType
963
+
964
+ " Save the 'filetype', as this will be changed temporarily
965
+ let old_filetype = &filetype
966
+
967
+ " Run the filetypedetect group of autocommands to determine
968
+ " the filetype
969
+ exe 'doautocmd filetypedetect BufRead ' . a:fname
970
+
971
+ " Save the detected filetype
972
+ let ftype = &filetype
973
+
974
+ " Restore the previous state
975
+ let &filetype = old_filetype
976
+ let &eventignore = old_eventignore
977
+
978
+ return ftype
979
+ endfunction
980
+
981
+ " Tlist_Get_Buffer_Filetype
982
+ " Get the filetype for the specified buffer
983
+ function! s:Tlist_Get_Buffer_Filetype(bnum)
984
+ let buf_ft = getbufvar(a:bnum, '&filetype')
985
+
986
+ if bufloaded(a:bnum)
987
+ " For loaded buffers, the 'filetype' is already determined
988
+ return buf_ft
989
+ endif
990
+
991
+ " For unloaded buffers, if the 'filetype' option is set, return it
992
+ if buf_ft != ''
993
+ return buf_ft
994
+ endif
995
+
996
+ " Skip non-existent buffers
997
+ if !bufexists(a:bnum)
998
+ return ''
999
+ endif
1000
+
1001
+ " For buffers whose filetype is not yet determined, try to determine
1002
+ " the filetype
1003
+ let bname = bufname(a:bnum)
1004
+
1005
+ return s:Tlist_Detect_Filetype(bname)
1006
+ endfunction
1007
+
1008
+ " Tlist_Discard_TagInfo
1009
+ " Discard the stored tag information for a file
1010
+ function! s:Tlist_Discard_TagInfo(fidx)
1011
+ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' .
1012
+ \ s:tlist_{a:fidx}_filename . ')')
1013
+ let ftype = s:tlist_{a:fidx}_filetype
1014
+
1015
+ " Discard information about the tags defined in the file
1016
+ let i = 1
1017
+ while i <= s:tlist_{a:fidx}_tag_count
1018
+ let fidx_i = 's:tlist_' . a:fidx . '_' . i
1019
+ unlet! {fidx_i}_tag
1020
+ unlet! {fidx_i}_tag_name
1021
+ unlet! {fidx_i}_tag_type
1022
+ unlet! {fidx_i}_ttype_idx
1023
+ unlet! {fidx_i}_tag_proto
1024
+ unlet! {fidx_i}_tag_searchpat
1025
+ unlet! {fidx_i}_tag_linenum
1026
+ let i = i + 1
1027
+ endwhile
1028
+
1029
+ let s:tlist_{a:fidx}_tag_count = 0
1030
+
1031
+ " Discard information about tag type groups
1032
+ let i = 1
1033
+ while i <= s:tlist_{ftype}_count
1034
+ let ttype = s:tlist_{ftype}_{i}_name
1035
+ if s:tlist_{a:fidx}_{ttype} != ''
1036
+ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype
1037
+ let {fidx_ttype} = ''
1038
+ let {fidx_ttype}_offset = 0
1039
+ let cnt = {fidx_ttype}_count
1040
+ let {fidx_ttype}_count = 0
1041
+ let j = 1
1042
+ while j <= cnt
1043
+ unlet! {fidx_ttype}_{j}
1044
+ let j = j + 1
1045
+ endwhile
1046
+ endif
1047
+ let i = i + 1
1048
+ endwhile
1049
+
1050
+ " Discard the stored menu command also
1051
+ let s:tlist_{a:fidx}_menu_cmd = ''
1052
+ endfunction
1053
+
1054
+ " Tlist_Window_Update_Line_Offsets
1055
+ " Update the line offsets for tags for files starting from start_idx
1056
+ " and displayed in the taglist window by the specified offset
1057
+ function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset)
1058
+ let i = a:start_idx
1059
+
1060
+ while i < s:tlist_file_count
1061
+ if s:tlist_{i}_visible
1062
+ " Update the start/end line number only if the file is visible
1063
+ if a:increment
1064
+ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset
1065
+ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset
1066
+ else
1067
+ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset
1068
+ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset
1069
+ endif
1070
+ endif
1071
+ let i = i + 1
1072
+ endwhile
1073
+ endfunction
1074
+
1075
+ " Tlist_Discard_FileInfo
1076
+ " Discard the stored information for a file
1077
+ function! s:Tlist_Discard_FileInfo(fidx)
1078
+ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' .
1079
+ \ s:tlist_{a:fidx}_filename . ')')
1080
+ call s:Tlist_Discard_TagInfo(a:fidx)
1081
+
1082
+ let ftype = s:tlist_{a:fidx}_filetype
1083
+
1084
+ let i = 1
1085
+ while i <= s:tlist_{ftype}_count
1086
+ let ttype = s:tlist_{ftype}_{i}_name
1087
+ unlet! s:tlist_{a:fidx}_{ttype}
1088
+ unlet! s:tlist_{a:fidx}_{ttype}_offset
1089
+ unlet! s:tlist_{a:fidx}_{ttype}_count
1090
+ let i = i + 1
1091
+ endwhile
1092
+
1093
+ unlet! s:tlist_{a:fidx}_filename
1094
+ unlet! s:tlist_{a:fidx}_sort_type
1095
+ unlet! s:tlist_{a:fidx}_filetype
1096
+ unlet! s:tlist_{a:fidx}_mtime
1097
+ unlet! s:tlist_{a:fidx}_start
1098
+ unlet! s:tlist_{a:fidx}_end
1099
+ unlet! s:tlist_{a:fidx}_valid
1100
+ unlet! s:tlist_{a:fidx}_visible
1101
+ unlet! s:tlist_{a:fidx}_tag_count
1102
+ unlet! s:tlist_{a:fidx}_menu_cmd
1103
+ endfunction
1104
+
1105
+ " Tlist_Window_Remove_File_From_Display
1106
+ " Remove the specified file from display
1107
+ function! s:Tlist_Window_Remove_File_From_Display(fidx)
1108
+ call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' .
1109
+ \ s:tlist_{a:fidx}_filename . ')')
1110
+ " If the file is not visible then no need to remove it
1111
+ if !s:tlist_{a:fidx}_visible
1112
+ return
1113
+ endif
1114
+
1115
+ " Remove the tags displayed for the specified file from the window
1116
+ let start = s:tlist_{a:fidx}_start
1117
+ " Include the empty line after the last line also
1118
+ if g:Tlist_Compact_Format
1119
+ let end = s:tlist_{a:fidx}_end
1120
+ else
1121
+ let end = s:tlist_{a:fidx}_end + 1
1122
+ endif
1123
+
1124
+ setlocal modifiable
1125
+ exe 'silent! ' . start . ',' . end . 'delete _'
1126
+ setlocal nomodifiable
1127
+
1128
+ " Correct the start and end line offsets for all the files following
1129
+ " this file, as the tags for this file are removed
1130
+ call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1)
1131
+ endfunction
1132
+
1133
+ " Tlist_Remove_File
1134
+ " Remove the file under the cursor or the specified file index
1135
+ " user_request - User requested to remove the file from taglist
1136
+ function! s:Tlist_Remove_File(file_idx, user_request)
1137
+ let fidx = a:file_idx
1138
+
1139
+ if fidx == -1
1140
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.'))
1141
+ if fidx == -1
1142
+ return
1143
+ endif
1144
+ endif
1145
+ call s:Tlist_Log_Msg('Tlist_Remove_File (' .
1146
+ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')')
1147
+
1148
+ let save_winnr = winnr()
1149
+ let winnum = bufwinnr(g:TagList_title)
1150
+ if winnum != -1
1151
+ " Taglist window is open, remove the file from display
1152
+
1153
+ if save_winnr != winnum
1154
+ let old_eventignore = &eventignore
1155
+ set eventignore=all
1156
+ exe winnum . 'wincmd w'
1157
+ endif
1158
+
1159
+ call s:Tlist_Window_Remove_File_From_Display(fidx)
1160
+
1161
+ if save_winnr != winnum
1162
+ exe save_winnr . 'wincmd w'
1163
+ let &eventignore = old_eventignore
1164
+ endif
1165
+ endif
1166
+
1167
+ let fname = s:tlist_{fidx}_filename
1168
+
1169
+ if a:user_request
1170
+ " As the user requested to remove the file from taglist,
1171
+ " add it to the removed list
1172
+ call s:Tlist_Update_Remove_List(fname, 1)
1173
+ endif
1174
+
1175
+ " Remove the file name from the taglist list of filenames
1176
+ let idx = stridx(s:tlist_file_names, fname . "\n")
1177
+ let text_before = strpart(s:tlist_file_names, 0, idx)
1178
+ let rem_text = strpart(s:tlist_file_names, idx)
1179
+ let next_idx = stridx(rem_text, "\n")
1180
+ let text_after = strpart(rem_text, next_idx + 1)
1181
+ let s:tlist_file_names = text_before . text_after
1182
+
1183
+ call s:Tlist_Discard_FileInfo(fidx)
1184
+
1185
+ " Shift all the file variables by one index
1186
+ let i = fidx + 1
1187
+
1188
+ while i < s:tlist_file_count
1189
+ let j = i - 1
1190
+
1191
+ let s:tlist_{j}_filename = s:tlist_{i}_filename
1192
+ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type
1193
+ let s:tlist_{j}_filetype = s:tlist_{i}_filetype
1194
+ let s:tlist_{j}_mtime = s:tlist_{i}_mtime
1195
+ let s:tlist_{j}_start = s:tlist_{i}_start
1196
+ let s:tlist_{j}_end = s:tlist_{i}_end
1197
+ let s:tlist_{j}_valid = s:tlist_{i}_valid
1198
+ let s:tlist_{j}_visible = s:tlist_{i}_visible
1199
+ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count
1200
+ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd
1201
+
1202
+ let k = 1
1203
+ while k <= s:tlist_{j}_tag_count
1204
+ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag
1205
+ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name
1206
+ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k)
1207
+ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx
1208
+ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k)
1209
+ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k)
1210
+ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k)
1211
+ let k = k + 1
1212
+ endwhile
1213
+
1214
+ let ftype = s:tlist_{i}_filetype
1215
+
1216
+ let k = 1
1217
+ while k <= s:tlist_{ftype}_count
1218
+ let ttype = s:tlist_{ftype}_{k}_name
1219
+ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype}
1220
+ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset
1221
+ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count
1222
+ if s:tlist_{j}_{ttype} != ''
1223
+ let l = 1
1224
+ while l <= s:tlist_{j}_{ttype}_count
1225
+ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l}
1226
+ let l = l + 1
1227
+ endwhile
1228
+ endif
1229
+ let k = k + 1
1230
+ endwhile
1231
+
1232
+ " As the file and tag information is copied to the new index,
1233
+ " discard the previous information
1234
+ call s:Tlist_Discard_FileInfo(i)
1235
+
1236
+ let i = i + 1
1237
+ endwhile
1238
+
1239
+ " Reduce the number of files displayed
1240
+ let s:tlist_file_count = s:tlist_file_count - 1
1241
+
1242
+ if g:Tlist_Show_One_File
1243
+ " If the tags for only one file is displayed and if we just
1244
+ " now removed that file, then invalidate the current file idx
1245
+ if s:tlist_cur_file_idx == fidx
1246
+ let s:tlist_cur_file_idx = -1
1247
+ endif
1248
+ endif
1249
+ endfunction
1250
+
1251
+ " Tlist_Window_Goto_Window
1252
+ " Goto the taglist window
1253
+ function! s:Tlist_Window_Goto_Window()
1254
+ let winnum = bufwinnr(g:TagList_title)
1255
+ if winnum != -1
1256
+ if winnr() != winnum
1257
+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w')
1258
+ endif
1259
+ endif
1260
+ endfunction
1261
+
1262
+ " Tlist_Window_Create
1263
+ " Create a new taglist window. If it is already open, jump to it
1264
+ function! s:Tlist_Window_Create()
1265
+ call s:Tlist_Log_Msg('Tlist_Window_Create()')
1266
+ " If the window is open, jump to it
1267
+ let winnum = bufwinnr(g:TagList_title)
1268
+ if winnum != -1
1269
+ " Jump to the existing window
1270
+ if winnr() != winnum
1271
+ exe winnum . 'wincmd w'
1272
+ endif
1273
+ return
1274
+ endif
1275
+
1276
+ " If used with winmanager don't open windows. Winmanager will handle
1277
+ " the window/buffer management
1278
+ if s:tlist_app_name == "winmanager"
1279
+ return
1280
+ endif
1281
+
1282
+ " Create a new window. If user prefers a horizontal window, then open
1283
+ " a horizontally split window. Otherwise open a vertically split
1284
+ " window
1285
+ if g:Tlist_Use_Horiz_Window
1286
+ " Open a horizontally split window
1287
+ let win_dir = 'botright'
1288
+ " Horizontal window height
1289
+ let win_size = g:Tlist_WinHeight
1290
+ else
1291
+ if s:tlist_winsize_chgd == -1
1292
+ " Open a vertically split window. Increase the window size, if
1293
+ " needed, to accomodate the new window
1294
+ if g:Tlist_Inc_Winwidth &&
1295
+ \ &columns < (80 + g:Tlist_WinWidth)
1296
+ " Save the original window position
1297
+ let s:tlist_pre_winx = getwinposx()
1298
+ let s:tlist_pre_winy = getwinposy()
1299
+
1300
+ " one extra column is needed to include the vertical split
1301
+ let &columns= &columns + g:Tlist_WinWidth + 1
1302
+
1303
+ let s:tlist_winsize_chgd = 1
1304
+ else
1305
+ let s:tlist_winsize_chgd = 0
1306
+ endif
1307
+ endif
1308
+
1309
+ if g:Tlist_Use_Right_Window
1310
+ " Open the window at the rightmost place
1311
+ let win_dir = 'botright vertical'
1312
+ else
1313
+ " Open the window at the leftmost place
1314
+ let win_dir = 'topleft vertical'
1315
+ endif
1316
+ let win_size = g:Tlist_WinWidth
1317
+ endif
1318
+
1319
+ " If the tag listing temporary buffer already exists, then reuse it.
1320
+ " Otherwise create a new buffer
1321
+ let bufnum = bufnr(g:TagList_title)
1322
+ if bufnum == -1
1323
+ " Create a new buffer
1324
+ let wcmd = g:TagList_title
1325
+ else
1326
+ " Edit the existing buffer
1327
+ let wcmd = '+buffer' . bufnum
1328
+ endif
1329
+
1330
+ " Create the taglist window
1331
+ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd
1332
+
1333
+ " Save the new window position
1334
+ let s:tlist_winx = getwinposx()
1335
+ let s:tlist_winy = getwinposy()
1336
+
1337
+ " Initialize the taglist window
1338
+ call s:Tlist_Window_Init()
1339
+ endfunction
1340
+
1341
+ " Tlist_Window_Zoom
1342
+ " Zoom (maximize/minimize) the taglist window
1343
+ function! s:Tlist_Window_Zoom()
1344
+ if s:tlist_win_maximized
1345
+ " Restore the window back to the previous size
1346
+ if g:Tlist_Use_Horiz_Window
1347
+ exe 'resize ' . g:Tlist_WinHeight
1348
+ else
1349
+ exe 'vert resize ' . g:Tlist_WinWidth
1350
+ endif
1351
+ let s:tlist_win_maximized = 0
1352
+ else
1353
+ " Set the window size to the maximum possible without closing other
1354
+ " windows
1355
+ if g:Tlist_Use_Horiz_Window
1356
+ resize
1357
+ else
1358
+ vert resize
1359
+ endif
1360
+ let s:tlist_win_maximized = 1
1361
+ endif
1362
+ endfunction
1363
+
1364
+ " Tlist_Ballon_Expr
1365
+ " When the mouse cursor is over a tag in the taglist window, display the
1366
+ " tag prototype (balloon)
1367
+ function! Tlist_Ballon_Expr()
1368
+ " Get the file index
1369
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum)
1370
+ if fidx == -1
1371
+ return ''
1372
+ endif
1373
+
1374
+ " Get the tag output line for the current tag
1375
+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum)
1376
+ if tidx == 0
1377
+ return ''
1378
+ endif
1379
+
1380
+ " Get the tag search pattern and display it
1381
+ return s:Tlist_Get_Tag_Prototype(fidx, tidx)
1382
+ endfunction
1383
+
1384
+ " Tlist_Window_Check_Width
1385
+ " Check the width of the taglist window. For horizontally split windows, the
1386
+ " 'winfixheight' option is used to fix the height of the window. For
1387
+ " vertically split windows, Vim doesn't support the 'winfixwidth' option. So
1388
+ " need to handle window width changes from this function.
1389
+ function! s:Tlist_Window_Check_Width()
1390
+ let tlist_winnr = bufwinnr(g:TagList_title)
1391
+ if tlist_winnr == -1
1392
+ return
1393
+ endif
1394
+
1395
+ let width = winwidth(tlist_winnr)
1396
+ if width != g:Tlist_WinWidth
1397
+ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " .
1398
+ \ "width from " . width . " to " . g:Tlist_WinWidth)
1399
+ let save_winnr = winnr()
1400
+ if save_winnr != tlist_winnr
1401
+ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w')
1402
+ endif
1403
+ exe 'vert resize ' . g:Tlist_WinWidth
1404
+ if save_winnr != tlist_winnr
1405
+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p')
1406
+ endif
1407
+ endif
1408
+ endfunction
1409
+
1410
+ " Tlist_Window_Exit_Only_Window
1411
+ " If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the
1412
+ " taglist window is present.
1413
+ function! s:Tlist_Window_Exit_Only_Window()
1414
+ " Before quitting Vim, delete the taglist buffer so that
1415
+ " the '0 mark is correctly set to the previous buffer.
1416
+ if v:version < 700
1417
+ if winbufnr(2) == -1
1418
+ bdelete
1419
+ quit
1420
+ endif
1421
+ else
1422
+ if winbufnr(2) == -1
1423
+ if tabpagenr('$') == 1
1424
+ " Only one tag page is present
1425
+ bdelete
1426
+ quit
1427
+ else
1428
+ " More than one tab page is present. Close only the current
1429
+ " tab page
1430
+ close
1431
+ endif
1432
+ endif
1433
+ endif
1434
+ endfunction
1435
+
1436
+ " Tlist_Window_Init
1437
+ " Set the default options for the taglist window
1438
+ function! s:Tlist_Window_Init()
1439
+ call s:Tlist_Log_Msg('Tlist_Window_Init()')
1440
+
1441
+ " The 'readonly' option should not be set for the taglist buffer.
1442
+ " If Vim is started as "view/gview" or if the ":view" command is
1443
+ " used, then the 'readonly' option is set for all the buffers.
1444
+ " Unset it for the taglist buffer
1445
+ setlocal noreadonly
1446
+
1447
+ " Set the taglist buffer filetype to taglist
1448
+ setlocal filetype=taglist
1449
+
1450
+ " Define taglist window element highlighting
1451
+ syntax match TagListComment '^" .*'
1452
+ syntax match TagListFileName '^[^" ].*$'
1453
+ syntax match TagListTitle '^ \S.*$'
1454
+ syntax match TagListTagScope '\s\[.\{-\}\]$'
1455
+
1456
+ " Define the highlighting only if colors are supported
1457
+ if has('gui_running') || &t_Co > 2
1458
+ " Colors to highlight various taglist window elements
1459
+ " If user defined highlighting group exists, then use them.
1460
+ " Otherwise, use default highlight groups.
1461
+ if hlexists('MyTagListTagName')
1462
+ highlight link TagListTagName MyTagListTagName
1463
+ else
1464
+ highlight default link TagListTagName Search
1465
+ endif
1466
+ " Colors to highlight comments and titles
1467
+ if hlexists('MyTagListComment')
1468
+ highlight link TagListComment MyTagListComment
1469
+ else
1470
+ highlight clear TagListComment
1471
+ highlight default link TagListComment Comment
1472
+ endif
1473
+ if hlexists('MyTagListTitle')
1474
+ highlight link TagListTitle MyTagListTitle
1475
+ else
1476
+ highlight clear TagListTitle
1477
+ highlight default link TagListTitle Title
1478
+ endif
1479
+ if hlexists('MyTagListFileName')
1480
+ highlight link TagListFileName MyTagListFileName
1481
+ else
1482
+ highlight clear TagListFileName
1483
+ highlight default TagListFileName guibg=Grey ctermbg=darkgray
1484
+ \ guifg=white ctermfg=white
1485
+ endif
1486
+ if hlexists('MyTagListTagScope')
1487
+ highlight link TagListTagScope MyTagListTagScope
1488
+ else
1489
+ highlight clear TagListTagScope
1490
+ highlight default link TagListTagScope Identifier
1491
+ endif
1492
+ else
1493
+ highlight default TagListTagName term=reverse cterm=reverse
1494
+ endif
1495
+
1496
+ " Folding related settings
1497
+ setlocal foldenable
1498
+ setlocal foldminlines=0
1499
+ setlocal foldmethod=manual
1500
+ setlocal foldlevel=9999
1501
+ if g:Tlist_Enable_Fold_Column
1502
+ setlocal foldcolumn=3
1503
+ else
1504
+ setlocal foldcolumn=0
1505
+ endif
1506
+ setlocal foldtext=v:folddashes.getline(v:foldstart)
1507
+
1508
+ if s:tlist_app_name != "winmanager"
1509
+ " Mark buffer as scratch
1510
+ silent! setlocal buftype=nofile
1511
+ if s:tlist_app_name == "none"
1512
+ silent! setlocal bufhidden=delete
1513
+ endif
1514
+ silent! setlocal noswapfile
1515
+ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted
1516
+ " buffers. So if the taglist buffer is unlisted, multiple taglist
1517
+ " windows will be opened. This bug is fixed in Vim 6.1 and above
1518
+ if v:version >= 601
1519
+ silent! setlocal nobuflisted
1520
+ endif
1521
+ endif
1522
+
1523
+ silent! setlocal nowrap
1524
+
1525
+ " If the 'number' option is set in the source window, it will affect the
1526
+ " taglist window. So forcefully disable 'number' option for the taglist
1527
+ " window
1528
+ silent! setlocal nonumber
1529
+
1530
+ " Use fixed height when horizontally split window is used
1531
+ if g:Tlist_Use_Horiz_Window
1532
+ if v:version >= 602
1533
+ set winfixheight
1534
+ endif
1535
+ endif
1536
+ if !g:Tlist_Use_Horiz_Window && v:version >= 700
1537
+ set winfixwidth
1538
+ endif
1539
+
1540
+ " Setup balloon evaluation to display tag prototype
1541
+ if v:version >= 700 && has('balloon_eval')
1542
+ setlocal balloonexpr=Tlist_Ballon_Expr()
1543
+ set ballooneval
1544
+ endif
1545
+
1546
+ " Setup the cpoptions properly for the maps to work
1547
+ let old_cpoptions = &cpoptions
1548
+ set cpoptions&vim
1549
+
1550
+ " Create buffer local mappings for jumping to the tags and sorting the list
1551
+ nnoremap <buffer> <silent> <CR>
1552
+ \ :call <SID>Tlist_Window_Jump_To_Tag('useopen')<CR>
1553
+ nnoremap <buffer> <silent> o
1554
+ \ :call <SID>Tlist_Window_Jump_To_Tag('newwin')<CR>
1555
+ nnoremap <buffer> <silent> p
1556
+ \ :call <SID>Tlist_Window_Jump_To_Tag('preview')<CR>
1557
+ nnoremap <buffer> <silent> P
1558
+ \ :call <SID>Tlist_Window_Jump_To_Tag('prevwin')<CR>
1559
+ if v:version >= 700
1560
+ nnoremap <buffer> <silent> t
1561
+ \ :call <SID>Tlist_Window_Jump_To_Tag('checktab')<CR>
1562
+ nnoremap <buffer> <silent> <C-t>
1563
+ \ :call <SID>Tlist_Window_Jump_To_Tag('newtab')<CR>
1564
+ endif
1565
+ nnoremap <buffer> <silent> <2-LeftMouse>
1566
+ \ :call <SID>Tlist_Window_Jump_To_Tag('useopen')<CR>
1567
+ nnoremap <buffer> <silent> s
1568
+ \ :call <SID>Tlist_Change_Sort('cmd', 'toggle', '')<CR>
1569
+ nnoremap <buffer> <silent> + :silent! foldopen<CR>
1570
+ nnoremap <buffer> <silent> - :silent! foldclose<CR>
1571
+ nnoremap <buffer> <silent> * :silent! %foldopen!<CR>
1572
+ nnoremap <buffer> <silent> = :silent! %foldclose<CR>
1573
+ nnoremap <buffer> <silent> <kPlus> :silent! foldopen<CR>
1574
+ nnoremap <buffer> <silent> <kMinus> :silent! foldclose<CR>
1575
+ nnoremap <buffer> <silent> <kMultiply> :silent! %foldopen!<CR>
1576
+ nnoremap <buffer> <silent> <Space> :call <SID>Tlist_Window_Show_Info()<CR>
1577
+ nnoremap <buffer> <silent> u :call <SID>Tlist_Window_Update_File()<CR>
1578
+ nnoremap <buffer> <silent> d :call <SID>Tlist_Remove_File(-1, 1)<CR>
1579
+ nnoremap <buffer> <silent> x :call <SID>Tlist_Window_Zoom()<CR>
1580
+ nnoremap <buffer> <silent> [[ :call <SID>Tlist_Window_Move_To_File(-1)<CR>
1581
+ nnoremap <buffer> <silent> <BS> :call <SID>Tlist_Window_Move_To_File(-1)<CR>
1582
+ nnoremap <buffer> <silent> ]] :call <SID>Tlist_Window_Move_To_File(1)<CR>
1583
+ nnoremap <buffer> <silent> <Tab> :call <SID>Tlist_Window_Move_To_File(1)<CR>
1584
+ nnoremap <buffer> <silent> <F1> :call <SID>Tlist_Window_Toggle_Help_Text()<CR>
1585
+ nnoremap <buffer> <silent> q :close<CR>
1586
+
1587
+ " Insert mode mappings
1588
+ inoremap <buffer> <silent> <CR>
1589
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('useopen')<CR>
1590
+ " Windows needs return
1591
+ inoremap <buffer> <silent> <Return>
1592
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('useopen')<CR>
1593
+ inoremap <buffer> <silent> o
1594
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('newwin')<CR>
1595
+ inoremap <buffer> <silent> p
1596
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('preview')<CR>
1597
+ inoremap <buffer> <silent> P
1598
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('prevwin')<CR>
1599
+ if v:version >= 700
1600
+ inoremap <buffer> <silent> t
1601
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('checktab')<CR>
1602
+ inoremap <buffer> <silent> <C-t>
1603
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('newtab')<CR>
1604
+ endif
1605
+ inoremap <buffer> <silent> <2-LeftMouse>
1606
+ \ <C-o>:call <SID>Tlist_Window_Jump_To_Tag('useopen')<CR>
1607
+ inoremap <buffer> <silent> s
1608
+ \ <C-o>:call <SID>Tlist_Change_Sort('cmd', 'toggle', '')<CR>
1609
+ inoremap <buffer> <silent> + <C-o>:silent! foldopen<CR>
1610
+ inoremap <buffer> <silent> - <C-o>:silent! foldclose<CR>
1611
+ inoremap <buffer> <silent> * <C-o>:silent! %foldopen!<CR>
1612
+ inoremap <buffer> <silent> = <C-o>:silent! %foldclose<CR>
1613
+ inoremap <buffer> <silent> <kPlus> <C-o>:silent! foldopen<CR>
1614
+ inoremap <buffer> <silent> <kMinus> <C-o>:silent! foldclose<CR>
1615
+ inoremap <buffer> <silent> <kMultiply> <C-o>:silent! %foldopen!<CR>
1616
+ inoremap <buffer> <silent> <Space> <C-o>:call
1617
+ \ <SID>Tlist_Window_Show_Info()<CR>
1618
+ inoremap <buffer> <silent> u
1619
+ \ <C-o>:call <SID>Tlist_Window_Update_File()<CR>
1620
+ inoremap <buffer> <silent> d <C-o>:call <SID>Tlist_Remove_File(-1, 1)<CR>
1621
+ inoremap <buffer> <silent> x <C-o>:call <SID>Tlist_Window_Zoom()<CR>
1622
+ inoremap <buffer> <silent> [[ <C-o>:call <SID>Tlist_Window_Move_To_File(-1)<CR>
1623
+ inoremap <buffer> <silent> <BS> <C-o>:call <SID>Tlist_Window_Move_To_File(-1)<CR>
1624
+ inoremap <buffer> <silent> ]] <C-o>:call <SID>Tlist_Window_Move_To_File(1)<CR>
1625
+ inoremap <buffer> <silent> <Tab> <C-o>:call <SID>Tlist_Window_Move_To_File(1)<CR>
1626
+ inoremap <buffer> <silent> <F1> <C-o>:call <SID>Tlist_Window_Toggle_Help_Text()<CR>
1627
+ inoremap <buffer> <silent> q <C-o>:close<CR>
1628
+
1629
+ " Map single left mouse click if the user wants this functionality
1630
+ if g:Tlist_Use_SingleClick == 1
1631
+ " Contributed by Bindu Wavell
1632
+ " attempt to perform single click mapping, it would be much
1633
+ " nicer if we could nnoremap <buffer> ... however vim does
1634
+ " not fire the <buffer> <leftmouse> when you use the mouse
1635
+ " to enter a buffer.
1636
+ let clickmap = ':if bufname("%") =~ "__Tag_List__" <bar> ' .
1637
+ \ 'call <SID>Tlist_Window_Jump_To_Tag("useopen") ' .
1638
+ \ '<bar> endif <CR>'
1639
+ if maparg('<leftmouse>', 'n') == ''
1640
+ " no mapping for leftmouse
1641
+ exe ':nnoremap <silent> <leftmouse> <leftmouse>' . clickmap
1642
+ else
1643
+ " we have a mapping
1644
+ let mapcmd = ':nnoremap <silent> <leftmouse> <leftmouse>'
1645
+ let mapcmd = mapcmd . substitute(substitute(
1646
+ \ maparg('<leftmouse>', 'n'), '|', '<bar>', 'g'),
1647
+ \ '\c^<leftmouse>', '', '')
1648
+ let mapcmd = mapcmd . clickmap
1649
+ exe mapcmd
1650
+ endif
1651
+ endif
1652
+
1653
+ " Define the taglist autocommands
1654
+ augroup TagListAutoCmds
1655
+ autocmd!
1656
+ " Display the tag prototype for the tag under the cursor.
1657
+ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info()
1658
+ " Highlight the current tag periodically
1659
+ autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag(
1660
+ \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0)
1661
+
1662
+ " Adjust the Vim window width when taglist window is closed
1663
+ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup()
1664
+ " Close the fold for this buffer when leaving the buffer
1665
+ if g:Tlist_File_Fold_Auto_Close
1666
+ autocmd BufEnter * silent
1667
+ \ call s:Tlist_Window_Open_File_Fold(expand('<abuf>'))
1668
+ endif
1669
+ " Exit Vim itself if only the taglist window is present (optional)
1670
+ if g:Tlist_Exit_OnlyWindow
1671
+ autocmd BufEnter __Tag_List__ nested
1672
+ \ call s:Tlist_Window_Exit_Only_Window()
1673
+ endif
1674
+ if s:tlist_app_name != "winmanager" &&
1675
+ \ !g:Tlist_Process_File_Always &&
1676
+ \ (!has('gui_running') || !g:Tlist_Show_Menu)
1677
+ " Auto refresh the taglist window
1678
+ autocmd BufEnter * call s:Tlist_Refresh()
1679
+ endif
1680
+
1681
+ if !g:Tlist_Use_Horiz_Window
1682
+ if v:version < 700
1683
+ autocmd WinEnter * call s:Tlist_Window_Check_Width()
1684
+ endif
1685
+ endif
1686
+ if v:version >= 700
1687
+ autocmd TabEnter * silent call s:Tlist_Refresh_Folds()
1688
+ endif
1689
+ augroup end
1690
+
1691
+ " Restore the previous cpoptions settings
1692
+ let &cpoptions = old_cpoptions
1693
+ endfunction
1694
+
1695
+ " Tlist_Window_Refresh
1696
+ " Display the tags for all the files in the taglist window
1697
+ function! s:Tlist_Window_Refresh()
1698
+ call s:Tlist_Log_Msg('Tlist_Window_Refresh()')
1699
+ " Set report option to a huge value to prevent informational messages
1700
+ " while deleting the lines
1701
+ let old_report = &report
1702
+ set report=99999
1703
+
1704
+ " Mark the buffer as modifiable
1705
+ setlocal modifiable
1706
+
1707
+ " Delete the contents of the buffer to the black-hole register
1708
+ silent! %delete _
1709
+
1710
+ " As we have cleared the taglist window, mark all the files
1711
+ " as not visible
1712
+ let i = 0
1713
+ while i < s:tlist_file_count
1714
+ let s:tlist_{i}_visible = 0
1715
+ let i = i + 1
1716
+ endwhile
1717
+
1718
+ if g:Tlist_Compact_Format == 0
1719
+ " Display help in non-compact mode
1720
+ call s:Tlist_Window_Display_Help()
1721
+ endif
1722
+
1723
+ " Mark the buffer as not modifiable
1724
+ setlocal nomodifiable
1725
+
1726
+ " Restore the report option
1727
+ let &report = old_report
1728
+
1729
+ " If the tags for only one file should be displayed in the taglist
1730
+ " window, then no need to add the tags here. The bufenter autocommand
1731
+ " will add the tags for that file.
1732
+ if g:Tlist_Show_One_File
1733
+ return
1734
+ endif
1735
+
1736
+ " List all the tags for the previously processed files
1737
+ " Do this only if taglist is configured to display tags for more than
1738
+ " one file. Otherwise, when Tlist_Show_One_File is configured,
1739
+ " tags for the wrong file will be displayed.
1740
+ let i = 0
1741
+ while i < s:tlist_file_count
1742
+ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename,
1743
+ \ s:tlist_{i}_filetype)
1744
+ let i = i + 1
1745
+ endwhile
1746
+
1747
+ if g:Tlist_Auto_Update
1748
+ " Add and list the tags for all buffers in the Vim buffer list
1749
+ let i = 1
1750
+ let last_bufnum = bufnr('$')
1751
+ while i <= last_bufnum
1752
+ if buflisted(i)
1753
+ let fname = fnamemodify(bufname(i), ':p')
1754
+ let ftype = s:Tlist_Get_Buffer_Filetype(i)
1755
+ " If the file doesn't support tag listing, skip it
1756
+ if !s:Tlist_Skip_File(fname, ftype)
1757
+ call s:Tlist_Window_Refresh_File(fname, ftype)
1758
+ endif
1759
+ endif
1760
+ let i = i + 1
1761
+ endwhile
1762
+ endif
1763
+
1764
+ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds
1765
+ if g:Tlist_File_Fold_Auto_Close
1766
+ " Close all the folds
1767
+ silent! %foldclose
1768
+ endif
1769
+
1770
+ " Move the cursor to the top of the taglist window
1771
+ normal! gg
1772
+ endfunction
1773
+
1774
+ " Tlist_Post_Close_Cleanup()
1775
+ " Close the taglist window and adjust the Vim window width
1776
+ function! s:Tlist_Post_Close_Cleanup()
1777
+ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()')
1778
+ " Mark all the files as not visible
1779
+ let i = 0
1780
+ while i < s:tlist_file_count
1781
+ let s:tlist_{i}_visible = 0
1782
+ let i = i + 1
1783
+ endwhile
1784
+
1785
+ " Remove the taglist autocommands
1786
+ silent! autocmd! TagListAutoCmds
1787
+
1788
+ " Clear all the highlights
1789
+ match none
1790
+
1791
+ silent! syntax clear TagListTitle
1792
+ silent! syntax clear TagListComment
1793
+ silent! syntax clear TagListTagScope
1794
+
1795
+ " Remove the left mouse click mapping if it was setup initially
1796
+ if g:Tlist_Use_SingleClick
1797
+ if hasmapto('<LeftMouse>')
1798
+ nunmap <LeftMouse>
1799
+ endif
1800
+ endif
1801
+
1802
+ if s:tlist_app_name != "winmanager"
1803
+ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 ||
1804
+ \ s:tlist_winsize_chgd != 1 ||
1805
+ \ &columns < (80 + g:Tlist_WinWidth)
1806
+ " No need to adjust window width if using horizontally split taglist
1807
+ " window or if columns is less than 101 or if the user chose not to
1808
+ " adjust the window width
1809
+ else
1810
+ " If the user didn't manually move the window, then restore the window
1811
+ " position to the pre-taglist position
1812
+ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 &&
1813
+ \ getwinposx() == s:tlist_winx &&
1814
+ \ getwinposy() == s:tlist_winy
1815
+ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy
1816
+ endif
1817
+
1818
+ " Adjust the Vim window width
1819
+ let &columns= &columns - (g:Tlist_WinWidth + 1)
1820
+ endif
1821
+ endif
1822
+
1823
+ let s:tlist_winsize_chgd = -1
1824
+
1825
+ " Reset taglist state variables
1826
+ if s:tlist_app_name == "winmanager"
1827
+ let s:tlist_app_name = "none"
1828
+ endif
1829
+ let s:tlist_window_initialized = 0
1830
+ endfunction
1831
+
1832
+ " Tlist_Window_Refresh_File()
1833
+ " List the tags defined in the specified file in a Vim window
1834
+ function! s:Tlist_Window_Refresh_File(filename, ftype)
1835
+ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')')
1836
+ " First check whether the file already exists
1837
+ let fidx = s:Tlist_Get_File_Index(a:filename)
1838
+ if fidx != -1
1839
+ let file_listed = 1
1840
+ else
1841
+ let file_listed = 0
1842
+ endif
1843
+
1844
+ if !file_listed
1845
+ " Check whether this file is removed based on user request
1846
+ " If it is, then don't display the tags for this file
1847
+ if s:Tlist_User_Removed_File(a:filename)
1848
+ return
1849
+ endif
1850
+ endif
1851
+
1852
+ if file_listed && s:tlist_{fidx}_visible
1853
+ " Check whether the file tags are currently valid
1854
+ if s:tlist_{fidx}_valid
1855
+ " Goto the first line in the file
1856
+ exe s:tlist_{fidx}_start
1857
+
1858
+ " If the line is inside a fold, open the fold
1859
+ if foldclosed('.') != -1
1860
+ exe "silent! " . s:tlist_{fidx}_start . "," .
1861
+ \ s:tlist_{fidx}_end . "foldopen!"
1862
+ endif
1863
+ return
1864
+ endif
1865
+
1866
+ " Discard and remove the tags for this file from display
1867
+ call s:Tlist_Discard_TagInfo(fidx)
1868
+ call s:Tlist_Window_Remove_File_From_Display(fidx)
1869
+ endif
1870
+
1871
+ " Process and generate a list of tags defined in the file
1872
+ if !file_listed || !s:tlist_{fidx}_valid
1873
+ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype)
1874
+ if ret_fidx == -1
1875
+ return
1876
+ endif
1877
+ let fidx = ret_fidx
1878
+ endif
1879
+
1880
+ " Set report option to a huge value to prevent informational messages
1881
+ " while adding lines to the taglist window
1882
+ let old_report = &report
1883
+ set report=99999
1884
+
1885
+ if g:Tlist_Show_One_File
1886
+ " Remove the previous file
1887
+ if s:tlist_cur_file_idx != -1
1888
+ call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx)
1889
+ let s:tlist_{s:tlist_cur_file_idx}_visible = 0
1890
+ let s:tlist_{s:tlist_cur_file_idx}_start = 0
1891
+ let s:tlist_{s:tlist_cur_file_idx}_end = 0
1892
+ endif
1893
+ let s:tlist_cur_file_idx = fidx
1894
+ endif
1895
+
1896
+ " Mark the buffer as modifiable
1897
+ setlocal modifiable
1898
+
1899
+ " Add new files to the end of the window. For existing files, add them at
1900
+ " the same line where they were previously present. If the file is not
1901
+ " visible, then add it at the end
1902
+ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible
1903
+ if g:Tlist_Compact_Format
1904
+ let s:tlist_{fidx}_start = line('$')
1905
+ else
1906
+ let s:tlist_{fidx}_start = line('$') + 1
1907
+ endif
1908
+ endif
1909
+
1910
+ let s:tlist_{fidx}_visible = 1
1911
+
1912
+ " Goto the line where this file should be placed
1913
+ if g:Tlist_Compact_Format
1914
+ exe s:tlist_{fidx}_start
1915
+ else
1916
+ exe s:tlist_{fidx}_start - 1
1917
+ endif
1918
+
1919
+ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' .
1920
+ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')'
1921
+ if g:Tlist_Compact_Format == 0
1922
+ silent! put =txt
1923
+ else
1924
+ silent! put! =txt
1925
+ " Move to the next line
1926
+ exe line('.') + 1
1927
+ endif
1928
+ let file_start = s:tlist_{fidx}_start
1929
+
1930
+ " Add the tag names grouped by tag type to the buffer with a title
1931
+ let i = 1
1932
+ let ttype_cnt = s:tlist_{a:ftype}_count
1933
+ while i <= ttype_cnt
1934
+ let ttype = s:tlist_{a:ftype}_{i}_name
1935
+ " Add the tag type only if there are tags for that type
1936
+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype
1937
+ let ttype_txt = {fidx_ttype}
1938
+ if ttype_txt != ''
1939
+ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname
1940
+ if g:Tlist_Compact_Format == 0
1941
+ let ttype_start_lnum = line('.') + 1
1942
+ silent! put =txt
1943
+ else
1944
+ let ttype_start_lnum = line('.')
1945
+ silent! put! =txt
1946
+ endif
1947
+ silent! put =ttype_txt
1948
+
1949
+ let {fidx_ttype}_offset = ttype_start_lnum - file_start
1950
+
1951
+ " create a fold for this tag type
1952
+ let fold_start = ttype_start_lnum
1953
+ let fold_end = fold_start + {fidx_ttype}_count
1954
+ exe fold_start . ',' . fold_end . 'fold'
1955
+
1956
+ " Adjust the cursor position
1957
+ if g:Tlist_Compact_Format == 0
1958
+ exe ttype_start_lnum + {fidx_ttype}_count
1959
+ else
1960
+ exe ttype_start_lnum + {fidx_ttype}_count + 1
1961
+ endif
1962
+
1963
+ if g:Tlist_Compact_Format == 0
1964
+ " Separate the tag types by a empty line
1965
+ silent! put =''
1966
+ endif
1967
+ endif
1968
+ let i = i + 1
1969
+ endwhile
1970
+
1971
+ if s:tlist_{fidx}_tag_count == 0
1972
+ if g:Tlist_Compact_Format == 0
1973
+ silent! put =''
1974
+ endif
1975
+ endif
1976
+
1977
+ let s:tlist_{fidx}_end = line('.') - 1
1978
+
1979
+ " Create a fold for the entire file
1980
+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold'
1981
+ exe 'silent! ' . s:tlist_{fidx}_start . ',' .
1982
+ \ s:tlist_{fidx}_end . 'foldopen!'
1983
+
1984
+ " Goto the starting line for this file,
1985
+ exe s:tlist_{fidx}_start
1986
+
1987
+ if s:tlist_app_name == "winmanager"
1988
+ " To handle a bug in the winmanager plugin, add a space at the
1989
+ " last line
1990
+ call setline('$', ' ')
1991
+ endif
1992
+
1993
+ " Mark the buffer as not modifiable
1994
+ setlocal nomodifiable
1995
+
1996
+ " Restore the report option
1997
+ let &report = old_report
1998
+
1999
+ " Update the start and end line numbers for all the files following this
2000
+ " file
2001
+ let start = s:tlist_{fidx}_start
2002
+ " include the empty line after the last line
2003
+ if g:Tlist_Compact_Format
2004
+ let end = s:tlist_{fidx}_end
2005
+ else
2006
+ let end = s:tlist_{fidx}_end + 1
2007
+ endif
2008
+ call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1)
2009
+
2010
+ " Now that we have updated the taglist window, update the tags
2011
+ " menu (if present)
2012
+ if g:Tlist_Show_Menu
2013
+ call s:Tlist_Menu_Update_File(1)
2014
+ endif
2015
+ endfunction
2016
+
2017
+ " Tlist_Init_File
2018
+ " Initialize the variables for a new file
2019
+ function! s:Tlist_Init_File(filename, ftype)
2020
+ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')')
2021
+ " Add new files at the end of the list
2022
+ let fidx = s:tlist_file_count
2023
+ let s:tlist_file_count = s:tlist_file_count + 1
2024
+ " Add the new file name to the taglist list of file names
2025
+ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n"
2026
+
2027
+ " Initialize the file variables
2028
+ let s:tlist_{fidx}_filename = a:filename
2029
+ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type
2030
+ let s:tlist_{fidx}_filetype = a:ftype
2031
+ let s:tlist_{fidx}_mtime = -1
2032
+ let s:tlist_{fidx}_start = 0
2033
+ let s:tlist_{fidx}_end = 0
2034
+ let s:tlist_{fidx}_valid = 0
2035
+ let s:tlist_{fidx}_visible = 0
2036
+ let s:tlist_{fidx}_tag_count = 0
2037
+ let s:tlist_{fidx}_menu_cmd = ''
2038
+
2039
+ " Initialize the tag type variables
2040
+ let i = 1
2041
+ while i <= s:tlist_{a:ftype}_count
2042
+ let ttype = s:tlist_{a:ftype}_{i}_name
2043
+ let s:tlist_{fidx}_{ttype} = ''
2044
+ let s:tlist_{fidx}_{ttype}_offset = 0
2045
+ let s:tlist_{fidx}_{ttype}_count = 0
2046
+ let i = i + 1
2047
+ endwhile
2048
+
2049
+ return fidx
2050
+ endfunction
2051
+
2052
+ " Tlist_Get_Tag_Type_By_Tag
2053
+ " Return the tag type for the specified tag index
2054
+ function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx)
2055
+ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type'
2056
+
2057
+ " Already parsed and have the tag name
2058
+ if exists(ttype_var)
2059
+ return {ttype_var}
2060
+ endif
2061
+
2062
+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag
2063
+ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line)
2064
+
2065
+ return {ttype_var}
2066
+ endfunction
2067
+
2068
+ " Tlist_Get_Tag_Prototype
2069
+ function! s:Tlist_Get_Tag_Prototype(fidx, tidx)
2070
+ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto'
2071
+
2072
+ " Already parsed and have the tag prototype
2073
+ if exists(tproto_var)
2074
+ return {tproto_var}
2075
+ endif
2076
+
2077
+ " Parse and extract the tag prototype
2078
+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag
2079
+ let start = stridx(tag_line, '/^') + 2
2080
+ let end = stridx(tag_line, '/;"' . "\t")
2081
+ if tag_line[end - 1] == '$'
2082
+ let end = end -1
2083
+ endif
2084
+ let tag_proto = strpart(tag_line, start, end - start)
2085
+ let {tproto_var} = substitute(tag_proto, '\s*', '', '')
2086
+
2087
+ return {tproto_var}
2088
+ endfunction
2089
+
2090
+ " Tlist_Get_Tag_SearchPat
2091
+ function! s:Tlist_Get_Tag_SearchPat(fidx, tidx)
2092
+ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat'
2093
+
2094
+ " Already parsed and have the tag search pattern
2095
+ if exists(tpat_var)
2096
+ return {tpat_var}
2097
+ endif
2098
+
2099
+ " Parse and extract the tag search pattern
2100
+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag
2101
+ let start = stridx(tag_line, '/^') + 2
2102
+ let end = stridx(tag_line, '/;"' . "\t")
2103
+ if tag_line[end - 1] == '$'
2104
+ let end = end -1
2105
+ endif
2106
+ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) .
2107
+ \ (tag_line[end] == '$' ? '\$' : '')
2108
+
2109
+ return {tpat_var}
2110
+ endfunction
2111
+
2112
+ " Tlist_Get_Tag_Linenum
2113
+ " Return the tag line number, given the tag index
2114
+ function! s:Tlist_Get_Tag_Linenum(fidx, tidx)
2115
+ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum'
2116
+
2117
+ " Already parsed and have the tag line number
2118
+ if exists(tline_var)
2119
+ return {tline_var}
2120
+ endif
2121
+
2122
+ " Parse and extract the tag line number
2123
+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag
2124
+ let start = strridx(tag_line, 'line:') + 5
2125
+ let end = strridx(tag_line, "\t")
2126
+ if end < start
2127
+ let {tline_var} = strpart(tag_line, start) + 0
2128
+ else
2129
+ let {tline_var} = strpart(tag_line, start, end - start) + 0
2130
+ endif
2131
+
2132
+ return {tline_var}
2133
+ endfunction
2134
+
2135
+ " Tlist_Parse_Tagline
2136
+ " Parse a tag line from the ctags output. Separate the tag output based on the
2137
+ " tag type and store it in the tag type variable.
2138
+ " The format of each line in the ctags output is:
2139
+ "
2140
+ " tag_name<TAB>file_name<TAB>ex_cmd;"<TAB>extension_fields
2141
+ "
2142
+ function! s:Tlist_Parse_Tagline(tag_line)
2143
+ if a:tag_line == ''
2144
+ " Skip empty lines
2145
+ return
2146
+ endif
2147
+
2148
+ " Extract the tag type
2149
+ let ttype = s:Tlist_Extract_Tagtype(a:tag_line)
2150
+
2151
+ " Make sure the tag type is a valid and supported one
2152
+ if ttype == '' || stridx(s:ctags_flags, ttype) == -1
2153
+ " Line is not in proper tags format or Tag type is not supported
2154
+ return
2155
+ endif
2156
+
2157
+ " Update the total tag count
2158
+ let s:tidx = s:tidx + 1
2159
+
2160
+ " The following variables are used to optimize this code. Vim is slow in
2161
+ " using curly brace names. To reduce the amount of processing needed, the
2162
+ " curly brace variables are pre-processed here
2163
+ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx
2164
+ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype
2165
+
2166
+ " Update the count of this tag type
2167
+ let ttype_idx = {fidx_ttype}_count + 1
2168
+ let {fidx_ttype}_count = ttype_idx
2169
+
2170
+ " Store the ctags output for this tag
2171
+ let {fidx_tidx}_tag = a:tag_line
2172
+
2173
+ " Store the tag index and the tag type index (back pointers)
2174
+ let {fidx_ttype}_{ttype_idx} = s:tidx
2175
+ let {fidx_tidx}_ttype_idx = ttype_idx
2176
+
2177
+ " Extract the tag name
2178
+ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t"))
2179
+
2180
+ " Extract the tag scope/prototype
2181
+ if g:Tlist_Display_Prototype
2182
+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx)
2183
+ else
2184
+ let ttxt = ' ' . tag_name
2185
+
2186
+ " Add the tag scope, if it is available and is configured. Tag
2187
+ " scope is the last field after the 'line:<num>\t' field
2188
+ if g:Tlist_Display_Tag_Scope
2189
+ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line)
2190
+ if tag_scope != ''
2191
+ let ttxt = ttxt . ' [' . tag_scope . ']'
2192
+ endif
2193
+ endif
2194
+ endif
2195
+
2196
+ " Add this tag to the tag type variable
2197
+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n"
2198
+
2199
+ " Save the tag name
2200
+ let {fidx_tidx}_tag_name = tag_name
2201
+ endfunction
2202
+
2203
+ " Tlist_Process_File
2204
+ " Get the list of tags defined in the specified file and store them
2205
+ " in Vim variables. Returns the file index where the tags are stored.
2206
+ function! s:Tlist_Process_File(filename, ftype)
2207
+ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' .
2208
+ \ a:ftype . ')')
2209
+ " Check whether this file is supported
2210
+ if s:Tlist_Skip_File(a:filename, a:ftype)
2211
+ return -1
2212
+ endif
2213
+
2214
+ " If the tag types for this filetype are not yet created, then create
2215
+ " them now
2216
+ let var = 's:tlist_' . a:ftype . '_count'
2217
+ if !exists(var)
2218
+ if s:Tlist_FileType_Init(a:ftype) == 0
2219
+ return -1
2220
+ endif
2221
+ endif
2222
+
2223
+ " If this file is already processed, then use the cached values
2224
+ let fidx = s:Tlist_Get_File_Index(a:filename)
2225
+ if fidx == -1
2226
+ " First time, this file is loaded
2227
+ let fidx = s:Tlist_Init_File(a:filename, a:ftype)
2228
+ else
2229
+ " File was previously processed. Discard the tag information
2230
+ call s:Tlist_Discard_TagInfo(fidx)
2231
+ endif
2232
+
2233
+ let s:tlist_{fidx}_valid = 1
2234
+
2235
+ " Exuberant ctags arguments to generate a tag list
2236
+ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks '
2237
+
2238
+ " Form the ctags argument depending on the sort type
2239
+ if s:tlist_{fidx}_sort_type == 'name'
2240
+ let ctags_args = ctags_args . '--sort=yes'
2241
+ else
2242
+ let ctags_args = ctags_args . '--sort=no'
2243
+ endif
2244
+
2245
+ " Add the filetype specific arguments
2246
+ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args
2247
+
2248
+ " Ctags command to produce output with regexp for locating the tags
2249
+ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args
2250
+ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"'
2251
+
2252
+ if &shellxquote == '"'
2253
+ " Double-quotes within double-quotes will not work in the
2254
+ " command-line.If the 'shellxquote' option is set to double-quotes,
2255
+ " then escape the double-quotes in the ctags command-line.
2256
+ let ctags_cmd = escape(ctags_cmd, '"')
2257
+ endif
2258
+
2259
+ " In Windows 95, if not using cygwin, disable the 'shellslash'
2260
+ " option. Otherwise, this will cause problems when running the
2261
+ " ctags command.
2262
+ if has('win95') && !has('win32unix')
2263
+ let old_shellslash = &shellslash
2264
+ set noshellslash
2265
+ endif
2266
+
2267
+ if has('win32') && !has('win32unix') && !has('win95')
2268
+ \ && (&shell =~ 'cmd.exe')
2269
+ " Windows does not correctly deal with commands that have more than 1
2270
+ " set of double quotes. It will strip them all resulting in:
2271
+ " 'C:\Program' is not recognized as an internal or external command
2272
+ " operable program or batch file. To work around this, place the
2273
+ " command inside a batch file and call the batch file.
2274
+ " Do this only on Win2K, WinXP and above.
2275
+ " Contributed by: David Fishburn.
2276
+ let s:taglist_tempfile = fnamemodify(tempname(), ':h') .
2277
+ \ '\taglist.cmd'
2278
+ exe 'redir! > ' . s:taglist_tempfile
2279
+ silent echo ctags_cmd
2280
+ redir END
2281
+
2282
+ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd)
2283
+ let ctags_cmd = '"' . s:taglist_tempfile . '"'
2284
+ endif
2285
+
2286
+ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd)
2287
+
2288
+ " Run ctags and get the tag list
2289
+ let cmd_output = system(ctags_cmd)
2290
+
2291
+ " Restore the value of the 'shellslash' option.
2292
+ if has('win95') && !has('win32unix')
2293
+ let &shellslash = old_shellslash
2294
+ endif
2295
+
2296
+ if exists('s:taglist_tempfile')
2297
+ " Delete the temporary cmd file created on MS-Windows
2298
+ call delete(s:taglist_tempfile)
2299
+ endif
2300
+
2301
+ " Handle errors
2302
+ if v:shell_error
2303
+ let msg = "Taglist: Failed to generate tags for " . a:filename
2304
+ call s:Tlist_Warning_Msg(msg)
2305
+ if cmd_output != ''
2306
+ call s:Tlist_Warning_Msg(cmd_output)
2307
+ endif
2308
+ return fidx
2309
+ endif
2310
+
2311
+ " Store the modification time for the file
2312
+ let s:tlist_{fidx}_mtime = getftime(a:filename)
2313
+
2314
+ " No tags for current file
2315
+ if cmd_output == ''
2316
+ call s:Tlist_Log_Msg('No tags defined in ' . a:filename)
2317
+ return fidx
2318
+ endif
2319
+
2320
+ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename)
2321
+
2322
+ if v:version > 601
2323
+ " The following script local variables are used by the
2324
+ " Tlist_Parse_Tagline() function.
2325
+ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags
2326
+ let s:fidx = fidx
2327
+ let s:tidx = 0
2328
+
2329
+ " Process the ctags output one line at a time. The substitute()
2330
+ " command is used to parse the tag lines instead of using the
2331
+ " matchstr()/stridx()/strpart() functions for performance reason
2332
+ call substitute(cmd_output, "\\([^\n]\\+\\)\n",
2333
+ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g')
2334
+
2335
+ " Save the number of tags for this file
2336
+ let s:tlist_{fidx}_tag_count = s:tidx
2337
+
2338
+ " The following script local variables are no longer needed
2339
+ unlet! s:ctags_flags
2340
+ unlet! s:tidx
2341
+ unlet! s:fidx
2342
+ else
2343
+ " Due to a bug in Vim earlier than version 6.1,
2344
+ " we cannot use substitute() to parse the ctags output.
2345
+ " Instead the slow str*() functions are used
2346
+ let ctags_flags = s:tlist_{a:ftype}_ctags_flags
2347
+ let tidx = 0
2348
+
2349
+ while cmd_output != ''
2350
+ " Extract one line at a time
2351
+ let idx = stridx(cmd_output, "\n")
2352
+ let one_line = strpart(cmd_output, 0, idx)
2353
+ " Remove the line from the tags output
2354
+ let cmd_output = strpart(cmd_output, idx + 1)
2355
+
2356
+ if one_line == ''
2357
+ " Line is not in proper tags format
2358
+ continue
2359
+ endif
2360
+
2361
+ " Extract the tag type
2362
+ let ttype = s:Tlist_Extract_Tagtype(one_line)
2363
+
2364
+ " Make sure the tag type is a valid and supported one
2365
+ if ttype == '' || stridx(ctags_flags, ttype) == -1
2366
+ " Line is not in proper tags format or Tag type is not
2367
+ " supported
2368
+ continue
2369
+ endif
2370
+
2371
+ " Update the total tag count
2372
+ let tidx = tidx + 1
2373
+
2374
+ " The following variables are used to optimize this code. Vim is
2375
+ " slow in using curly brace names. To reduce the amount of
2376
+ " processing needed, the curly brace variables are pre-processed
2377
+ " here
2378
+ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx
2379
+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype
2380
+
2381
+ " Update the count of this tag type
2382
+ let ttype_idx = {fidx_ttype}_count + 1
2383
+ let {fidx_ttype}_count = ttype_idx
2384
+
2385
+ " Store the ctags output for this tag
2386
+ let {fidx_tidx}_tag = one_line
2387
+
2388
+ " Store the tag index and the tag type index (back pointers)
2389
+ let {fidx_ttype}_{ttype_idx} = tidx
2390
+ let {fidx_tidx}_ttype_idx = ttype_idx
2391
+
2392
+ " Extract the tag name
2393
+ let tag_name = strpart(one_line, 0, stridx(one_line, "\t"))
2394
+
2395
+ " Extract the tag scope/prototype
2396
+ if g:Tlist_Display_Prototype
2397
+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx)
2398
+ else
2399
+ let ttxt = ' ' . tag_name
2400
+
2401
+ " Add the tag scope, if it is available and is configured. Tag
2402
+ " scope is the last field after the 'line:<num>\t' field
2403
+ if g:Tlist_Display_Tag_Scope
2404
+ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line)
2405
+ if tag_scope != ''
2406
+ let ttxt = ttxt . ' [' . tag_scope . ']'
2407
+ endif
2408
+ endif
2409
+ endif
2410
+
2411
+ " Add this tag to the tag type variable
2412
+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n"
2413
+
2414
+ " Save the tag name
2415
+ let {fidx_tidx}_tag_name = tag_name
2416
+ endwhile
2417
+
2418
+ " Save the number of tags for this file
2419
+ let s:tlist_{fidx}_tag_count = tidx
2420
+ endif
2421
+
2422
+ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count .
2423
+ \ ' tags in ' . a:filename)
2424
+
2425
+ return fidx
2426
+ endfunction
2427
+
2428
+ " Tlist_Update_File
2429
+ " Update the tags for a file (if needed)
2430
+ function! Tlist_Update_File(filename, ftype)
2431
+ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')')
2432
+ " If the file doesn't support tag listing, skip it
2433
+ if s:Tlist_Skip_File(a:filename, a:ftype)
2434
+ return
2435
+ endif
2436
+
2437
+ " Convert the file name to a full path
2438
+ let fname = fnamemodify(a:filename, ':p')
2439
+
2440
+ " First check whether the file already exists
2441
+ let fidx = s:Tlist_Get_File_Index(fname)
2442
+
2443
+ if fidx != -1 && s:tlist_{fidx}_valid
2444
+ " File exists and the tags are valid
2445
+ " Check whether the file was modified after the last tags update
2446
+ " If it is modified, then update the tags
2447
+ if s:tlist_{fidx}_mtime == getftime(fname)
2448
+ return
2449
+ endif
2450
+ else
2451
+ " If the tags were removed previously based on a user request,
2452
+ " as we are going to update the tags (based on the user request),
2453
+ " remove the filename from the deleted list
2454
+ call s:Tlist_Update_Remove_List(fname, 0)
2455
+ endif
2456
+
2457
+ " If the taglist window is opened, update it
2458
+ let winnum = bufwinnr(g:TagList_title)
2459
+ if winnum == -1
2460
+ " Taglist window is not present. Just update the taglist
2461
+ " and return
2462
+ call s:Tlist_Process_File(fname, a:ftype)
2463
+ else
2464
+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1
2465
+ " If tags for only one file are displayed and we are not
2466
+ " updating the tags for that file, then no need to
2467
+ " refresh the taglist window. Otherwise, the taglist
2468
+ " window should be updated.
2469
+ if s:tlist_{s:tlist_cur_file_idx}_filename != fname
2470
+ call s:Tlist_Process_File(fname, a:ftype)
2471
+ return
2472
+ endif
2473
+ endif
2474
+
2475
+ " Save the current window number
2476
+ let save_winnr = winnr()
2477
+
2478
+ " Goto the taglist window
2479
+ call s:Tlist_Window_Goto_Window()
2480
+
2481
+ " Save the cursor position
2482
+ let save_line = line('.')
2483
+ let save_col = col('.')
2484
+
2485
+ " Update the taglist window
2486
+ call s:Tlist_Window_Refresh_File(fname, a:ftype)
2487
+
2488
+ " Restore the cursor position
2489
+ if v:version >= 601
2490
+ call cursor(save_line, save_col)
2491
+ else
2492
+ exe save_line
2493
+ exe 'normal! ' . save_col . '|'
2494
+ endif
2495
+
2496
+ if winnr() != save_winnr
2497
+ " Go back to the original window
2498
+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w')
2499
+ endif
2500
+ endif
2501
+
2502
+ " Update the taglist menu
2503
+ if g:Tlist_Show_Menu
2504
+ call s:Tlist_Menu_Update_File(1)
2505
+ endif
2506
+ endfunction
2507
+
2508
+ " Tlist_Window_Close
2509
+ " Close the taglist window
2510
+ function! s:Tlist_Window_Close()
2511
+ call s:Tlist_Log_Msg('Tlist_Window_Close()')
2512
+ " Make sure the taglist window exists
2513
+ let winnum = bufwinnr(g:TagList_title)
2514
+ if winnum == -1
2515
+ call s:Tlist_Warning_Msg('Error: Taglist window is not open')
2516
+ return
2517
+ endif
2518
+
2519
+ if winnr() == winnum
2520
+ " Already in the taglist window. Close it and return
2521
+ if winbufnr(2) != -1
2522
+ " If a window other than the taglist window is open,
2523
+ " then only close the taglist window.
2524
+ close
2525
+ endif
2526
+ else
2527
+ " Goto the taglist window, close it and then come back to the
2528
+ " original window
2529
+ let curbufnr = bufnr('%')
2530
+ exe winnum . 'wincmd w'
2531
+ close
2532
+ " Need to jump back to the original window only if we are not
2533
+ " already in that window
2534
+ let winnum = bufwinnr(curbufnr)
2535
+ if winnr() != winnum
2536
+ exe winnum . 'wincmd w'
2537
+ endif
2538
+ endif
2539
+ endfunction
2540
+
2541
+ " Tlist_Window_Mark_File_Window
2542
+ " Mark the current window as the file window to use when jumping to a tag.
2543
+ " Only if the current window is a non-plugin, non-preview and non-taglist
2544
+ " window
2545
+ function! s:Tlist_Window_Mark_File_Window()
2546
+ if getbufvar('%', '&buftype') == '' && !&previewwindow
2547
+ let w:tlist_file_window = "yes"
2548
+ endif
2549
+ endfunction
2550
+
2551
+ " Tlist_Window_Open
2552
+ " Open and refresh the taglist window
2553
+ function! s:Tlist_Window_Open()
2554
+ call s:Tlist_Log_Msg('Tlist_Window_Open()')
2555
+ " If the window is open, jump to it
2556
+ let winnum = bufwinnr(g:TagList_title)
2557
+ if winnum != -1
2558
+ " Jump to the existing window
2559
+ if winnr() != winnum
2560
+ exe winnum . 'wincmd w'
2561
+ endif
2562
+ return
2563
+ endif
2564
+
2565
+ if s:tlist_app_name == "winmanager"
2566
+ " Taglist plugin is no longer part of the winmanager app
2567
+ let s:tlist_app_name = "none"
2568
+ endif
2569
+
2570
+ " Get the filename and filetype for the specified buffer
2571
+ let curbuf_name = fnamemodify(bufname('%'), ':p')
2572
+ let curbuf_ftype = s:Tlist_Get_Buffer_Filetype('%')
2573
+ let cur_lnum = line('.')
2574
+
2575
+ " Mark the current window as the desired window to open a file when a tag
2576
+ " is selected.
2577
+ call s:Tlist_Window_Mark_File_Window()
2578
+
2579
+ " Open the taglist window
2580
+ call s:Tlist_Window_Create()
2581
+
2582
+ call s:Tlist_Window_Refresh()
2583
+
2584
+ if g:Tlist_Show_One_File
2585
+ " Add only the current buffer and file
2586
+ "
2587
+ " If the file doesn't support tag listing, skip it
2588
+ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype)
2589
+ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype)
2590
+ endif
2591
+ endif
2592
+
2593
+ if g:Tlist_File_Fold_Auto_Close
2594
+ " Open the fold for the current file, as all the folds in
2595
+ " the taglist window are closed
2596
+ let fidx = s:Tlist_Get_File_Index(curbuf_name)
2597
+ if fidx != -1
2598
+ exe "silent! " . s:tlist_{fidx}_start . "," .
2599
+ \ s:tlist_{fidx}_end . "foldopen!"
2600
+ endif
2601
+ endif
2602
+
2603
+ " Highlight the current tag
2604
+ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1)
2605
+ endfunction
2606
+
2607
+ " Tlist_Window_Toggle()
2608
+ " Open or close a taglist window
2609
+ function! s:Tlist_Window_Toggle()
2610
+ call s:Tlist_Log_Msg('Tlist_Window_Toggle()')
2611
+ " If taglist window is open then close it.
2612
+ let winnum = bufwinnr(g:TagList_title)
2613
+ if winnum != -1
2614
+ call s:Tlist_Window_Close()
2615
+ return
2616
+ endif
2617
+
2618
+ call s:Tlist_Window_Open()
2619
+
2620
+ " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not
2621
+ " set
2622
+ if !g:Tlist_GainFocus_On_ToggleOpen
2623
+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p')
2624
+ endif
2625
+
2626
+ " Update the taglist menu
2627
+ if g:Tlist_Show_Menu
2628
+ call s:Tlist_Menu_Update_File(0)
2629
+ endif
2630
+ endfunction
2631
+
2632
+ " Tlist_Process_Filelist
2633
+ " Process multiple files. Each filename is separated by "\n"
2634
+ " Returns the number of processed files
2635
+ function! s:Tlist_Process_Filelist(file_names)
2636
+ let flist = a:file_names
2637
+
2638
+ " Enable lazy screen updates
2639
+ let old_lazyredraw = &lazyredraw
2640
+ set lazyredraw
2641
+
2642
+ " Keep track of the number of processed files
2643
+ let fcnt = 0
2644
+
2645
+ " Process one file at a time
2646
+ while flist != ''
2647
+ let nl_idx = stridx(flist, "\n")
2648
+ let one_file = strpart(flist, 0, nl_idx)
2649
+
2650
+ " Remove the filename from the list
2651
+ let flist = strpart(flist, nl_idx + 1)
2652
+
2653
+ if one_file == ''
2654
+ continue
2655
+ endif
2656
+
2657
+ " Skip directories
2658
+ if isdirectory(one_file)
2659
+ continue
2660
+ endif
2661
+
2662
+ let ftype = s:Tlist_Detect_Filetype(one_file)
2663
+
2664
+ echon "\r "
2665
+ echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t')
2666
+
2667
+ let fcnt = fcnt + 1
2668
+
2669
+ call Tlist_Update_File(one_file, ftype)
2670
+ endwhile
2671
+
2672
+ " Clear the displayed informational messages
2673
+ echon "\r "
2674
+
2675
+ " Restore the previous state
2676
+ let &lazyredraw = old_lazyredraw
2677
+
2678
+ return fcnt
2679
+ endfunction
2680
+
2681
+ " Tlist_Process_Dir
2682
+ " Process the files in a directory matching the specified pattern
2683
+ function! s:Tlist_Process_Dir(dir_name, pat)
2684
+ let flist = glob(a:dir_name . '/' . a:pat) . "\n"
2685
+
2686
+ let fcnt = s:Tlist_Process_Filelist(flist)
2687
+
2688
+ let len = strlen(a:dir_name)
2689
+ if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/'
2690
+ let glob_expr = a:dir_name . '*'
2691
+ else
2692
+ let glob_expr = a:dir_name . '/*'
2693
+ endif
2694
+ let all_files = glob(glob_expr) . "\n"
2695
+
2696
+ while all_files != ''
2697
+ let nl_idx = stridx(all_files, "\n")
2698
+ let one_file = strpart(all_files, 0, nl_idx)
2699
+
2700
+ let all_files = strpart(all_files, nl_idx + 1)
2701
+ if one_file == ''
2702
+ continue
2703
+ endif
2704
+
2705
+ " Skip non-directory names
2706
+ if !isdirectory(one_file)
2707
+ continue
2708
+ endif
2709
+
2710
+ echon "\r "
2711
+ echon "\rProcessing files in directory " . fnamemodify(one_file, ':t')
2712
+ let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat)
2713
+ endwhile
2714
+
2715
+ return fcnt
2716
+ endfunction
2717
+
2718
+ " Tlist_Add_Files_Recursive
2719
+ " Add files recursively from a directory
2720
+ function! s:Tlist_Add_Files_Recursive(dir, ...)
2721
+ let dir_name = fnamemodify(a:dir, ':p')
2722
+ if !isdirectory(dir_name)
2723
+ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory')
2724
+ return
2725
+ endif
2726
+
2727
+ if a:0 == 1
2728
+ " User specified file pattern
2729
+ let pat = a:1
2730
+ else
2731
+ " Default file pattern
2732
+ let pat = '*'
2733
+ endif
2734
+
2735
+ echon "\r "
2736
+ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t')
2737
+ let fcnt = s:Tlist_Process_Dir(dir_name, pat)
2738
+
2739
+ echon "\rAdded " . fcnt . " files to the taglist"
2740
+ endfunction
2741
+
2742
+ " Tlist_Add_Files
2743
+ " Add the specified list of files to the taglist
2744
+ function! s:Tlist_Add_Files(...)
2745
+ let flist = ''
2746
+ let i = 1
2747
+
2748
+ " Get all the files matching the file patterns supplied as argument
2749
+ while i <= a:0
2750
+ let flist = flist . glob(a:{i}) . "\n"
2751
+ let i = i + 1
2752
+ endwhile
2753
+
2754
+ if flist == ''
2755
+ call s:Tlist_Warning_Msg('Error: No matching files are found')
2756
+ return
2757
+ endif
2758
+
2759
+ let fcnt = s:Tlist_Process_Filelist(flist)
2760
+ echon "\rAdded " . fcnt . " files to the taglist"
2761
+ endfunction
2762
+
2763
+ " Tlist_Extract_Tagtype
2764
+ " Extract the tag type from the tag text
2765
+ function! s:Tlist_Extract_Tagtype(tag_line)
2766
+ " The tag type is after the tag prototype field. The prototype field
2767
+ " ends with the /;"\t string. We add 4 at the end to skip the characters
2768
+ " in this special string..
2769
+ let start = strridx(a:tag_line, '/;"' . "\t") + 4
2770
+ let end = strridx(a:tag_line, 'line:') - 1
2771
+ let ttype = strpart(a:tag_line, start, end - start)
2772
+
2773
+ return ttype
2774
+ endfunction
2775
+
2776
+ " Tlist_Extract_Tag_Scope
2777
+ " Extract the tag scope from the tag text
2778
+ function! s:Tlist_Extract_Tag_Scope(tag_line)
2779
+ let start = strridx(a:tag_line, 'line:')
2780
+ let end = strridx(a:tag_line, "\t")
2781
+ if end <= start
2782
+ return ''
2783
+ endif
2784
+
2785
+ let tag_scope = strpart(a:tag_line, end + 1)
2786
+ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1)
2787
+
2788
+ return tag_scope
2789
+ endfunction
2790
+
2791
+ " Tlist_Refresh()
2792
+ " Refresh the taglist
2793
+ function! s:Tlist_Refresh()
2794
+ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' .
2795
+ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')')
2796
+ " If we are entering the buffer from one of the taglist functions, then
2797
+ " no need to refresh the taglist window again.
2798
+ if s:Tlist_Skip_Refresh
2799
+ " We still need to update the taglist menu
2800
+ if g:Tlist_Show_Menu
2801
+ call s:Tlist_Menu_Update_File(0)
2802
+ endif
2803
+ return
2804
+ endif
2805
+
2806
+ " If part of the winmanager plugin and not configured to process
2807
+ " tags always and not configured to display the tags menu, then return
2808
+ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always
2809
+ \ && !g:Tlist_Show_Menu
2810
+ return
2811
+ endif
2812
+
2813
+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help
2814
+ if &buftype != ''
2815
+ return
2816
+ endif
2817
+
2818
+ let filename = fnamemodify(bufname('%'), ':p')
2819
+ let ftype = s:Tlist_Get_Buffer_Filetype('%')
2820
+
2821
+ " If the file doesn't support tag listing, skip it
2822
+ if s:Tlist_Skip_File(filename, ftype)
2823
+ return
2824
+ endif
2825
+
2826
+ let tlist_win = bufwinnr(g:TagList_title)
2827
+
2828
+ " If the taglist window is not opened and not configured to process
2829
+ " tags always and not displaying the tags menu, then return
2830
+ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu
2831
+ return
2832
+ endif
2833
+
2834
+ let fidx = s:Tlist_Get_File_Index(filename)
2835
+ if fidx == -1
2836
+ " Check whether this file is removed based on user request
2837
+ " If it is, then don't display the tags for this file
2838
+ if s:Tlist_User_Removed_File(filename)
2839
+ return
2840
+ endif
2841
+
2842
+ " If the taglist should not be auto updated, then return
2843
+ if !g:Tlist_Auto_Update
2844
+ return
2845
+ endif
2846
+ endif
2847
+
2848
+ let cur_lnum = line('.')
2849
+
2850
+ if fidx == -1
2851
+ " Update the tags for the file
2852
+ let fidx = s:Tlist_Process_File(filename, ftype)
2853
+ else
2854
+ let mtime = getftime(filename)
2855
+ if s:tlist_{fidx}_mtime != mtime
2856
+ " Invalidate the tags listed for this file
2857
+ let s:tlist_{fidx}_valid = 0
2858
+
2859
+ " Update the taglist and the window
2860
+ call Tlist_Update_File(filename, ftype)
2861
+
2862
+ " Store the new file modification time
2863
+ let s:tlist_{fidx}_mtime = mtime
2864
+ endif
2865
+ endif
2866
+
2867
+ " Update the taglist window
2868
+ if tlist_win != -1
2869
+ " Disable screen updates
2870
+ let old_lazyredraw = &lazyredraw
2871
+ set nolazyredraw
2872
+
2873
+ " Save the current window number
2874
+ let save_winnr = winnr()
2875
+
2876
+ " Goto the taglist window
2877
+ call s:Tlist_Window_Goto_Window()
2878
+
2879
+ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter
2880
+ " Save the cursor position
2881
+ let save_line = line('.')
2882
+ let save_col = col('.')
2883
+ endif
2884
+
2885
+ " Update the taglist window
2886
+ call s:Tlist_Window_Refresh_File(filename, ftype)
2887
+
2888
+ " Open the fold for the file
2889
+ exe "silent! " . s:tlist_{fidx}_start . "," .
2890
+ \ s:tlist_{fidx}_end . "foldopen!"
2891
+
2892
+ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag
2893
+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx
2894
+ " If displaying tags for only one file in the taglist
2895
+ " window and about to display the tags for a new file,
2896
+ " then center the current tag line for the new file
2897
+ let center_tag_line = 1
2898
+ else
2899
+ let center_tag_line = 0
2900
+ endif
2901
+
2902
+ " Highlight the current tag
2903
+ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line)
2904
+ else
2905
+ " Restore the cursor position
2906
+ if v:version >= 601
2907
+ call cursor(save_line, save_col)
2908
+ else
2909
+ exe save_line
2910
+ exe 'normal! ' . save_col . '|'
2911
+ endif
2912
+ endif
2913
+
2914
+ " Jump back to the original window
2915
+ if save_winnr != winnr()
2916
+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w')
2917
+ endif
2918
+
2919
+ " Restore screen updates
2920
+ let &lazyredraw = old_lazyredraw
2921
+ endif
2922
+
2923
+ " Update the taglist menu
2924
+ if g:Tlist_Show_Menu
2925
+ call s:Tlist_Menu_Update_File(0)
2926
+ endif
2927
+ endfunction
2928
+
2929
+ " Tlist_Change_Sort()
2930
+ " Change the sort order of the tag listing
2931
+ " caller == 'cmd', command used in the taglist window
2932
+ " caller == 'menu', taglist menu
2933
+ " action == 'toggle', toggle sort from name to order and vice versa
2934
+ " action == 'set', set the sort order to sort_type
2935
+ function! s:Tlist_Change_Sort(caller, action, sort_type)
2936
+ call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller .
2937
+ \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')')
2938
+ if a:caller == 'cmd'
2939
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.'))
2940
+ if fidx == -1
2941
+ return
2942
+ endif
2943
+
2944
+ " Remove the previous highlighting
2945
+ match none
2946
+ elseif a:caller == 'menu'
2947
+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p'))
2948
+ if fidx == -1
2949
+ return
2950
+ endif
2951
+ endif
2952
+
2953
+ if a:action == 'toggle'
2954
+ let sort_type = s:tlist_{fidx}_sort_type
2955
+
2956
+ " Toggle the sort order from 'name' to 'order' and vice versa
2957
+ if sort_type == 'name'
2958
+ let s:tlist_{fidx}_sort_type = 'order'
2959
+ else
2960
+ let s:tlist_{fidx}_sort_type = 'name'
2961
+ endif
2962
+ else
2963
+ let s:tlist_{fidx}_sort_type = a:sort_type
2964
+ endif
2965
+
2966
+ " Invalidate the tags listed for this file
2967
+ let s:tlist_{fidx}_valid = 0
2968
+
2969
+ if a:caller == 'cmd'
2970
+ " Save the current line for later restoration
2971
+ let curline = '\V\^' . getline('.') . '\$'
2972
+
2973
+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename,
2974
+ \ s:tlist_{fidx}_filetype)
2975
+
2976
+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!'
2977
+
2978
+ " Go back to the cursor line before the tag list is sorted
2979
+ call search(curline, 'w')
2980
+
2981
+ call s:Tlist_Menu_Update_File(1)
2982
+ else
2983
+ call s:Tlist_Menu_Remove_File()
2984
+
2985
+ call s:Tlist_Refresh()
2986
+ endif
2987
+ endfunction
2988
+
2989
+ " Tlist_Update_Current_File()
2990
+ " Update taglist for the current buffer by regenerating the tag list
2991
+ " Contributed by WEN Guopeng.
2992
+ function! s:Tlist_Update_Current_File()
2993
+ call s:Tlist_Log_Msg('Tlist_Update_Current_File()')
2994
+ if winnr() == bufwinnr(g:TagList_title)
2995
+ " In the taglist window. Update the current file
2996
+ call s:Tlist_Window_Update_File()
2997
+ else
2998
+ " Not in the taglist window. Update the current buffer
2999
+ let filename = fnamemodify(bufname('%'), ':p')
3000
+ let fidx = s:Tlist_Get_File_Index(filename)
3001
+ if fidx != -1
3002
+ let s:tlist_{fidx}_valid = 0
3003
+ endif
3004
+ let ft = s:Tlist_Get_Buffer_Filetype('%')
3005
+ call Tlist_Update_File(filename, ft)
3006
+ endif
3007
+ endfunction
3008
+
3009
+ " Tlist_Window_Update_File()
3010
+ " Update the tags displayed in the taglist window
3011
+ function! s:Tlist_Window_Update_File()
3012
+ call s:Tlist_Log_Msg('Tlist_Window_Update_File()')
3013
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.'))
3014
+ if fidx == -1
3015
+ return
3016
+ endif
3017
+
3018
+ " Remove the previous highlighting
3019
+ match none
3020
+
3021
+ " Save the current line for later restoration
3022
+ let curline = '\V\^' . getline('.') . '\$'
3023
+
3024
+ let s:tlist_{fidx}_valid = 0
3025
+
3026
+ " Update the taglist window
3027
+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename,
3028
+ \ s:tlist_{fidx}_filetype)
3029
+
3030
+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!'
3031
+
3032
+ " Go back to the tag line before the list is updated
3033
+ call search(curline, 'w')
3034
+ endfunction
3035
+
3036
+ " Tlist_Window_Get_Tag_Type_By_Linenum()
3037
+ " Return the tag type index for the specified line in the taglist window
3038
+ function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum)
3039
+ let ftype = s:tlist_{a:fidx}_filetype
3040
+
3041
+ " Determine to which tag type the current line number belongs to using the
3042
+ " tag type start line number and the number of tags in a tag type
3043
+ let i = 1
3044
+ while i <= s:tlist_{ftype}_count
3045
+ let ttype = s:tlist_{ftype}_{i}_name
3046
+ let start_lnum =
3047
+ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset
3048
+ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count
3049
+ if a:lnum >= start_lnum && a:lnum <= end
3050
+ break
3051
+ endif
3052
+ let i = i + 1
3053
+ endwhile
3054
+
3055
+ " Current line doesn't belong to any of the displayed tag types
3056
+ if i > s:tlist_{ftype}_count
3057
+ return ''
3058
+ endif
3059
+
3060
+ return ttype
3061
+ endfunction
3062
+
3063
+ " Tlist_Window_Get_Tag_Index()
3064
+ " Return the tag index for the specified line in the taglist window
3065
+ function! s:Tlist_Window_Get_Tag_Index(fidx, lnum)
3066
+ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum)
3067
+
3068
+ " Current line doesn't belong to any of the displayed tag types
3069
+ if ttype == ''
3070
+ return 0
3071
+ endif
3072
+
3073
+ " Compute the index into the displayed tags for the tag type
3074
+ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset
3075
+ let tidx = a:lnum - ttype_lnum
3076
+ if tidx == 0
3077
+ return 0
3078
+ endif
3079
+
3080
+ " Get the corresponding tag line and return it
3081
+ return s:tlist_{a:fidx}_{ttype}_{tidx}
3082
+ endfunction
3083
+
3084
+ " Tlist_Window_Highlight_Line
3085
+ " Highlight the current line
3086
+ function! s:Tlist_Window_Highlight_Line()
3087
+ " Clear previously selected name
3088
+ match none
3089
+
3090
+ " Highlight the current line
3091
+ if g:Tlist_Display_Prototype == 0
3092
+ let pat = '/\%' . line('.') . 'l\s\+\zs.*/'
3093
+ else
3094
+ let pat = '/\%' . line('.') . 'l.*/'
3095
+ endif
3096
+
3097
+ exe 'match TagListTagName ' . pat
3098
+ endfunction
3099
+
3100
+ " Tlist_Window_Open_File
3101
+ " Open the specified file in either a new window or an existing window
3102
+ " and place the cursor at the specified tag pattern
3103
+ function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat)
3104
+ call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' .
3105
+ \ a:win_ctrl . ')')
3106
+ let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh
3107
+ let s:Tlist_Skip_Refresh = 1
3108
+
3109
+ if s:tlist_app_name == "winmanager"
3110
+ " Let the winmanager edit the file
3111
+ call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin')
3112
+ else
3113
+
3114
+ if a:win_ctrl == 'newtab'
3115
+ " Create a new tab
3116
+ exe 'tabnew ' . escape(a:filename, ' ')
3117
+ " Open the taglist window in the new tab
3118
+ call s:Tlist_Window_Open()
3119
+ endif
3120
+
3121
+ if a:win_ctrl == 'checktab'
3122
+ " Check whether the file is present in any of the tabs.
3123
+ " If the file is present in the current tab, then use the
3124
+ " current tab.
3125
+ if bufwinnr(a:filename) != -1
3126
+ let file_present_in_tab = 1
3127
+ let i = tabpagenr()
3128
+ else
3129
+ let i = 1
3130
+ let bnum = bufnr(a:filename)
3131
+ let file_present_in_tab = 0
3132
+ while i <= tabpagenr('$')
3133
+ if index(tabpagebuflist(i), bnum) != -1
3134
+ let file_present_in_tab = 1
3135
+ break
3136
+ endif
3137
+ let i += 1
3138
+ endwhile
3139
+ endif
3140
+
3141
+ if file_present_in_tab
3142
+ " Goto the tab containing the file
3143
+ exe 'tabnext ' . i
3144
+ else
3145
+ " Open a new tab
3146
+ exe 'tabnew ' . escape(a:filename, ' ')
3147
+
3148
+ " Open the taglist window
3149
+ call s:Tlist_Window_Open()
3150
+ endif
3151
+ endif
3152
+
3153
+ let winnum = -1
3154
+ if a:win_ctrl == 'prevwin'
3155
+ " Open the file in the previous window, if it is usable
3156
+ let cur_win = winnr()
3157
+ wincmd p
3158
+ if &buftype == '' && !&previewwindow
3159
+ exe "edit " . escape(a:filename, ' ')
3160
+ let winnum = winnr()
3161
+ else
3162
+ " Previous window is not usable
3163
+ exe cur_win . 'wincmd w'
3164
+ endif
3165
+ endif
3166
+
3167
+ " Goto the window containing the file. If the window is not there, open a
3168
+ " new window
3169
+ if winnum == -1
3170
+ let winnum = bufwinnr(a:filename)
3171
+ endif
3172
+
3173
+ if winnum == -1
3174
+ " Locate the previously used window for opening a file
3175
+ let fwin_num = 0
3176
+ let first_usable_win = 0
3177
+
3178
+ let i = 1
3179
+ let bnum = winbufnr(i)
3180
+ while bnum != -1
3181
+ if getwinvar(i, 'tlist_file_window') == 'yes'
3182
+ let fwin_num = i
3183
+ break
3184
+ endif
3185
+ if first_usable_win == 0 &&
3186
+ \ getbufvar(bnum, '&buftype') == '' &&
3187
+ \ !getwinvar(i, '&previewwindow')
3188
+ " First non-taglist, non-plugin and non-preview window
3189
+ let first_usable_win = i
3190
+ endif
3191
+ let i = i + 1
3192
+ let bnum = winbufnr(i)
3193
+ endwhile
3194
+
3195
+ " If a previously used window is not found, then use the first
3196
+ " non-taglist window
3197
+ if fwin_num == 0
3198
+ let fwin_num = first_usable_win
3199
+ endif
3200
+
3201
+ if fwin_num != 0
3202
+ " Jump to the file window
3203
+ exe fwin_num . "wincmd w"
3204
+
3205
+ " If the user asked to jump to the tag in a new window, then split
3206
+ " the existing window into two.
3207
+ if a:win_ctrl == 'newwin'
3208
+ split
3209
+ endif
3210
+ exe "edit " . escape(a:filename, ' ')
3211
+ else
3212
+ " Open a new window
3213
+ if g:Tlist_Use_Horiz_Window
3214
+ exe 'leftabove split ' . escape(a:filename, ' ')
3215
+ else
3216
+ if winbufnr(2) == -1
3217
+ " Only the taglist window is present
3218
+ if g:Tlist_Use_Right_Window
3219
+ exe 'leftabove vertical split ' .
3220
+ \ escape(a:filename, ' ')
3221
+ else
3222
+ exe 'rightbelow vertical split ' .
3223
+ \ escape(a:filename, ' ')
3224
+ endif
3225
+
3226
+ " Go to the taglist window to change the window size to
3227
+ " the user configured value
3228
+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p')
3229
+ if g:Tlist_Use_Horiz_Window
3230
+ exe 'resize ' . g:Tlist_WinHeight
3231
+ else
3232
+ exe 'vertical resize ' . g:Tlist_WinWidth
3233
+ endif
3234
+ " Go back to the file window
3235
+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p')
3236
+ else
3237
+ " A plugin or help window is also present
3238
+ wincmd w
3239
+ exe 'leftabove split ' . escape(a:filename, ' ')
3240
+ endif
3241
+ endif
3242
+ endif
3243
+ " Mark the window, so that it can be reused.
3244
+ call s:Tlist_Window_Mark_File_Window()
3245
+ else
3246
+ if v:version >= 700
3247
+ " If the file is opened in more than one window, then check
3248
+ " whether the last accessed window has the selected file.
3249
+ " If it does, then use that window.
3250
+ let lastwin_bufnum = winbufnr(winnr('#'))
3251
+ if bufnr(a:filename) == lastwin_bufnum
3252
+ let winnum = winnr('#')
3253
+ endif
3254
+ endif
3255
+ exe winnum . 'wincmd w'
3256
+
3257
+ " If the user asked to jump to the tag in a new window, then split the
3258
+ " existing window into two.
3259
+ if a:win_ctrl == 'newwin'
3260
+ split
3261
+ endif
3262
+ endif
3263
+ endif
3264
+
3265
+ " Jump to the tag
3266
+ if a:tagpat != ''
3267
+ " Add the current cursor position to the jump list, so that user can
3268
+ " jump back using the ' and ` marks.
3269
+ mark '
3270
+ silent call search(a:tagpat, 'w')
3271
+
3272
+ " Bring the line to the middle of the window
3273
+ normal! z.
3274
+
3275
+ " If the line is inside a fold, open the fold
3276
+ if foldclosed('.') != -1
3277
+ .foldopen
3278
+ endif
3279
+ endif
3280
+
3281
+ " If the user selects to preview the tag then jump back to the
3282
+ " taglist window
3283
+ if a:win_ctrl == 'preview'
3284
+ " Go back to the taglist window
3285
+ let winnum = bufwinnr(g:TagList_title)
3286
+ exe winnum . 'wincmd w'
3287
+ else
3288
+ " If the user has selected to close the taglist window, when a
3289
+ " tag is selected, close the taglist window
3290
+ if g:Tlist_Close_On_Select
3291
+ call s:Tlist_Window_Goto_Window()
3292
+ close
3293
+
3294
+ " Go back to the window displaying the selected file
3295
+ let wnum = bufwinnr(a:filename)
3296
+ if wnum != -1 && wnum != winnr()
3297
+ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w')
3298
+ endif
3299
+ endif
3300
+ endif
3301
+
3302
+ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh
3303
+ endfunction
3304
+
3305
+ " Tlist_Window_Jump_To_Tag()
3306
+ " Jump to the location of the current tag
3307
+ " win_ctrl == useopen - Reuse the existing file window
3308
+ " win_ctrl == newwin - Open a new window
3309
+ " win_ctrl == preview - Preview the tag
3310
+ " win_ctrl == prevwin - Open in previous window
3311
+ " win_ctrl == newtab - Open in new tab
3312
+ function! s:Tlist_Window_Jump_To_Tag(win_ctrl)
3313
+ call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')')
3314
+ " Do not process comment lines and empty lines
3315
+ let curline = getline('.')
3316
+ if curline =~ '^\s*$' || curline[0] == '"'
3317
+ return
3318
+ endif
3319
+
3320
+ " If inside a closed fold, then use the first line of the fold
3321
+ " and jump to the file.
3322
+ let lnum = foldclosed('.')
3323
+ if lnum == -1
3324
+ " Jump to the selected tag or file
3325
+ let lnum = line('.')
3326
+ else
3327
+ " Open the closed fold
3328
+ .foldopen!
3329
+ endif
3330
+
3331
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum)
3332
+ if fidx == -1
3333
+ return
3334
+ endif
3335
+
3336
+ " Get the tag output for the current tag
3337
+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum)
3338
+ if tidx != 0
3339
+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx)
3340
+
3341
+ " Highlight the tagline
3342
+ call s:Tlist_Window_Highlight_Line()
3343
+ else
3344
+ " Selected a line which is not a tag name. Just edit the file
3345
+ let tagpat = ''
3346
+ endif
3347
+
3348
+ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat)
3349
+ endfunction
3350
+
3351
+ " Tlist_Window_Show_Info()
3352
+ " Display information about the entry under the cursor
3353
+ function! s:Tlist_Window_Show_Info()
3354
+ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()')
3355
+
3356
+ " Clear the previously displayed line
3357
+ echo
3358
+
3359
+ " Do not process comment lines and empty lines
3360
+ let curline = getline('.')
3361
+ if curline =~ '^\s*$' || curline[0] == '"'
3362
+ return
3363
+ endif
3364
+
3365
+ " If inside a fold, then don't display the prototype
3366
+ if foldclosed('.') != -1
3367
+ return
3368
+ endif
3369
+
3370
+ let lnum = line('.')
3371
+
3372
+ " Get the file index
3373
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum)
3374
+ if fidx == -1
3375
+ return
3376
+ endif
3377
+
3378
+ if lnum == s:tlist_{fidx}_start
3379
+ " Cursor is on a file name
3380
+ let fname = s:tlist_{fidx}_filename
3381
+ if strlen(fname) > 50
3382
+ let fname = fnamemodify(fname, ':t')
3383
+ endif
3384
+ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype .
3385
+ \ ', Tag count=' . s:tlist_{fidx}_tag_count
3386
+ return
3387
+ endif
3388
+
3389
+ " Get the tag output line for the current tag
3390
+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum)
3391
+ if tidx == 0
3392
+ " Cursor is on a tag type
3393
+ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum)
3394
+ if ttype == ''
3395
+ return
3396
+ endif
3397
+
3398
+ let ttype_name = ''
3399
+
3400
+ let ftype = s:tlist_{fidx}_filetype
3401
+ let i = 1
3402
+ while i <= s:tlist_{ftype}_count
3403
+ if ttype == s:tlist_{ftype}_{i}_name
3404
+ let ttype_name = s:tlist_{ftype}_{i}_fullname
3405
+ break
3406
+ endif
3407
+ let i = i + 1
3408
+ endwhile
3409
+
3410
+ echo 'Tag type=' . ttype_name .
3411
+ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count
3412
+ return
3413
+ endif
3414
+
3415
+ " Get the tag search pattern and display it
3416
+ echo s:Tlist_Get_Tag_Prototype(fidx, tidx)
3417
+ endfunction
3418
+
3419
+ " Tlist_Find_Nearest_Tag_Idx
3420
+ " Find the tag idx nearest to the supplied line number
3421
+ " Returns -1, if a tag couldn't be found for the specified line number
3422
+ function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum)
3423
+ let sort_type = s:tlist_{a:fidx}_sort_type
3424
+
3425
+ let left = 1
3426
+ let right = s:tlist_{a:fidx}_tag_count
3427
+
3428
+ if sort_type == 'order'
3429
+ " Tags sorted by order, use a binary search.
3430
+ " The idea behind this function is taken from the ctags.vim script (by
3431
+ " Alexey Marinichev) available at the Vim online website.
3432
+
3433
+ " If the current line is the less than the first tag, then no need to
3434
+ " search
3435
+ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1)
3436
+
3437
+ if a:linenum < first_lnum
3438
+ return -1
3439
+ endif
3440
+
3441
+ while left < right
3442
+ let middle = (right + left + 1) / 2
3443
+ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle)
3444
+
3445
+ if middle_lnum == a:linenum
3446
+ let left = middle
3447
+ break
3448
+ endif
3449
+
3450
+ if middle_lnum > a:linenum
3451
+ let right = middle - 1
3452
+ else
3453
+ let left = middle
3454
+ endif
3455
+ endwhile
3456
+ else
3457
+ " Tags sorted by name, use a linear search. (contributed by Dave
3458
+ " Eggum).
3459
+ " Look for a tag with a line number less than or equal to the supplied
3460
+ " line number. If multiple tags are found, then use the tag with the
3461
+ " line number closest to the supplied line number. IOW, use the tag
3462
+ " with the highest line number.
3463
+ let closest_lnum = 0
3464
+ let final_left = 0
3465
+ while left <= right
3466
+ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left)
3467
+
3468
+ if lnum < a:linenum && lnum > closest_lnum
3469
+ let closest_lnum = lnum
3470
+ let final_left = left
3471
+ elseif lnum == a:linenum
3472
+ let closest_lnum = lnum
3473
+ let final_left = left
3474
+ break
3475
+ else
3476
+ let left = left + 1
3477
+ endif
3478
+ endwhile
3479
+ if closest_lnum == 0
3480
+ return -1
3481
+ endif
3482
+ if left >= right
3483
+ let left = final_left
3484
+ endif
3485
+ endif
3486
+
3487
+ return left
3488
+ endfunction
3489
+
3490
+ " Tlist_Window_Highlight_Tag()
3491
+ " Highlight the current tag
3492
+ " cntx == 1, Called by the taglist plugin itself
3493
+ " cntx == 2, Forced by the user through the TlistHighlightTag command
3494
+ " center = 1, move the tag line to the center of the taglist window
3495
+ function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center)
3496
+ " Highlight the current tag only if the user configured the
3497
+ " taglist plugin to do so or if the user explictly invoked the
3498
+ " command to highlight the current tag.
3499
+ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1
3500
+ return
3501
+ endif
3502
+
3503
+ if a:filename == ''
3504
+ return
3505
+ endif
3506
+
3507
+ " Make sure the taglist window is present
3508
+ let winnum = bufwinnr(g:TagList_title)
3509
+ if winnum == -1
3510
+ call s:Tlist_Warning_Msg('Error: Taglist window is not open')
3511
+ return
3512
+ endif
3513
+
3514
+ let fidx = s:Tlist_Get_File_Index(a:filename)
3515
+ if fidx == -1
3516
+ return
3517
+ endif
3518
+
3519
+ " If the file is currently not displayed in the taglist window, then retrn
3520
+ if !s:tlist_{fidx}_visible
3521
+ return
3522
+ endif
3523
+
3524
+ " If there are no tags for this file, then no need to proceed further
3525
+ if s:tlist_{fidx}_tag_count == 0
3526
+ return
3527
+ endif
3528
+
3529
+ " Ignore all autocommands
3530
+ let old_ei = &eventignore
3531
+ set eventignore=all
3532
+
3533
+ " Save the original window number
3534
+ let org_winnr = winnr()
3535
+
3536
+ if org_winnr == winnum
3537
+ let in_taglist_window = 1
3538
+ else
3539
+ let in_taglist_window = 0
3540
+ endif
3541
+
3542
+ " Go to the taglist window
3543
+ if !in_taglist_window
3544
+ exe winnum . 'wincmd w'
3545
+ endif
3546
+
3547
+ " Clear previously selected name
3548
+ match none
3549
+
3550
+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum)
3551
+ if tidx == -1
3552
+ " Make sure the current tag line is visible in the taglist window.
3553
+ " Calling the winline() function makes the line visible. Don't know
3554
+ " of a better way to achieve this.
3555
+ let lnum = line('.')
3556
+
3557
+ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end
3558
+ " Move the cursor to the beginning of the file
3559
+ exe s:tlist_{fidx}_start
3560
+ endif
3561
+
3562
+ if foldclosed('.') != -1
3563
+ .foldopen
3564
+ endif
3565
+
3566
+ call winline()
3567
+
3568
+ if !in_taglist_window
3569
+ exe org_winnr . 'wincmd w'
3570
+ endif
3571
+
3572
+ " Restore the autocommands
3573
+ let &eventignore = old_ei
3574
+ return
3575
+ endif
3576
+
3577
+ " Extract the tag type
3578
+ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx)
3579
+
3580
+ " Compute the line number
3581
+ " Start of file + Start of tag type + offset
3582
+ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset +
3583
+ \ s:tlist_{fidx}_{tidx}_ttype_idx
3584
+
3585
+ " Goto the line containing the tag
3586
+ exe lnum
3587
+
3588
+ " Open the fold
3589
+ if foldclosed('.') != -1
3590
+ .foldopen
3591
+ endif
3592
+
3593
+ if a:center
3594
+ " Move the tag line to the center of the taglist window
3595
+ normal! z.
3596
+ else
3597
+ " Make sure the current tag line is visible in the taglist window.
3598
+ " Calling the winline() function makes the line visible. Don't know
3599
+ " of a better way to achieve this.
3600
+ call winline()
3601
+ endif
3602
+
3603
+ " Highlight the tag name
3604
+ call s:Tlist_Window_Highlight_Line()
3605
+
3606
+ " Go back to the original window
3607
+ if !in_taglist_window
3608
+ exe org_winnr . 'wincmd w'
3609
+ endif
3610
+
3611
+ " Restore the autocommands
3612
+ let &eventignore = old_ei
3613
+ return
3614
+ endfunction
3615
+
3616
+ " Tlist_Get_Tag_Prototype_By_Line
3617
+ " Get the prototype for the tag on or before the specified line number in the
3618
+ " current buffer
3619
+ function! Tlist_Get_Tag_Prototype_By_Line(...)
3620
+ if a:0 == 0
3621
+ " Arguments are not supplied. Use the current buffer name
3622
+ " and line number
3623
+ let filename = bufname('%')
3624
+ let linenr = line('.')
3625
+ elseif a:0 == 2
3626
+ " Filename and line number are specified
3627
+ let filename = a:1
3628
+ let linenr = a:2
3629
+ if linenr !~ '\d\+'
3630
+ " Invalid line number
3631
+ return ""
3632
+ endif
3633
+ else
3634
+ " Sufficient arguments are not supplied
3635
+ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line <filename> ' .
3636
+ \ '<line_number>'
3637
+ call s:Tlist_Warning_Msg(msg)
3638
+ return ""
3639
+ endif
3640
+
3641
+ " Expand the file to a fully qualified name
3642
+ let filename = fnamemodify(filename, ':p')
3643
+ if filename == ''
3644
+ return ""
3645
+ endif
3646
+
3647
+ let fidx = s:Tlist_Get_File_Index(filename)
3648
+ if fidx == -1
3649
+ return ""
3650
+ endif
3651
+
3652
+ " If there are no tags for this file, then no need to proceed further
3653
+ if s:tlist_{fidx}_tag_count == 0
3654
+ return ""
3655
+ endif
3656
+
3657
+ " Get the tag text using the line number
3658
+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr)
3659
+ if tidx == -1
3660
+ return ""
3661
+ endif
3662
+
3663
+ return s:Tlist_Get_Tag_Prototype(fidx, tidx)
3664
+ endfunction
3665
+
3666
+ " Tlist_Get_Tagname_By_Line
3667
+ " Get the tag name on or before the specified line number in the
3668
+ " current buffer
3669
+ function! Tlist_Get_Tagname_By_Line(...)
3670
+ if a:0 == 0
3671
+ " Arguments are not supplied. Use the current buffer name
3672
+ " and line number
3673
+ let filename = bufname('%')
3674
+ let linenr = line('.')
3675
+ elseif a:0 == 2
3676
+ " Filename and line number are specified
3677
+ let filename = a:1
3678
+ let linenr = a:2
3679
+ if linenr !~ '\d\+'
3680
+ " Invalid line number
3681
+ return ""
3682
+ endif
3683
+ else
3684
+ " Sufficient arguments are not supplied
3685
+ let msg = 'Usage: Tlist_Get_Tagname_By_Line <filename> <line_number>'
3686
+ call s:Tlist_Warning_Msg(msg)
3687
+ return ""
3688
+ endif
3689
+
3690
+ " Make sure the current file has a name
3691
+ let filename = fnamemodify(filename, ':p')
3692
+ if filename == ''
3693
+ return ""
3694
+ endif
3695
+
3696
+ let fidx = s:Tlist_Get_File_Index(filename)
3697
+ if fidx == -1
3698
+ return ""
3699
+ endif
3700
+
3701
+ " If there are no tags for this file, then no need to proceed further
3702
+ if s:tlist_{fidx}_tag_count == 0
3703
+ return ""
3704
+ endif
3705
+
3706
+ " Get the tag name using the line number
3707
+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr)
3708
+ if tidx == -1
3709
+ return ""
3710
+ endif
3711
+
3712
+ return s:tlist_{fidx}_{tidx}_tag_name
3713
+ endfunction
3714
+
3715
+ " Tlist_Window_Move_To_File
3716
+ " Move the cursor to the beginning of the current file or the next file
3717
+ " or the previous file in the taglist window
3718
+ " dir == -1, move to start of current or previous function
3719
+ " dir == 1, move to start of next function
3720
+ function! s:Tlist_Window_Move_To_File(dir)
3721
+ if foldlevel('.') == 0
3722
+ " Cursor is on a non-folded line (it is not in any of the files)
3723
+ " Move it to a folded line
3724
+ if a:dir == -1
3725
+ normal! zk
3726
+ else
3727
+ " While moving down to the start of the next fold,
3728
+ " no need to do go to the start of the next file.
3729
+ normal! zj
3730
+ return
3731
+ endif
3732
+ endif
3733
+
3734
+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.'))
3735
+ if fidx == -1
3736
+ return
3737
+ endif
3738
+
3739
+ let cur_lnum = line('.')
3740
+
3741
+ if a:dir == -1
3742
+ if cur_lnum > s:tlist_{fidx}_start
3743
+ " Move to the beginning of the current file
3744
+ exe s:tlist_{fidx}_start
3745
+ return
3746
+ endif
3747
+
3748
+ if fidx != 0
3749
+ " Move to the beginning of the previous file
3750
+ let fidx = fidx - 1
3751
+ else
3752
+ " Cursor is at the first file, wrap around to the last file
3753
+ let fidx = s:tlist_file_count - 1
3754
+ endif
3755
+
3756
+ exe s:tlist_{fidx}_start
3757
+ return
3758
+ else
3759
+ " Move to the beginning of the next file
3760
+ let fidx = fidx + 1
3761
+
3762
+ if fidx >= s:tlist_file_count
3763
+ " Cursor is at the last file, wrap around to the first file
3764
+ let fidx = 0
3765
+ endif
3766
+
3767
+ if s:tlist_{fidx}_start != 0
3768
+ exe s:tlist_{fidx}_start
3769
+ endif
3770
+ return
3771
+ endif
3772
+ endfunction
3773
+
3774
+ " Tlist_Session_Load
3775
+ " Load a taglist session (information about all the displayed files
3776
+ " and the tags) from the specified file
3777
+ function! s:Tlist_Session_Load(...)
3778
+ if a:0 == 0 || a:1 == ''
3779
+ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad <filename>')
3780
+ return
3781
+ endif
3782
+
3783
+ let sessionfile = a:1
3784
+
3785
+ if !filereadable(sessionfile)
3786
+ let msg = 'Taglist: Error - Unable to open file ' . sessionfile
3787
+ call s:Tlist_Warning_Msg(msg)
3788
+ return
3789
+ endif
3790
+
3791
+ " Mark the current window as the file window
3792
+ call s:Tlist_Window_Mark_File_Window()
3793
+
3794
+ " Source the session file
3795
+ exe 'source ' . sessionfile
3796
+
3797
+ let new_file_count = g:tlist_file_count
3798
+ unlet! g:tlist_file_count
3799
+
3800
+ let i = 0
3801
+ while i < new_file_count
3802
+ let ftype = g:tlist_{i}_filetype
3803
+ unlet! g:tlist_{i}_filetype
3804
+
3805
+ if !exists('s:tlist_' . ftype . '_count')
3806
+ if s:Tlist_FileType_Init(ftype) == 0
3807
+ let i = i + 1
3808
+ continue
3809
+ endif
3810
+ endif
3811
+
3812
+ let fname = g:tlist_{i}_filename
3813
+ unlet! g:tlist_{i}_filename
3814
+
3815
+ let fidx = s:Tlist_Get_File_Index(fname)
3816
+ if fidx != -1
3817
+ let s:tlist_{fidx}_visible = 0
3818
+ let i = i + 1
3819
+ continue
3820
+ else
3821
+ " As we are loading the tags from the session file, if this
3822
+ " file was previously deleted by the user, now we need to
3823
+ " add it back. So remove the file from the deleted list.
3824
+ call s:Tlist_Update_Remove_List(fname, 0)
3825
+ endif
3826
+
3827
+ let fidx = s:Tlist_Init_File(fname, ftype)
3828
+
3829
+ let s:tlist_{fidx}_filename = fname
3830
+
3831
+ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type
3832
+ unlet! g:tlist_{i}_sort_type
3833
+
3834
+ let s:tlist_{fidx}_filetype = ftype
3835
+ let s:tlist_{fidx}_mtime = getftime(fname)
3836
+
3837
+ let s:tlist_{fidx}_start = 0
3838
+ let s:tlist_{fidx}_end = 0
3839
+
3840
+ let s:tlist_{fidx}_valid = 1
3841
+
3842
+ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count
3843
+ unlet! g:tlist_{i}_tag_count
3844
+
3845
+ let j = 1
3846
+ while j <= s:tlist_{fidx}_tag_count
3847
+ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag
3848
+ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name
3849
+ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx
3850
+ unlet! g:tlist_{i}_{j}_tag
3851
+ unlet! g:tlist_{i}_{j}_tag_name
3852
+ unlet! g:tlist_{i}_{j}_ttype_idx
3853
+ let j = j + 1
3854
+ endwhile
3855
+
3856
+ let j = 1
3857
+ while j <= s:tlist_{ftype}_count
3858
+ let ttype = s:tlist_{ftype}_{j}_name
3859
+
3860
+ if exists('g:tlist_' . i . '_' . ttype)
3861
+ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype}
3862
+ unlet! g:tlist_{i}_{ttype}
3863
+ let s:tlist_{fidx}_{ttype}_offset = 0
3864
+ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count
3865
+ unlet! g:tlist_{i}_{ttype}_count
3866
+
3867
+ let k = 1
3868
+ while k <= s:tlist_{fidx}_{ttype}_count
3869
+ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k}
3870
+ unlet! g:tlist_{i}_{ttype}_{k}
3871
+ let k = k + 1
3872
+ endwhile
3873
+ else
3874
+ let s:tlist_{fidx}_{ttype} = ''
3875
+ let s:tlist_{fidx}_{ttype}_offset = 0
3876
+ let s:tlist_{fidx}_{ttype}_count = 0
3877
+ endif
3878
+
3879
+ let j = j + 1
3880
+ endwhile
3881
+
3882
+ let i = i + 1
3883
+ endwhile
3884
+
3885
+ " If the taglist window is open, then update it
3886
+ let winnum = bufwinnr(g:TagList_title)
3887
+ if winnum != -1
3888
+ let save_winnr = winnr()
3889
+
3890
+ " Goto the taglist window
3891
+ call s:Tlist_Window_Goto_Window()
3892
+
3893
+ " Refresh the taglist window
3894
+ call s:Tlist_Window_Refresh()
3895
+
3896
+ " Go back to the original window
3897
+ if save_winnr != winnr()
3898
+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p')
3899
+ endif
3900
+ endif
3901
+ endfunction
3902
+
3903
+ " Tlist_Session_Save
3904
+ " Save a taglist session (information about all the displayed files
3905
+ " and the tags) into the specified file
3906
+ function! s:Tlist_Session_Save(...)
3907
+ if a:0 == 0 || a:1 == ''
3908
+ call s:Tlist_Warning_Msg('Usage: TlistSessionSave <filename>')
3909
+ return
3910
+ endif
3911
+
3912
+ let sessionfile = a:1
3913
+
3914
+ if s:tlist_file_count == 0
3915
+ " There is nothing to save
3916
+ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.')
3917
+ return
3918
+ endif
3919
+
3920
+ if filereadable(sessionfile)
3921
+ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?')
3922
+ if ans !=? 'y'
3923
+ return
3924
+ endif
3925
+
3926
+ echo "\n"
3927
+ endif
3928
+
3929
+ let old_verbose = &verbose
3930
+ set verbose&vim
3931
+
3932
+ exe 'redir! > ' . sessionfile
3933
+
3934
+ silent! echo '" Taglist session file. This file is auto-generated.'
3935
+ silent! echo '" File information'
3936
+ silent! echo 'let tlist_file_count = ' . s:tlist_file_count
3937
+
3938
+ let i = 0
3939
+
3940
+ while i < s:tlist_file_count
3941
+ " Store information about the file
3942
+ silent! echo 'let tlist_' . i . "_filename = '" .
3943
+ \ s:tlist_{i}_filename . "'"
3944
+ silent! echo 'let tlist_' . i . '_sort_type = "' .
3945
+ \ s:tlist_{i}_sort_type . '"'
3946
+ silent! echo 'let tlist_' . i . '_filetype = "' .
3947
+ \ s:tlist_{i}_filetype . '"'
3948
+ silent! echo 'let tlist_' . i . '_tag_count = ' .
3949
+ \ s:tlist_{i}_tag_count
3950
+ " Store information about all the tags
3951
+ let j = 1
3952
+ while j <= s:tlist_{i}_tag_count
3953
+ let txt = escape(s:tlist_{i}_{j}_tag, '"\\')
3954
+ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"'
3955
+ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' .
3956
+ \ s:tlist_{i}_{j}_tag_name . '"'
3957
+ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' .
3958
+ \ s:tlist_{i}_{j}_ttype_idx
3959
+ let j = j + 1
3960
+ endwhile
3961
+
3962
+ " Store information about all the tags grouped by their type
3963
+ let ftype = s:tlist_{i}_filetype
3964
+ let j = 1
3965
+ while j <= s:tlist_{ftype}_count
3966
+ let ttype = s:tlist_{ftype}_{j}_name
3967
+ if s:tlist_{i}_{ttype}_count != 0
3968
+ let txt = escape(s:tlist_{i}_{ttype}, '"\')
3969
+ let txt = substitute(txt, "\n", "\\\\n", 'g')
3970
+ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' .
3971
+ \ txt . '"'
3972
+ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' .
3973
+ \ s:tlist_{i}_{ttype}_count
3974
+ let k = 1
3975
+ while k <= s:tlist_{i}_{ttype}_count
3976
+ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k .
3977
+ \ ' = ' . s:tlist_{i}_{ttype}_{k}
3978
+ let k = k + 1
3979
+ endwhile
3980
+ endif
3981
+ let j = j + 1
3982
+ endwhile
3983
+
3984
+ silent! echo
3985
+
3986
+ let i = i + 1
3987
+ endwhile
3988
+
3989
+ redir END
3990
+
3991
+ let &verbose = old_verbose
3992
+ endfunction
3993
+
3994
+ " Tlist_Buffer_Removed
3995
+ " A buffer is removed from the Vim buffer list. Remove the tags defined
3996
+ " for that file
3997
+ function! s:Tlist_Buffer_Removed(filename)
3998
+ call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')')
3999
+
4000
+ " Make sure a valid filename is supplied
4001
+ if a:filename == ''
4002
+ return
4003
+ endif
4004
+
4005
+ " Get tag list index of the specified file
4006
+ let fidx = s:Tlist_Get_File_Index(a:filename)
4007
+ if fidx == -1
4008
+ " File not present in the taglist
4009
+ return
4010
+ endif
4011
+
4012
+ " Remove the file from the list
4013
+ call s:Tlist_Remove_File(fidx, 0)
4014
+ endfunction
4015
+
4016
+ " When a buffer is deleted, remove the file from the taglist
4017
+ autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand('<afile>:p'))
4018
+
4019
+ " Tlist_Window_Open_File_Fold
4020
+ " Open the fold for the specified file and close the fold for all the
4021
+ " other files
4022
+ function! s:Tlist_Window_Open_File_Fold(acmd_bufnr)
4023
+ call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_bufnr . ')')
4024
+
4025
+ " Make sure the taglist window is present
4026
+ let winnum = bufwinnr(g:TagList_title)
4027
+ if winnum == -1
4028
+ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open')
4029
+ return
4030
+ endif
4031
+
4032
+ " Save the original window number
4033
+ let org_winnr = winnr()
4034
+ if org_winnr == winnum
4035
+ let in_taglist_window = 1
4036
+ else
4037
+ let in_taglist_window = 0
4038
+ endif
4039
+
4040
+ if in_taglist_window
4041
+ " When entering the taglist window, no need to update the folds
4042
+ return
4043
+ endif
4044
+
4045
+ " Go to the taglist window
4046
+ if !in_taglist_window
4047
+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w')
4048
+ endif
4049
+
4050
+ " Close all the folds
4051
+ silent! %foldclose
4052
+
4053
+ " Get tag list index of the specified file
4054
+ let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p')
4055
+ if filereadable(fname)
4056
+ let fidx = s:Tlist_Get_File_Index(fname)
4057
+ if fidx != -1
4058
+ " Open the fold for the file
4059
+ exe "silent! " . s:tlist_{fidx}_start . "," .
4060
+ \ s:tlist_{fidx}_end . "foldopen"
4061
+ endif
4062
+ endif
4063
+
4064
+ " Go back to the original window
4065
+ if !in_taglist_window
4066
+ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w')
4067
+ endif
4068
+ endfunction
4069
+
4070
+ " Tlist_Window_Check_Auto_Open
4071
+ " Open the taglist window automatically on Vim startup.
4072
+ " Open the window only when files present in any of the Vim windows support
4073
+ " tags.
4074
+ function! s:Tlist_Window_Check_Auto_Open()
4075
+ let open_window = 0
4076
+
4077
+ let i = 1
4078
+ let buf_num = winbufnr(i)
4079
+ while buf_num != -1
4080
+ let filename = fnamemodify(bufname(buf_num), ':p')
4081
+ let ft = s:Tlist_Get_Buffer_Filetype(buf_num)
4082
+ if !s:Tlist_Skip_File(filename, ft)
4083
+ let open_window = 1
4084
+ break
4085
+ endif
4086
+ let i = i + 1
4087
+ let buf_num = winbufnr(i)
4088
+ endwhile
4089
+
4090
+ if open_window
4091
+ call s:Tlist_Window_Toggle()
4092
+ endif
4093
+ endfunction
4094
+
4095
+ " Tlist_Refresh_Folds
4096
+ " Remove and create the folds for all the files displayed in the taglist
4097
+ " window. Used after entering a tab. If this is not done, then the folds
4098
+ " are not properly created for taglist windows displayed in multiple tabs.
4099
+ function! s:Tlist_Refresh_Folds()
4100
+ let winnum = bufwinnr(g:TagList_title)
4101
+ if winnum == -1
4102
+ return
4103
+ endif
4104
+
4105
+ let save_wnum = winnr()
4106
+ exe winnum . 'wincmd w'
4107
+
4108
+ " First remove all the existing folds
4109
+ normal! zE
4110
+
4111
+ " Create the folds for each in the tag list
4112
+ let fidx = 0
4113
+ while fidx < s:tlist_file_count
4114
+ let ftype = s:tlist_{fidx}_filetype
4115
+
4116
+ " Create the folds for each tag type in a file
4117
+ let j = 1
4118
+ while j <= s:tlist_{ftype}_count
4119
+ let ttype = s:tlist_{ftype}_{j}_name
4120
+ if s:tlist_{fidx}_{ttype}_count
4121
+ let s = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset
4122
+ let e = s + s:tlist_{fidx}_{ttype}_count
4123
+ exe s . ',' . e . 'fold'
4124
+ endif
4125
+ let j = j + 1
4126
+ endwhile
4127
+
4128
+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold'
4129
+ exe 'silent! ' . s:tlist_{fidx}_start . ',' .
4130
+ \ s:tlist_{fidx}_end . 'foldopen!'
4131
+ let fidx = fidx + 1
4132
+ endwhile
4133
+
4134
+ exe save_wnum . 'wincmd w'
4135
+ endfunction
4136
+
4137
+ function! s:Tlist_Menu_Add_Base_Menu()
4138
+ call s:Tlist_Log_Msg('Adding the base menu')
4139
+
4140
+ " Add the menu
4141
+ anoremenu <silent> T&ags.Refresh\ menu :call <SID>Tlist_Menu_Refresh()<CR>
4142
+ anoremenu <silent> T&ags.Sort\ menu\ by.Name
4143
+ \ :call <SID>Tlist_Change_Sort('menu', 'set', 'name')<CR>
4144
+ anoremenu <silent> T&ags.Sort\ menu\ by.Order
4145
+ \ :call <SID>Tlist_Change_Sort('menu', 'set', 'order')<CR>
4146
+ anoremenu T&ags.-SEP1- :
4147
+
4148
+ if &mousemodel =~ 'popup'
4149
+ anoremenu <silent> PopUp.T&ags.Refresh\ menu
4150
+ \ :call <SID>Tlist_Menu_Refresh()<CR>
4151
+ anoremenu <silent> PopUp.T&ags.Sort\ menu\ by.Name
4152
+ \ :call <SID>Tlist_Change_Sort('menu', 'set', 'name')<CR>
4153
+ anoremenu <silent> PopUp.T&ags.Sort\ menu\ by.Order
4154
+ \ :call <SID>Tlist_Change_Sort('menu', 'set', 'order')<CR>
4155
+ anoremenu PopUp.T&ags.-SEP1- :
4156
+ endif
4157
+ endfunction
4158
+
4159
+ let s:menu_char_prefix =
4160
+ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
4161
+
4162
+ " Tlist_Menu_Get_Tag_Type_Cmd
4163
+ " Get the menu command for the specified tag type
4164
+ " fidx - File type index
4165
+ " ftype - File Type
4166
+ " add_ttype_name - To add or not to add the tag type name to the menu entries
4167
+ " ttype_idx - Tag type index
4168
+ function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx)
4169
+ " Curly brace variable name optimization
4170
+ let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx
4171
+
4172
+ let ttype = s:tlist_{ftype_ttype_idx}_name
4173
+ if a:add_ttype_name
4174
+ " If the tag type name contains space characters, escape it. This
4175
+ " will be used to create the menu entries.
4176
+ let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ')
4177
+ endif
4178
+
4179
+ " Curly brace variable name optimization
4180
+ let fidx_ttype = a:fidx . '_' . ttype
4181
+
4182
+ " Number of tag entries for this tag type
4183
+ let tcnt = s:tlist_{fidx_ttype}_count
4184
+ if tcnt == 0 " No entries for this tag type
4185
+ return ''
4186
+ endif
4187
+
4188
+ let mcmd = ''
4189
+
4190
+ " Create the menu items for the tags.
4191
+ " Depending on the number of tags of this type, split the menu into
4192
+ " multiple sub-menus, if needed.
4193
+ if tcnt > g:Tlist_Max_Submenu_Items
4194
+ let j = 1
4195
+ while j <= tcnt
4196
+ let final_index = j + g:Tlist_Max_Submenu_Items - 1
4197
+ if final_index > tcnt
4198
+ let final_index = tcnt
4199
+ endif
4200
+
4201
+ " Extract the first and last tag name and form the
4202
+ " sub-menu name
4203
+ let tidx = s:tlist_{fidx_ttype}_{j}
4204
+ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name
4205
+
4206
+ let tidx = s:tlist_{fidx_ttype}_{final_index}
4207
+ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name
4208
+
4209
+ " Truncate the names, if they are greater than the
4210
+ " max length
4211
+ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length)
4212
+ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length)
4213
+
4214
+ " Form the menu command prefix
4215
+ let m_prefix = 'anoremenu <silent> T\&ags.'
4216
+ if a:add_ttype_name
4217
+ let m_prefix = m_prefix . ttype_fullname . '.'
4218
+ endif
4219
+ let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.'
4220
+
4221
+ " Character prefix used to number the menu items (hotkey)
4222
+ let m_prefix_idx = 0
4223
+
4224
+ while j <= final_index
4225
+ let tidx = s:tlist_{fidx_ttype}_{j}
4226
+
4227
+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name
4228
+
4229
+ let mcmd = mcmd . m_prefix . '\&' .
4230
+ \ s:menu_char_prefix[m_prefix_idx] . '\.' .
4231
+ \ tname . ' :call <SID>Tlist_Menu_Jump_To_Tag(' .
4232
+ \ tidx . ')<CR>|'
4233
+
4234
+ let m_prefix_idx = m_prefix_idx + 1
4235
+ let j = j + 1
4236
+ endwhile
4237
+ endwhile
4238
+ else
4239
+ " Character prefix used to number the menu items (hotkey)
4240
+ let m_prefix_idx = 0
4241
+
4242
+ let m_prefix = 'anoremenu <silent> T\&ags.'
4243
+ if a:add_ttype_name
4244
+ let m_prefix = m_prefix . ttype_fullname . '.'
4245
+ endif
4246
+ let j = 1
4247
+ while j <= tcnt
4248
+ let tidx = s:tlist_{fidx_ttype}_{j}
4249
+
4250
+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name
4251
+
4252
+ let mcmd = mcmd . m_prefix . '\&' .
4253
+ \ s:menu_char_prefix[m_prefix_idx] . '\.' .
4254
+ \ tname . ' :call <SID>Tlist_Menu_Jump_To_Tag(' . tidx
4255
+ \ . ')<CR>|'
4256
+
4257
+ let m_prefix_idx = m_prefix_idx + 1
4258
+ let j = j + 1
4259
+ endwhile
4260
+ endif
4261
+
4262
+ return mcmd
4263
+ endfunction
4264
+
4265
+ " Update the taglist menu with the tags for the specified file
4266
+ function! s:Tlist_Menu_File_Refresh(fidx)
4267
+ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename)
4268
+ " The 'B' flag is needed in the 'cpoptions' option
4269
+ let old_cpoptions = &cpoptions
4270
+ set cpoptions&vim
4271
+
4272
+ exe s:tlist_{a:fidx}_menu_cmd
4273
+
4274
+ " Update the popup menu (if enabled)
4275
+ if &mousemodel =~ 'popup'
4276
+ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.',
4277
+ \ ' PopUp.T\\\&ags.', "g")
4278
+ exe cmd
4279
+ endif
4280
+
4281
+ " The taglist menu is not empty now
4282
+ let s:tlist_menu_empty = 0
4283
+
4284
+ " Restore the 'cpoptions' settings
4285
+ let &cpoptions = old_cpoptions
4286
+ endfunction
4287
+
4288
+ " Tlist_Menu_Update_File
4289
+ " Add the taglist menu
4290
+ function! s:Tlist_Menu_Update_File(clear_menu)
4291
+ if !has('gui_running')
4292
+ " Not running in GUI mode
4293
+ return
4294
+ endif
4295
+
4296
+ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu)
4297
+
4298
+ " Remove the tags menu
4299
+ if a:clear_menu
4300
+ call s:Tlist_Menu_Remove_File()
4301
+
4302
+ endif
4303
+
4304
+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help
4305
+ if &buftype != ''
4306
+ return
4307
+ endif
4308
+
4309
+ let filename = fnamemodify(bufname('%'), ':p')
4310
+ let ftype = s:Tlist_Get_Buffer_Filetype('%')
4311
+
4312
+ " If the file doesn't support tag listing, skip it
4313
+ if s:Tlist_Skip_File(filename, ftype)
4314
+ return
4315
+ endif
4316
+
4317
+ let fidx = s:Tlist_Get_File_Index(filename)
4318
+ if fidx == -1 || !s:tlist_{fidx}_valid
4319
+ " Check whether this file is removed based on user request
4320
+ " If it is, then don't display the tags for this file
4321
+ if s:Tlist_User_Removed_File(filename)
4322
+ return
4323
+ endif
4324
+
4325
+ " Process the tags for the file
4326
+ let fidx = s:Tlist_Process_File(filename, ftype)
4327
+ if fidx == -1
4328
+ return
4329
+ endif
4330
+ endif
4331
+
4332
+ let fname = escape(fnamemodify(bufname('%'), ':t'), '.')
4333
+ if fname != ''
4334
+ exe 'anoremenu T&ags.' . fname . ' <Nop>'
4335
+ anoremenu T&ags.-SEP2- :
4336
+ endif
4337
+
4338
+ if !s:tlist_{fidx}_tag_count
4339
+ return
4340
+ endif
4341
+
4342
+ if s:tlist_{fidx}_menu_cmd != ''
4343
+ " Update the menu with the cached command
4344
+ call s:Tlist_Menu_File_Refresh(fidx)
4345
+
4346
+ return
4347
+ endif
4348
+
4349
+ " We are going to add entries to the tags menu, so the menu won't be
4350
+ " empty
4351
+ let s:tlist_menu_empty = 0
4352
+
4353
+ let cmd = ''
4354
+
4355
+ " Determine whether the tag type name needs to be added to the menu
4356
+ " If more than one tag type is present in the taglisting for a file,
4357
+ " then the tag type name needs to be present
4358
+ let add_ttype_name = -1
4359
+ let i = 1
4360
+ while i <= s:tlist_{ftype}_count && add_ttype_name < 1
4361
+ let ttype = s:tlist_{ftype}_{i}_name
4362
+ if s:tlist_{fidx}_{ttype}_count
4363
+ let add_ttype_name = add_ttype_name + 1
4364
+ endif
4365
+ let i = i + 1
4366
+ endwhile
4367
+
4368
+ " Process the tags by the tag type and get the menu command
4369
+ let i = 1
4370
+ while i <= s:tlist_{ftype}_count
4371
+ let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i)
4372
+ if mcmd != ''
4373
+ let cmd = cmd . mcmd
4374
+ endif
4375
+
4376
+ let i = i + 1
4377
+ endwhile
4378
+
4379
+ " Cache the menu command for reuse
4380
+ let s:tlist_{fidx}_menu_cmd = cmd
4381
+
4382
+ " Update the menu
4383
+ call s:Tlist_Menu_File_Refresh(fidx)
4384
+ endfunction
4385
+
4386
+ " Tlist_Menu_Remove_File
4387
+ " Remove the tags displayed in the tags menu
4388
+ function! s:Tlist_Menu_Remove_File()
4389
+ if !has('gui_running') || s:tlist_menu_empty
4390
+ return
4391
+ endif
4392
+
4393
+ call s:Tlist_Log_Msg('Removing the tags menu for a file')
4394
+
4395
+ " Cleanup the Tags menu
4396
+ silent! unmenu T&ags
4397
+ if &mousemodel =~ 'popup'
4398
+ silent! unmenu PopUp.T&ags
4399
+ endif
4400
+
4401
+ " Add a dummy menu item to retain teared off menu
4402
+ noremenu T&ags.Dummy l
4403
+
4404
+ silent! unmenu! T&ags
4405
+ if &mousemodel =~ 'popup'
4406
+ silent! unmenu! PopUp.T&ags
4407
+ endif
4408
+
4409
+ call s:Tlist_Menu_Add_Base_Menu()
4410
+
4411
+ " Remove the dummy menu item
4412
+ unmenu T&ags.Dummy
4413
+
4414
+ let s:tlist_menu_empty = 1
4415
+ endfunction
4416
+
4417
+ " Tlist_Menu_Refresh
4418
+ " Refresh the taglist menu
4419
+ function! s:Tlist_Menu_Refresh()
4420
+ call s:Tlist_Log_Msg('Refreshing the tags menu')
4421
+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p'))
4422
+ if fidx != -1
4423
+ " Invalidate the cached menu command
4424
+ let s:tlist_{fidx}_menu_cmd = ''
4425
+ endif
4426
+
4427
+ " Update the taglist, menu and window
4428
+ call s:Tlist_Update_Current_File()
4429
+ endfunction
4430
+
4431
+ " Tlist_Menu_Jump_To_Tag
4432
+ " Jump to the selected tag
4433
+ function! s:Tlist_Menu_Jump_To_Tag(tidx)
4434
+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p'))
4435
+ if fidx == -1
4436
+ return
4437
+ endif
4438
+
4439
+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx)
4440
+ if tagpat == ''
4441
+ return
4442
+ endif
4443
+
4444
+ " Add the current cursor position to the jump list, so that user can
4445
+ " jump back using the ' and ` marks.
4446
+ mark '
4447
+
4448
+ silent call search(tagpat, 'w')
4449
+
4450
+ " Bring the line to the middle of the window
4451
+ normal! z.
4452
+
4453
+ " If the line is inside a fold, open the fold
4454
+ if foldclosed('.') != -1
4455
+ .foldopen
4456
+ endif
4457
+ endfunction
4458
+
4459
+ " Tlist_Menu_Init
4460
+ " Initialize the taglist menu
4461
+ function! s:Tlist_Menu_Init()
4462
+ call s:Tlist_Menu_Add_Base_Menu()
4463
+
4464
+ " Automatically add the tags defined in the current file to the menu
4465
+ augroup TagListMenuCmds
4466
+ autocmd!
4467
+
4468
+ if !g:Tlist_Process_File_Always
4469
+ autocmd BufEnter * call s:Tlist_Refresh()
4470
+ endif
4471
+ autocmd BufLeave * call s:Tlist_Menu_Remove_File()
4472
+ augroup end
4473
+
4474
+ call s:Tlist_Menu_Update_File(0)
4475
+ endfunction
4476
+
4477
+ " Tlist_Vim_Session_Load
4478
+ " Initialize the taglist window/buffer, which is created when loading
4479
+ " a Vim session file.
4480
+ function! s:Tlist_Vim_Session_Load()
4481
+ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load')
4482
+
4483
+ " Initialize the taglist window
4484
+ call s:Tlist_Window_Init()
4485
+
4486
+ " Refresh the taglist window
4487
+ call s:Tlist_Window_Refresh()
4488
+ endfunction
4489
+
4490
+ " Tlist_Set_App
4491
+ " Set the name of the external plugin/application to which taglist
4492
+ " belongs.
4493
+ " Taglist plugin is part of another plugin like cream or winmanager.
4494
+ function! Tlist_Set_App(name)
4495
+ if a:name == ""
4496
+ return
4497
+ endif
4498
+
4499
+ let s:tlist_app_name = a:name
4500
+ endfunction
4501
+
4502
+ " Winmanager integration
4503
+
4504
+ " Initialization required for integration with winmanager
4505
+ function! TagList_Start()
4506
+ " If current buffer is not taglist buffer, then don't proceed
4507
+ if bufname('%') != '__Tag_List__'
4508
+ return
4509
+ endif
4510
+
4511
+ call Tlist_Set_App('winmanager')
4512
+
4513
+ " Get the current filename from the winmanager plugin
4514
+ let bufnum = WinManagerGetLastEditedFile()
4515
+ if bufnum != -1
4516
+ let filename = fnamemodify(bufname(bufnum), ':p')
4517
+ let ftype = s:Tlist_Get_Buffer_Filetype(bufnum)
4518
+ endif
4519
+
4520
+ " Initialize the taglist window, if it is not already initialized
4521
+ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized
4522
+ call s:Tlist_Window_Init()
4523
+ call s:Tlist_Window_Refresh()
4524
+ let s:tlist_window_initialized = 1
4525
+ endif
4526
+
4527
+ " Update the taglist window
4528
+ if bufnum != -1
4529
+ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update
4530
+ call s:Tlist_Window_Refresh_File(filename, ftype)
4531
+ endif
4532
+ endif
4533
+ endfunction
4534
+
4535
+ function! TagList_IsValid()
4536
+ return 0
4537
+ endfunction
4538
+
4539
+ function! TagList_WrapUp()
4540
+ return 0
4541
+ endfunction
4542
+
4543
+ " restore 'cpo'
4544
+ let &cpo = s:cpo_save
4545
+ unlet s:cpo_save
4546
+