Skip to content
This repository
Browse code

Fixed tags file corruption on Windows!

 * Fixed tags file corruption on Windows: It turns out that the function
   readfile() accepts CR+NL line endings and just strips CR characters,
   however the writefile() function doesn't write CR+NL but just NL.
   Manually adding the CR characters to the end of each line before
   writing the tags file solves the corruption bug.

 * The headers and entries in tags files are now properly separated from
   each other while rewriting the tags file to filter expired entries.

 * Don't bother trying to filter expired tags when the tags file doesn't
   reference the current filename at all (improves performance a bit).

 * Fixed a buggy easytags#file_has_tags() call in easytags#autoload()
   that made the plug-in always scan each edited file at least once.

 * Changed folds to provide basic outline of function categories.

 * Restructured definitions for default configuration of dynamic syntax
   highlighting support so definitions don't all have to be indented.

Sorry about the large diff, this version took a few days of
experimentation to build which means lots of little changes.
  • Loading branch information...
commit ad3bd15a76acaeb8bd5c92e104ab95a7b55f6fee 1 parent dcbed28
Peter Odding authored June 13, 2010

Showing 2 changed files with 201 additions and 161 deletions. Show diff stats Hide diff stats

  1. 358  autoload.vim
  2. 4  easytags.vim
358  autoload.vim
... ...
@@ -1,12 +1,14 @@
1 1
 " Vim script
2 2
 " Maintainer: Peter Odding <peter@peterodding.com>
3  
-" Last Change: June 10, 2010
  3
+" Last Change: June 13, 2010
4 4
 " URL: http://peterodding.com/code/vim/easytags
5 5
 
6  
-function! easytags#autoload() " {{{1
  6
+" Public interface through (automatic) commands. {{{1
  7
+
  8
+function! easytags#autoload() " {{{2
7 9
   try
8 10
     " Update the entries for the current file in the global tags file?
9  
-    let pathname = expand('%')
  11
