1
2 Author:peter@peterodding.com
3 Last Change:
4 URL:http://peterodding.com/code/vim/easytags/
5 Requires:http://ctags.sf.net
6 License:
7 Version:
8
9
10 GetLatestVimScripts::AutoInstall
11
12 &compatible
13 if &cp || exists('g:loaded_easytags')
14 finish
15 endif
16
17 let s:script = expand('<sfile>:p:~')
18
19
20
21 if !exists('g:easytags_file')
22 if has('win32') || has('win64')
23 let g:easytags_file = '~\_vimtags'
24 else
25 let g:easytags_file = '~/.vimtags'
26 endif
27 endif
28
29 if !exists('g:easytags_resolve_links')
30 let g:easytags_resolve_links = 0
31 endif
32
33 if !exists('g:easytags_always_enabled')
34 let g:easytags_always_enabled = 0
35 endif
36
37 if !exists('g:easytags_on_cursorhold')
38 let g:easytags_on_cursorhold = 1
39 endif
40
41 if !exists('g:easytags_ignored_filetypes')
42 let g:easytags_ignored_filetypes = '^tex$'
43 endif
44
45 if !exists('g:easytags_autorecurse')
46 let g:easytags_autorecurse = 0
47 endif
48
49 if !exists('g:easytags_include_members')
50 let g:easytags_include_members = 0
51 endif
52
53 function! s:InitEasyTags(version)
54
55
56 if exists('g:easytags_cmd') && s:CheckCtags(g:easytags_cmd, a:version)
57 return 1
58 endif
59
60
61
62 for name in ['ctags', 'exuberant-ctags', 'exctags']
63 if s:CheckCtags(name, a:version)
64 let g:easytags_cmd = name
65 return 1
66 endif
67 endfor
68 endfunction
69
70 function! s:CheckCtags(name, version)
71
72
73
74 if executable(a:name)
75 let command = a:name . ' --version'
76 try
77 let listing = join(xolox#shell#execute(command, 1), '\n')
78 catch /^Vim\%((\a\+)\)\=:E117/
79
80 let listing = system(command)
81 catch
82 xolox#shell#execute()
83
84
85 return
86 endtry
87 let pattern = 'Exuberant Ctags \zs\d\+\(\.\d\+\)*'
88 let g:easytags_ctags_version = matchstr(listing, pattern)
89 return s:VersionToNumber(g:easytags_ctags_version) >= a:version
90 endif
91 endfunction
92
93 function! s:VersionToNumber(s)
94 let values = split(a:s, '\.')
95 if len(values) == 1
96 return values[0] * 10
97 elseif len(values) >= 2
98 return values[0] * 10 + values[1][0]
99 endif
100 endfunction
101
102 if !s:InitEasyTags(55)
103 if !exists('g:easytags_ctags_version') || empty(g:easytags_ctags_version)
104 let s:msg = "%s: Plug-in not loaded because Exuberant Ctags isn't installed!"
105 if executable('apt-get')
106 let s:msg .= " On Ubuntu & Debian you can install Exuberant Ctags by"
107 let s:msg .= " installing the package named `exuberant-ctags':"
108 let s:msg .= " sudo apt-get install exuberant-ctags"
109 else
110 let s:msg .= " Please download & install Exuberant Ctags from http://ctags.sf.net"
111 endif
112 echomsg printf(s:msg, s:script)
113 else
114 let s:msg = "%s: Plug-in not loaded because Exuberant Ctags 5.5"
115 let s:msg .= " or newer is required while you have version %s installed!"
116 echomsg printf(s:msg, s:script, g:easytags_ctags_version)
117 endif
118 unlet s:msg
119 finish
120 endif
121
122 function! s:RegisterTagsFile()
123 &tags
124 tagfiles()
125 let tagfiles = xolox#option#split_tags(&tags)
126 let expanded = map(copy(tagfiles), 'resolve(expand(v:val))')
127 &tags
128 if index(expanded, resolve(expand(g:easytags_file))) == -1
129 :let&tags
130 :set
131 "doesn't work"tagfiles():let:set
132
133 :set
134
135 tagfiles()
136 call insert(tagfiles, g:easytags_file)
137 let value = xolox#option#join_tags(tagfiles)
138 let cmd = ':set tags=' . escape(value, '\ ')
139 if has('win32') || has('win64')
140 TODO
141 call feedkeys(":" . cmd . "|let &ro=&ro\<CR>", 'n')
142 else
143 execute cmd
144 endif
145 endif
146 endfunction
147
148
149 call s:RegisterTagsFile()
150
151 :UpdateTags:HighlightTags
152
153 command! -bar -bang -nargs=* -complete=file UpdateTags call easytags#update(0, <q-bang> == '!', [<f-args>])
154 command! -bar HighlightTags call easytags#highlight()
155
156
157
158 augroup PluginEasyTags
159 autocmd!
160 if g:easytags_always_enabled
161 TODO
162 autocmd BufReadPost,BufWritePost * call easytags#autoload()
163 endif
164 if g:easytags_on_cursorhold
165 autocmd CursorHold,CursorHoldI * call easytags#autoload()
166 autocmd BufReadPost * unlet! b:easytags_last_highlighted
167 endif
168 augroup END
169
170
171
172
173 let g:loaded_easytags = 1
174
175