aboutsummaryrefslogtreecommitdiffstats
path: root/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugin')
-rw-r--r--plugin/easytags.vim181
1 files changed, 181 insertions, 0 deletions
diff --git a/plugin/easytags.vim b/plugin/easytags.vim
new file mode 100644
index 0000000..64361a7
--- /dev/null
+++ b/plugin/easytags.vim
@@ -0,0 +1,181 @@
+" Vim plug-in
+" Author: Peter Odding <peter@peterodding.com>
+" Last Change: May 13, 2013
+" URL: http://peterodding.com/code/vim/easytags/
+" Requires: Exuberant Ctags (http://ctags.sf.net)
+
+" Support for automatic update using the GLVS plug-in.
+" GetLatestVimScripts: 3114 1 :AutoInstall: easytags.zip
+
+" Don't source the plug-in when it's already been loaded or &compatible is set.
+if &cp || exists('g:loaded_easytags')
+ finish
+endif
+
+" Configuration defaults and initialization. {{{1
+
+if !exists('g:easytags_file')
+ if xolox#misc#os#is_win()
+ let g:easytags_file = '~\_vimtags'
+ else
+ let g:easytags_file = '~/.vimtags'
+ endif
+endif
+
+if !exists('g:easytags_by_filetype')
+ let g:easytags_by_filetype = ''
+endif
+
+if !exists('g:easytags_events')
+ let g:easytags_events = []
+ if !exists('g:easytags_on_cursorhold') || g:easytags_on_cursorhold
+ call extend(g:easytags_events, ['CursorHold', 'CursorHoldI'])
+ endif
+ if exists('g:easytags_always_enabled') && g:easytags_always_enabled
+ call extend(g:easytags_events, ['BufReadPost', 'BufWritePost', 'FocusGained', 'ShellCmdPost', 'ShellFilterPost'])
+ endif
+endif
+
+if !exists('g:easytags_ignored_filetypes')
+ let g:easytags_ignored_filetypes = '^tex$'
+endif
+
+if !exists('g:easytags_ignored_syntax_groups')
+ let g:easytags_ignored_syntax_groups = '.*String.*,.*Comment.*,cIncluded'
+endif
+
+if !exists('g:easytags_python_script')
+ let g:easytags_python_script = expand('<sfile>:p:h') . '/../misc/easytags/highlight.py'
+endif
+
+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
+ if xolox#misc#os#is_win()
+ " FIXME The code below that searches the $PATH is not used on Windows at
+ " the moment because xolox#misc#path#which() generally produces absolute
+ " paths and on Windows these absolute paths tend to contain spaces which
+ " makes xolox#shell#execute_with_dll() fail. I've tried quoting the
+ " program name with double quotes but it fails just the same (it works
+ " with system() though). Anyway the problem of having multiple conflicting
+ " versions of Exuberant Ctags installed is not that relevant to Windows
+ " since it doesn't have a package management system. I still want to fix
+ " xolox#shell#execute_with_dll() though.
+ if s:CheckCtags('ctags', a:version)
+ let g:easytags_cmd = 'ctags'
+ return 1
+ endif
+ else
+ " Exuberant Ctags can be installed under multiple names:
+ " - On Ubuntu Linux, Exuberant Ctags is installed as `ctags-exuberant'
+ " (and possibly `ctags' but that one can't be trusted :-)
+ " - On Debian Linux, Exuberant Ctags is installed as `exuberant-ctags'.
+ " - On Free-BSD, Exuberant Ctags is installed as `exctags'.
+ " IIUC on Mac OS X the program /usr/bin/ctags is installed by default but
+ " unusable and when the user installs Exuberant Ctags in an alternative
+ " location, it doesn't come before /usr/bin/ctags in the search path. To
+ " solve this problem in a general way and to save every Mac user out there
+ " some frustration the plug-in will search the path and consider every
+ " possible location, meaning that as long as Exuberant Ctags is installed
+ " in the $PATH the plug-in should find it automatically.
+ for program in xolox#misc#path#which('exuberant-ctags', 'ctags-exuberant', 'ctags', 'exctags')
+ if s:CheckCtags(program, a:version)
+ let g:easytags_cmd = program
+ return 1
+ endif
+ endfor
+ endif
+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 (and more).
+ if executable(a:name)
+ let command = a:name . ' --version'
+ let result = xolox#misc#os#exec({'command': command, 'check': 0})
+ if result['exit_code'] == 0
+ let pattern = 'Exuberant Ctags \zs\(\d\+\(\.\d\+\)*\|Development\)'
+ let g:easytags_ctags_version = matchstr(result['stdout'][0], pattern)
+ if g:easytags_ctags_version == 'Development'
+ return 1
+ else
+ return s:VersionToNumber(g:easytags_ctags_version) >= a:version
+ endif
+ endif
+ 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_suppress_ctags_warning') && g:easytags_suppress_ctags_warning
+ finish
+ endif
+ if !exists('g:easytags_ctags_version') || empty(g:easytags_ctags_version)
+ let s:msg = "easytags.vim %s: Plug-in not loaded because Exuberant Ctags isn't installed!"
+ if executable('apt-get')
+ let s:msg .= " On Ubuntu & Debian you can install Exuberant Ctags by"
+ let s:msg .= " installing the package named `exuberant-ctags':"
+ let s:msg .= " sudo apt-get install exuberant-ctags"
+ else
+ let s:msg .= " Please download & install Exuberant Ctags from http://ctags.sf.net"
+ endif
+ echomsg printf(s:msg, g:xolox#easytags#version)
+ else
+ let s:msg = "easytags.vim %s: Plug-in not loaded because Exuberant Ctags 5.5"
+ let s:msg .= " or newer is required while you have version %s installed!"
+ echomsg printf(s:msg, g:xolox#easytags#version, g:easytags_ctags_version)
+ endif
+ unlet s:msg
+ finish
+endif
+
+" The plug-in initializes the &tags option as soon as possible so that the
+" global tags file is available when using "vim -t some_tag". If &tags is
+" reset, we'll try again on the "VimEnter" automatic command event (below).
+call xolox#easytags#register(1)
+
+" The :UpdateTags and :HighlightTags commands. {{{1
+
+command! -bar -bang -nargs=* -complete=file UpdateTags call xolox#easytags#update(0, <q-bang> == '!', [<f-args>])
+command! -bar HighlightTags call xolox#easytags#highlight()
+command! -bang TagsByFileType call xolox#easytags#by_filetype(<q-bang> == '!')
+
+" Automatic commands. {{{1
+
+augroup PluginEasyTags
+ autocmd!
+ " This is the alternative way of registering the global tags file using
+ " the automatic command event "VimEnter". Apparently this makes the
+ " plug-in behave better when used together with tplugin?
+ autocmd VimEnter * call xolox#easytags#register(1)
+ " Define the automatic commands to perform updating/highlighting.
+ for s:eventname in g:easytags_events
+ execute 'autocmd' s:eventname '* call xolox#easytags#autoload(' string(s:eventname) ')'
+ endfor
+ " Define an automatic command to register file type specific tags files?
+ if !empty(g:easytags_by_filetype)
+ autocmd FileType * call xolox#easytags#register(0)
+ endif
+ " After reloading a buffer the dynamic syntax highlighting is lost. The
+ " following code makes sure the highlighting is refreshed afterwards.
+ autocmd BufReadPost * unlet! b:easytags_last_highlighted
+augroup END
+
+" }}}1
+
+" Make sure the plug-in is only loaded once.
+let g:loaded_easytags = 1
+
+" vim: ts=2 sw=2 et