+    let pathname = s:resolve(expand('%:p'))
10 12
     let tags_outdated = getftime(pathname) > getftime(easytags#get_tagsfile())
11 13
     if tags_outdated || !easytags#file_has_tags(pathname)
12 14
       UpdateTags
@@ -30,32 +32,35 @@ function! easytags#autoload() " {{{1
30 32
   endtry
31 33
 endfunction
32 34
 
33  
-function! easytags#update_cmd(filter_invalid_tags) " {{{1
  35
+function! easytags#update_cmd(filter_invalid_tags) " {{{2
34 36
   try
  37
+    let filename = s:resolve(expand('%:p'))
35 38
     let ft_supported = index(easytags#supported_filetypes(), &ft) >= 0
36 39
     let ft_ignored = g:easytags_ignored_filetypes != '' && &ft =~ g:easytags_ignored_filetypes
37 40
     if (ft_supported && !ft_ignored) || a:filter_invalid_tags
38 41
       let start = xolox#timer#start()
39 42
       let tagsfile = easytags#get_tagsfile()
40  
-      let filename = s:resolve(expand('%:p'))
41 43
       let command = [g:easytags_cmd, '-f', shellescape(tagsfile), '--fields=+l']
42 44
       if filereadable(tagsfile)
43 45
         call add(command, '-a')
44  
-        let lines = readfile(tagsfile)
45  
-        call s:update_tagged_files(lines)
46  
-        let filters = []
47  
-        if ft_supported && !ft_ignored
48  
-          let filename_pattern = '\t' . xolox#escape#pattern(filename) . '\t'
49  
-          call add(filters, 'v:val !~ filename_pattern')
50  
-        endif
51  
-        if a:filter_invalid_tags
52  
-          call add(filters, 'filereadable(get(split(v:val, "\t"), 1))')
53  
-        endif
54  
-        let filter = 'v:val =~ "^!_TAG_" || (' . join(filters, ' && ') . ')'
55  
-        let filtered = filter(copy(lines), filter)
56  
-        if len(lines) != len(filtered)
57  
-          if writefile(filtered, tagsfile) != 0
58  
-            throw "Failed to write filtered tags file!"
  46
+        let filter_file_tags = easytags#file_has_tags(filename)
  47
+        if a:filter_invalid_tags || filter_file_tags
  48
+          let [header, entries] = easytags#read_tagsfile(tagsfile)
  49
+          let num_entries = len(entries)
  50
+          call s:set_tagged_files(entries)
  51
+          let filters = []
  52
+          if ft_supported && !ft_ignored && filter_file_tags
  53
+            let filename_pattern = '\t' . xolox#escape#pattern(filename) . '\t'
  54
+            call add(filters, 'v:val !~ filename_pattern')
  55
+          endif
  56
+          if a:filter_invalid_tags
  57
+            call add(filters, 'filereadable(get(split(v:val, "\t"), 1))')
  58
+          endif
  59
+          call filter(entries, join(filters, ' && '))
  60
+          if len(entries) != num_entries
  61
+            if !easytags#write_tagsfile(tagsfile, header, entries)
  62
+              throw "Failed to write filtered tags file!"
  63
+            endif
59 64
           endif
60 65
         endif
61 66
       endif
@@ -77,21 +82,7 @@ function! easytags#update_cmd(filter_invalid_tags) " {{{1
77 82
   endtry
78 83
 endfunction
79 84
 
80  
-function! easytags#supported_filetypes() " {{{1
81  
-  if !exists('s:supported_filetypes')
82  
-    let start = xolox#timer#start()
83  
-    let listing = system(g:easytags_cmd . ' --list-languages')
84  
-    if v:shell_error
85  
-      throw "Failed to get Exuberant Ctags language mappings!"
86  
-    endif
87  
-    let s:supported_filetypes = split(listing, '\n')
88  
-    call map(s:supported_filetypes, 'easytags#to_vim_ft(v:val)')
89  
-    call xolox#timer#stop(start, "easytags.vim: Parsed language mappings in %s second(s)")
90  
-  endif
91  
-  return s:supported_filetypes
92  
-endfunction
93  
-
94  
-function! easytags#highlight_cmd() " {{{1
  85
+function! easytags#highlight_cmd() " {{{2
95 86
   try
96 87
     if exists('g:syntax_on') && has_key(s:tagkinds, &ft)
97 88
       let start = xolox#timer#start()
@@ -124,7 +115,62 @@ function! easytags#highlight_cmd() " {{{1
124 115
   endtry
125 116
 endfunction
126 117
 
127  
-function! easytags#get_tagsfile() " {{{1
  118
+" Public supporting functions (might be useful to others). {{{1
  119
+
  120
+function! easytags#supported_filetypes() " {{{2
  121
+  if !exists('s:supported_filetypes')
  122
+    let start = xolox#timer#start()
  123
+    let listing = system(g:easytags_cmd . ' --list-languages')
  124
+    if v:shell_error
  125
+      throw "Failed to get Exuberant Ctags language mappings!"
  126
+    endif
  127
+    let s:supported_filetypes = split(listing, '\n')
  128
+    call map(s:supported_filetypes, 'easytags#to_vim_ft(v:val)')
  129
+    call xolox#timer#stop(start, "easytags.vim: Parsed language mappings in %s second(s)")
  130
+  endif
  131
+  return s:supported_filetypes
  132
+endfunction
  133
+
  134
+function! easytags#read_tagsfile(tagsfile) " {{{2
  135
+  let lines = readfile(a:tagsfile)
  136
+  let header = []
  137
+  while lines != [] && lines[0] =~# '^!_TAG_'
  138
+    call insert(header, remove(lines, 0))
  139
+  endwhile
  140
+  while lines != [] && lines[-1] == ''
  141
+    call remove(lines, -1)
  142
+  endwhile
  143
+  return [header, lines]
  144
+endfunction
  145
+
  146
+function! easytags#write_tagsfile(tagsfile, header, entries) " {{{2
  147
+  let lines = []
  148
+  if has('win32') || has('win64')
  149
+    for line in a:header
  150
+      call add(lines, line . "\r")
  151
+    endfor
  152
+    for entry in a:entries
  153
+      call add(lines, entry . "\r")
  154
+    endfor
  155
+  else
  156
+    call extend(lines, a:header)
  157
+    call extend(lines, a:entries)
  158
+  endif
  159
+  return writefile(lines, a:tagsfile) == 0
  160
+endfunction
  161
+
  162
+function! easytags#file_has_tags(filename) " {{{2
  163
+  call s:cache_tagged_files()
  164
+  return has_key(s:tagged_files, s:resolve(a:filename))
  165
+endfunction
  166
+
  167
+function! easytags#add_tagged_file(filename) " {{{2
  168
+  call s:cache_tagged_files()
  169
+  let filename = s:resolve(a:filename)
  170
+  let s:tagged_files[filename] = 1
  171
+endfunction
  172
+
  173
+function! easytags#get_tagsfile() " {{{2
128 174
   let tagsfile = expand(g:easytags_file)
129 175
   if filereadable(tagsfile) && filewritable(tagsfile) != 1
130 176
     let message = "The tags file isn't writable! (%s)"
@@ -133,7 +179,9 @@ function! easytags#get_tagsfile() " {{{1
133 179
   return tagsfile
134 180
 endfunction
135 181
 
136  
-function! easytags#define_tagkind(object) " {{{1
  182
+" Public API for file-type specific dynamic syntax highlighting. {{{1
  183
+
  184
+function! easytags#define_tagkind(object) " {{{2
137 185
   if !has_key(a:object, 'pattern_prefix')
138 186
     let a:object.pattern_prefix = '\C\<'
139 187
   endif
@@ -146,12 +194,12 @@ function! easytags#define_tagkind(object) " {{{1
146 194
   call add(s:tagkinds[a:object.filetype], a:object)
147 195
 endfunction
148 196
 
149  
-function! easytags#map_filetypes(vim_ft, ctags_ft) " {{{1
  197
+function! easytags#map_filetypes(vim_ft, ctags_ft) " {{{2
150 198
   call add(s:vim_filetypes, a:vim_ft)
151 199
   call add(s:ctags_filetypes, a:ctags_ft)
152 200
 endfunction
153 201
 
154  
-function! easytags#alias_filetypes(...) " {{{1
  202
+function! easytags#alias_filetypes(...) " {{{2
155 203
   for type in a:000
156 204
     if !has_key(s:aliases, type)
157 205
       let s:aliases[type] = {}
@@ -173,13 +221,13 @@ function! easytags#alias_filetypes(...) " {{{1
173 221
   endfor
174 222
 endfunction
175 223
 
176  
-function! easytags#to_vim_ft(ctags_ft) " {{{1
  224
+function! easytags#to_vim_ft(ctags_ft) " {{{2
177 225
   let type = tolower(a:ctags_ft)
178 226
   let index = index(s:ctags_filetypes, type)
179 227
   return index >= 0 ? s:vim_filetypes[index] : type
180 228
 endfunction
181 229
 
182  
-function! easytags#to_ctags_ft(vim_ft) " {{{1
  230
+function! easytags#to_ctags_ft(vim_ft) " {{{2
183 231
   let type = tolower(a:vim_ft)
184 232
   let index = index(s:vim_filetypes, type)
185 233
   return index >= 0 ? s:ctags_filetypes[index] : type
@@ -187,173 +235,165 @@ endfunction
187 235
 
188 236
 " Miscellaneous script-local functions. {{{1
189 237
 
190  
-function! s:resolve(pathname) " {{{2
  238
+function! s:resolve(filename) " {{{2
191 239
   if g:easytags_resolve_links
192  
-    return resolve(a:pathname)
  240
+    return resolve(a:filename)
193 241
   else
194  
-    return a:pathname
  242
+    return a:filename
195 243
   endif
196 244
 endfunction
197 245
 
198 246
 function! s:cache_tagged_files() " {{{2
199 247
   if !exists('s:tagged_files')
200 248
     let tagsfile = easytags#get_tagsfile()
201  
-    call s:update_tagged_files(readfile(tagsfile))
  249
+    let [header, entries] = easytags#read_tagsfile(tagsfile)
  250
+    call s:set_tagged_files(entries)
202 251
   endif
203 252
 endfunction
204 253
 
205  
-function! easytags#file_has_tags(pathname) " {{{2
206  
-  call s:cache_tagged_files()
207  
-  return has_key(s:tagged_files, s:resolve(a:pathname))
208  
-endfunction
209  
-
210  
-function! easytags#add_tagged_file(pathname) " {{{2
211  
-  call s:cache_tagged_files()
212  
-  let pathname = s:resolve(a:pathname)
213  
-  let s:tagged_files[pathname] = 1
214  
-endfunction
215  
-
216  
-function! s:update_tagged_files(lines) " {{{2
217  
-  " Update the dictionary of 
  254
+function! s:set_tagged_files(entries) " {{{2
218 255
   let s:tagged_files = {}
219  
-  for line in a:lines
220  
-    if line !~ '^!_TAG_'
221  
-      let pathname = matchstr(line, '^[^\t]\+\t\zs[^\t]\+')
222  
-      if pathname != ''
223  
-        let pathname = s:resolve(pathname)
224  
-        let s:tagged_files[pathname] = 1
225  
-      endif
  256
+  for entry in a:entries
  257
+    let filename = matchstr(entry, '^[^\t]\+\t\zs[^\t]\+')
  258
+    if filename != ''
  259
+      let filename = s:resolve(filename)
  260
+      let s:tagged_files[filename] = 1
226 261
     endif
227 262
   endfor
228 263
 endfunction
229 264
 
230 265
 " Built-in file type & tag kind definitions. {{{1
231 266
 
232  
-if !exists('s:tagkinds')
  267
+" Don't bother redefining everything below when this script is sourced again.
  268
+if exists('s:tagkinds')
  269
+  finish
  270
+endif
233 271
 
234  
-  let s:vim_filetypes = []
235  
-  let s:ctags_filetypes = []
236  
-  call easytags#map_filetypes('cpp', 'c++')
237  
-  call easytags#map_filetypes('cs', 'c#')
238  
-  call easytags#map_filetypes(exists('filetype_asp') ? filetype_asp : 'aspvbs', 'asp')
  272
+let s:tagkinds = {}
239 273
 
240  
-  let s:aliases = {}
241  
-  call easytags#alias_filetypes('c', 'cpp', 'objc', 'objcpp')
  274
+" Define the built-in Vim <=> Ctags file-type mappings.
  275
+let s:vim_filetypes = []
  276
+let s:ctags_filetypes = []
  277
+call easytags#map_filetypes('cpp', 'c++')
  278
+call easytags#map_filetypes('cs', 'c#')
  279
+call easytags#map_filetypes(exists('filetype_asp') ? filetype_asp : 'aspvbs', 'asp')
242 280
 
243  
-  let s:tagkinds = {}
  281
+" Define the Vim file-types that are aliased by default.
  282
+let s:aliases = {}
  283
+call easytags#alias_filetypes('c', 'cpp', 'objc', 'objcpp')
244 284
 
245  
-  " Enable line continuation.
246  
-  let s:cpo_save = &cpo
247  
-  set cpo&vim
  285
+" Enable line continuation.
  286
+let s:cpo_save = &cpo
  287
+set cpo&vim
248 288
 
249  
-  " Lua. {{{2
  289
+" Lua. {{{2
250 290
 
251  
-  call easytags#define_tagkind({
252  
-        \ 'filetype': 'lua',
253  
-        \ 'hlgroup': 'luaFunc',
254  
-        \ 'filter': 'get(v:val, "kind") ==# "f"'})
  291
