diff options
-rw-r--r-- | TODO.md | 8 | ||||
-rw-r--r-- | autoload.vim | 32 | ||||
-rw-r--r-- | easytags.vim | 75 |
3 files changed, 78 insertions, 37 deletions
@@ -31,3 +31,11 @@ `~/.vim/autoload/easytags.vim` (a symbolic link to `~/Development/Vim/vim-easytags/autoload.vim`). I was already editing `~/.vim/autoload/easytags.vim` in another Vim buffer. + + * Convert `easytags#update_cmd()` to a function that can be executed on a + list of files and will only execute Exuberant Ctags once to do so, then + change `:UpdateTags` to accept an optional file glob, e.g. `:UpdateTags + /usr/include/lua5.1/*.h` and call `easytags#update_cmd()` on the matching + files. + +vim: ai nofen diff --git a/autoload.vim b/autoload.vim index b536908..efd18ce 100644 --- a/autoload.vim +++ b/autoload.vim @@ -1,8 +1,10 @@ " Vim script " Maintainer: Peter Odding <peter@peterodding.com> -" Last Change: June 14, 2010 +" Last Change: June 15, 2010 " URL: http://peterodding.com/code/vim/easytags +let s:script = expand('<sfile>:p:~') + " Public interface through (automatic) commands. {{{1 function! easytags#autoload() " {{{2 @@ -28,7 +30,7 @@ function! easytags#autoload() " {{{2 let b:easytags_last_highlighted = localtime() endif catch - call xolox#warning("easytags.vim: %s (at %s)", v:exception, v:throwpoint) + call xolox#warning("%s: %s (at %s)", s:script, v:exception, v:throwpoint) endtry endfunction @@ -59,7 +61,8 @@ function! easytags#update_cmd(filter_invalid_tags) " {{{2 call filter(entries, join(filters, ' && ')) if len(entries) != num_entries if !easytags#write_tagsfile(tagsfile, header, entries) - throw "Failed to write filtered tags file!" + let msg = "Failed to write filtered tags file %s!" + throw printf(msg, fnamemodify(tagsfile, ':~')) endif endif endif @@ -69,16 +72,18 @@ function! easytags#update_cmd(filter_invalid_tags) " {{{2 call add(command, shellescape(filename)) let listing = system(join(command)) if v:shell_error - throw "Failed to update tags file! (Ctags output: `" . listing . "')" + let msg = "Failed to update tags file %s: %s!" + throw printf(msg, fnamemodify(tagsfile, ':~'), strtrans(v:exception)) endif call easytags#add_tagged_file(filename) endif - call xolox#timer#stop(start, "easytags.vim: Updated tags in %s second(s)") + let msg = "%s: Updated tags for %s in %s." + call xolox#timer#stop(msg, s:script, expand('%:p:~'), start) return 1 endif return 0 catch - call xolox#warning("easytags.vim: %s (at %s)", v:exception, v:throwpoint) + call xolox#warning("%s: %s (at %s)", s:script, v:exception, v:throwpoint) endtry endfunction @@ -108,10 +113,11 @@ function! easytags#highlight_cmd() " {{{2 endif endfor redraw - call xolox#timer#stop(start, "easytags.vim: Highlighted tags in %s second(s)") + let msg = "%s: Highlighted tags in %s in %s." + call xolox#timer#stop(msg, s:script, expand('%:p:~'), start) endif catch - call xolox#warning("easytags.vim: %s (at %s)", v:exception, v:throwpoint) + call xolox#warning("%s: %s (at %s)", s:script, v:exception, v:throwpoint) endtry endfunction @@ -122,11 +128,13 @@ function! easytags#supported_filetypes() " {{{2 let start = xolox#timer#start() let listing = system(g:easytags_cmd . ' --list-languages') if v:shell_error - throw "Failed to get Exuberant Ctags language mappings!" + let msg = "Failed to get supported languages! (output: %s)" + throw printf(msg, strtrans(listing)) endif let s:supported_filetypes = split(listing, '\n') call map(s:supported_filetypes, 'easytags#to_vim_ft(v:val)') - call xolox#timer#stop(start, "easytags.vim: Parsed language mappings in %s second(s)") + let msg = "%s: Retrieved supported languages in %s." + call xolox#timer#stop(msg, s:script, start) endif return s:supported_filetypes endfunction @@ -173,8 +181,8 @@ endfunction function! easytags#get_tagsfile() " {{{2 let tagsfile = expand(g:easytags_file) if filereadable(tagsfile) && filewritable(tagsfile) != 1 - let message = "The tags file isn't writable! (%s)" - throw printf(message, tagsfile) + let message = "The tags file %s isn't writable!" + throw printf(message, fnamemodify(tagsfile, ':~')) endif return tagsfile endfunction diff --git a/easytags.vim b/easytags.vim index fc6ab77..30efb3d 100644 --- a/easytags.vim +++ b/easytags.vim @@ -1,10 +1,10 @@ " Vim plug-in " Maintainer: Peter Odding <peter@peterodding.com> -" Last Change: June 13, 2010 +" Last Change: June 15, 2010 " URL: http://peterodding.com/code/vim/easytags " Requires: Exuberant Ctags (http://ctags.sf.net) " License: MIT -" Version: 1.9 +" Version: 1.9.3 " Support for automatic update using the GLVS plug-in. " GetLatestVimScripts: 3114 1 :AutoInstall: easytags.zip @@ -40,38 +40,62 @@ if !exists('g:easytags_ignored_filetypes') let g:easytags_ignored_filetypes = '^tex$' endif -" Before sourcing the rest of the plug-in first check that the location of the -" "Exuberant Ctags" program has been configured or that the program exists in -" one of its default locations. - -if exists('g:easytags_cmd') && executable(g:easytags_cmd) - let s:ctags_installed = 1 -else +function! s:InitEasyTags(version) + " Check that the location of Exuberant Ctags has been configured or that the + " correct version of the program exists in one of its default locations. + if exists('g:easytags_cmd') && s:CheckCtags(g:easytags_cmd, a:version) + return 1 + endif " On Ubuntu Linux, Exuberant Ctags is installed as `ctags'. On Debian Linux, " Exuberant Ctags is installed as `exuberant-ctags'. On Free-BSD, Exuberant " Ctags is installed as `exctags'. Finally there is `ctags.exe' on Windows. - for s:command in ['ctags', 'exuberant-ctags', 'esctags', 'ctags.exe'] - if executable(s:command) - let g:easytags_cmd = s:command - let s:ctags_installed = 1 - break + for name in ['ctags', 'exuberant-ctags', 'esctags'] + if s:CheckCtags(name, a:version) + let g:easytags_cmd = name + return 1 endif endfor - unlet s:command -endif - -if !exists('s:ctags_installed') - echomsg "easytags.vim: Exuberant Ctags unavailable! Plug-in not loaded." - if executable('apt-get') - echomsg "On Ubuntu & Debian Linux, you can install Exuberant Ctags" - echomsg "by installing the package named `exuberant-ctags':" - echomsg " sudo apt-get install exuberant-ctags" +endfunction + +function! s:CheckCtags(name, version) + " Not every executable out there named `ctags' is in fact Exuberant Ctags. + " This function makes sure it is because the easytags plug-in requires the + " --list-languages option. + if executable(a:name) + let listing = system(a:name . ' --version') + let pattern = 'Exuberant Ctags \zs\d\+\(\.\d\+\)*' + let g:easytags_ctags_version = matchstr(listing, pattern) + return s:VersionToNumber(g:easytags_ctags_version) >= a:version + endif +endfunction + +function! s:VersionToNumber(s) + let values = split(a:s, '\.') + if len(values) == 1 + return values[0] * 10 + elseif len(values) >= 2 + return values[0] * 10 + values[1][0] + endif +endfunction + +if !s:InitEasyTags(55) + if !exists('g:easytags_ctags_version') || empty(g:easytags_ctags_version) + let msg = "easytags.vim: Plug-in not loaded because Exuberant Ctags isn't installed!" + if executable('apt-get') + let msg ,= " On Ubuntu & Debian you can install Exuberant Ctags by" + let msg .= " installing the package named `exuberant-ctags':" + let msg .= " sudo apt-get install exuberant-ctags" + else + let msg .= " Please download & install Exuberant Ctags from http://ctags.sf.net" + endif + echomsg msg else - echomsg "Please download & install Exuberant Ctags from http://ctags.sf.net" + let msg = "easytags.vim: Plug-in not loaded because Exuberant Ctags 5.5" + let msg .= " or newer is required while you have version %s installed!" + echomsg printf(msg, g:easytags_ctags_version) endif finish endif -unlet s:ctags_installed " Let Vim know about the global tags file created by this plug-in. @@ -106,6 +130,7 @@ augroup PluginEasyTags endif if g:easytags_on_cursorhold autocmd CursorHold,CursorHoldI * call easytags#autoload() + autocmd BufReadPost * unlet! b:easytags_last_highlighted endif autocmd User PublishPre HighlightTags augroup END |