+call easytags#define_tagkind({
  292
+      \ 'filetype': 'lua',
  293
+      \ 'hlgroup': 'luaFunc',
  294
+      \ 'filter': 'get(v:val, "kind") ==# "f"'})
255 295
 
256  
-  " C. {{{2
  296
+" C. {{{2
257 297
 
258  
-  call easytags#define_tagkind({
259  
-        \ 'filetype': 'c',
260  
-        \ 'hlgroup': 'cType',
261  
-        \ 'filter': 'get(v:val, "kind") =~# "[cgstu]"'})
  298
+call easytags#define_tagkind({
  299
+      \ 'filetype': 'c',
  300
+      \ 'hlgroup': 'cType',
  301
+      \ 'filter': 'get(v:val, "kind") =~# "[cgstu]"'})
262 302
 
263  
-  call easytags#define_tagkind({
264  
-        \ 'filetype': 'c',
265  
-        \ 'hlgroup': 'cPreProc',
266  
-        \ 'filter': 'get(v:val, "kind") ==# "d"'})
  303
+call easytags#define_tagkind({
  304
+      \ 'filetype': 'c',
  305
+      \ 'hlgroup': 'cPreProc',
  306
+      \ 'filter': 'get(v:val, "kind") ==# "d"'})
267 307
 
268  
-  call easytags#define_tagkind({
269  
-        \ 'filetype': 'c',
270  
-        \ 'hlgroup': 'cFunction',
271  
-        \ 'filter': 'get(v:val, "kind") =~# "[fp]"'})
  308
+call easytags#define_tagkind({
  309
+      \ 'filetype': 'c',
  310
+      \ 'hlgroup': 'cFunction',
  311
+      \ 'filter': 'get(v:val, "kind") =~# "[fp]"'})
272 312
 
273  
-  highlight def link cFunction Function
  313
+highlight def link cFunction Function
274 314
 
275  
-  " PHP. {{{2
  315
+" PHP. {{{2
276 316
 
277  
-  call easytags#define_tagkind({
278  
-        \ 'filetype': 'php',
279  
-        \ 'hlgroup': 'phpFunctions',
280  
-        \ 'filter': 'get(v:val, "kind") ==# "f"'})
  317
+call easytags#define_tagkind({
  318
+      \ 'filetype': 'php',
  319
+      \ 'hlgroup': 'phpFunctions',
  320
+      \ 'filter': 'get(v:val, "kind") ==# "f"'})
281 321
 
282  
-  call easytags#define_tagkind({
283  
-        \ 'filetype': 'php',
284  
-        \ 'hlgroup': 'phpClasses',
285  
-        \ 'filter': 'get(v:val, "kind") ==# "c"'})
  322
+call easytags#define_tagkind({
  323
+      \ 'filetype': 'php',
  324
+      \ 'hlgroup': 'phpClasses',
  325
+      \ 'filter': 'get(v:val, "kind") ==# "c"'})
286 326
 
287  
-  " Vim script. {{{2
  327
+" Vim script. {{{2
288 328
 
289  
-  call easytags#define_tagkind({
290  
-        \ 'filetype': 'vim',
291  
-        \ 'hlgroup': 'vimAutoGroup',
292  
-        \ 'filter': 'get(v:val, "kind") ==# "a"'})
  329
+call easytags#define_tagkind({
  330
+      \ 'filetype': 'vim',
  331
+      \ 'hlgroup': 'vimAutoGroup',
  332
+      \ 'filter': 'get(v:val, "kind") ==# "a"'})
293 333
 
294  
-  highlight def link vimAutoGroup vimAutoEvent
  334
+highlight def link vimAutoGroup vimAutoEvent
295 335
 
296  
-  call easytags#define_tagkind({
297  
-        \ 'filetype': 'vim',
298  
-        \ 'hlgroup': 'vimCommand',
299  
-        \ 'filter': 'get(v:val, "kind") ==# "c"',
300  
-        \ 'pattern_prefix': '\(\(^\|\s\):\?\)\@<=',
301  
-        \ 'pattern_suffix': '\(!\?\(\s\|$\)\)\@='})
  336
+call easytags#define_tagkind({
  337
+      \ 'filetype': 'vim',
  338
+      \ 'hlgroup': 'vimCommand',
  339
+      \ 'filter': 'get(v:val, "kind") ==# "c"',
  340
+      \ 'pattern_prefix': '\(\(^\|\s\):\?\)\@<=',
  341
+      \ 'pattern_suffix': '\(!\?\(\s\|$\)\)\@='})
302 342
 
303  
-  " Exuberant Ctags doesn't mark script local functions in Vim scripts as
304  
-  " "static". When your tags file contains search patterns this plug-in can use
305  
-  " those search patterns to check which Vim script functions are defined
306  
-  " globally and which script local.
  343
+" Exuberant Ctags doesn't mark script local functions in Vim scripts as
  344
+" "static". When your tags file contains search patterns this plug-in can use
  345
+" those search patterns to check which Vim script functions are defined
  346
+" globally and which script local.
307 347
 
308  
-  call easytags#define_tagkind({
309  
-        \ 'filetype': 'vim',
310  
-        \ 'hlgroup': 'vimFuncName',
311  
-        \ 'filter': 'get(v:val, "kind") ==# "f" && get(v:val, "cmd") !~? ''<sid>\w\|\<s:\w''',
312  
-        \ 'pattern_prefix': '\C\%(\<s:\|<[sS][iI][dD]>\)\@<!\<'})
  348
+call easytags#define_tagkind({
  349
+      \ 'filetype': 'vim',
  350
+      \ 'hlgroup': 'vimFuncName',
  351
+      \ 'filter': 'get(v:val, "kind") ==# "f" && get(v:val, "cmd") !~? ''<sid>\w\|\<s:\w''',
  352
+      \ 'pattern_prefix': '\C\%(\<s:\|<[sS][iI][dD]>\)\@<!\<'})
313 353
 
314  
-  call easytags#define_tagkind({
315  
-        \ 'filetype': 'vim',
316  
-        \ 'hlgroup': 'vimScriptFuncName',
317  
-        \ 'filter': 'get(v:val, "kind") ==# "f" && get(v:val, "cmd") =~? ''<sid>\w\|\<s:\w''',
318  
-        \ 'pattern_prefix': '\C\%(\<s:\|<[sS][iI][dD]>\)'})
  354
+call easytags#define_tagkind({
  355
+      \ 'filetype': 'vim',
  356
+      \ 'hlgroup': 'vimScriptFuncName',
  357
+      \ 'filter': 'get(v:val, "kind") ==# "f" && get(v:val, "cmd") =~? ''<sid>\w\|\<s:\w''',
  358
+      \ 'pattern_prefix': '\C\%(\<s:\|<[sS][iI][dD]>\)'})
319 359
 
320  
-  highlight def link vimScriptFuncName vimFuncName
  360
+highlight def link vimScriptFuncName vimFuncName
321 361
 
322  
-  " Python. {{{2
  362
+" Python. {{{2
323 363
 
324  
-  call easytags#define_tagkind({
325  
-        \ 'filetype': 'python',
326  
-        \ 'hlgroup': 'pythonFunction',
327  
-        \ 'filter': 'get(v:val, "kind") ==# "f"',
328  
-        \ 'pattern_prefix': '\%(\<def\s\+\)\@<!\<'})
  364
+call easytags#define_tagkind({
  365
+      \ 'filetype': 'python',
  366
+      \ 'hlgroup': 'pythonFunction',
  367
+      \ 'filter': 'get(v:val, "kind") ==# "f"',
  368
+      \ 'pattern_prefix': '\%(\<def\s\+\)\@<!\<'})
329 369
 
330  
-  call easytags#define_tagkind({
331  
-        \ 'filetype': 'python',
332  
-        \ 'hlgroup': 'pythonMethod',
333  
-        \ 'filter': 'get(v:val, "kind") ==# "m"',
334  
-        \ 'pattern_prefix': '\.\@<='})
  370
+call easytags#define_tagkind({
  371
+      \ 'filetype': 'python',
  372
+      \ 'hlgroup': 'pythonMethod',
  373
+      \ 'filter': 'get(v:val, "kind") ==# "m"',
  374
+      \ 'pattern_prefix': '\.\@<='})
335 375
 
336  
-  highlight def link pythonMethodTag pythonFunction
  376
+highlight def link pythonMethodTag pythonFunction
337 377
 
338  
-  " Java. {{{2
  378
+" Java. {{{2
339 379
 
340  
-  call easytags#define_tagkind({
341  
-        \ 'filetype': 'java',
342  
-        \ 'hlgroup': 'javaClass',
343  
-        \ 'filter': 'get(v:val, "kind") ==# "c"'})
  380
+call easytags#define_tagkind({
  381
+      \ 'filetype': 'java',
  382
+      \ 'hlgroup': 'javaClass',
  383
+      \ 'filter': 'get(v:val, "kind") ==# "c"'})
344 384
 
345  
-  call easytags#define_tagkind({
346  
-        \ 'filetype': 'java',
347  
-        \ 'hlgroup': 'javaMethod',
348  
-        \ 'filter': 'get(v:val, "kind") ==# "m"'})
  385
+call easytags#define_tagkind({
  386
+      \ 'filetype': 'java',
  387
+      \ 'hlgroup': 'javaMethod',
  388
+      \ 'filter': 'get(v:val, "kind") ==# "m"'})
349 389
 
350  
-  highlight def link javaClass Identifier
351  
-  highlight def link javaMethod Function
  390
+highlight def link javaClass Identifier
  391
+highlight def link javaMethod Function
352 392
 
353  
-  " Restore "cpoptions".
354  
-  let &cpo = s:cpo_save
355  
-  unlet s:cpo_save
  393
+" }}}
356 394
 
357  
-endif
  395
+" Restore "cpoptions".
  396
+let &cpo = s:cpo_save
  397
+unlet s:cpo_save
358 398
 
359 399
 " vim: ts=2 sw=2 et
4  easytags.vim
... ...
@@ -1,10 +1,10 @@
1 1
 " Vim plug-in
2 2
 " Maintainer: Peter Odding <peter@peterodding.com>
3  
-" Last Change: June 11, 2010
  3
+" Last Change: June 13, 2010
4 4
 " URL: http://peterodding.com/code/vim/easytags
5 5
 " Requires: Exuberant Ctags (http://ctags.sf.net)
6 6
 " License: MIT
7  
-" Version: 1.8
  7
+" Version: 1.9
8 8
 
9 9
 " Support for automatic update using the GLVS plug-in.
10 10
 " GetLatestVimScripts: 3114 1 :AutoInstall: easytags.zip

0 notes on commit ad3bd15

Please sign in to comment.
Something went wrong with that request. Please try again.