Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP


Define version as variable, include version in messages


Remove duplicate tag from Vim help file


Documentation bug fix (it's getting late..)


2x faster syntax highlighting using Python Interface to Vim :-)


Fix caching of tagged files (for file type specific tags files)
 * The easytags plug-in caches known tagged files so it doesn't have to
   run :UpdateTags whenever you edit an existing file. The previous
   implementation was based on the assumption of one global tags file so
   wasn't compatible with the concept of file type specific tags files.
   This should now be fixed.

 * Previously the plug-in worked with a combination of parsed and
   unparsed tags file entries which made the code confusing. I've now
   cleaned this up so that the plug-in only keeps one type of data in

 * Moved resetting of s:cached_filenames from the end to the start of the
   functions that call s:canonicalize() to avoid caching invalid data.

PS. I've benchmarked two cache_tagged_files() implementations, one using
    taglist('.'), the other calling xolox#easytags#read_tagsfile() on each
    tags file reported by the tagfiles() function. It turns out that
    taglist('.') is very slow, which explains why I went with the code
    that calls xolox#easytags#read_tagsfile() in a loop.


:TagsByFileType to create filetype specific tagsfiles from global tag…


Basic support for file type specific tags files!


Bug fix: Print the right message after :verbose UpdateTags!


Move tags file registration to auto load function
(in preparation for file type specific tags files)


Minor bug fix for xolox#easytags#get_tagsfile()
The plug-in now checks if dynamic tags files are writable.


Refactor automatic command registration, include more events
The new events are FocusGained, ShellCmdPost and ShellFilterPost but
they're only used when g:easytags_always_enabled is enabled (it's
disabled by default).

Users can now define their own list of preferred events to override the
defaults by setting the new g:easytags_events option to a list of event
names. I haven't documented the new option yet because I'm not convinced
it's an improvement in terms of usability over the old situation.


Automatically run :HighlightTags after using :UpdateTags


Remove hack that checks whether submodule is initialized


Bug fix for highlighting of C# classes


Dynamic highlighting for Ruby source code (issue #9)


Check that the xolox#misc submodule is available


Enable updating of project specific tags files


Don't use feedkeys() hack for Vim >= 7.3
Daniel Hahler pointed out to me that the feedkeys() hack is no longer
needed since Vim 7.3. Now it will only be used for earlier versions.


Remove useless "easytags_register_late" option
Because s:RegisterTagsFile() is (supposed to be) idempotent we can just
call it twice instead of relying on users to properly configure the
plug-in. See the discussion on the previous commit* for more information.



Enable deferring tags file registration (VimEnter)
By default 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 you don't use "vim -t" and want to defer registering the global tags
file until the interface has been initialized you can now set the global
variable g:easytags_register_late = 1.

This commit is based on a pull request from Daniel Hahler, I added the
option to enable either mode of initialization (I guess Daniel doesn't
use "vim -t some_tag", but I certainly do :-). Here's the original
commit message:

    Move calling RegisterTagsFile to `au VimEnter`.

    Calling RegisterTagsFile on VimEnter instead of when including the
    plugin appears to make it behave better when (re)setting 'tags' in

    I do not remember if this is related to using tplugin only.


Accept 'Development' as valid version
'Development' is being used when ctags is getting built from its source
repository. This is what it looks like:

    % ctags --version
    Exuberant Ctags Development, Copyright (C) 1996-2009 Darren Hiebert
      Compiled: Mar  8 2011, 17:57:10
      Addresses: <>,
      Optional compiled features: +win32, +regex, +internal-sort


Add g:easytags_suppress_ctags_warning option
When set and != 0 this will suppress the ctags warning on startup.


Highlight C# classes, structs and methods


Don't highlight PHP functions not followed by `('
This improves accuracy because PHP doesn't have first class functions


Bug fix for alias handling


Highlighting for Python class names


Don't highlight tags inside #include <...>


Bug fix: Canonicalize arguments to :UpdateTags!


Fixed easytags#update() to overcome argument limit
The easytags#update() function previously used the variable argument
list notation `...' but I just found out [the hard way] that this only
supports up to 20 arguments. Therefor I've now changed easytags#update()
to receive a list of zero or more filenames as its third argument.


Fix automatic ctags detection on FreeBSD (reported by Derek Tattersall)


Always scan C sources for prototypes
Dynamic highlighting supports C/C++ function prototypes to enable
highlighting of library functions based on just the headers, but until
now the easytags.vim plug-in didn't request ctags to include function
prototypes. Now it does so automatically.


Support scanning & highlighting of struct/class members


Support for automatic recursion using ctags -R


Enable commands like :UpdateTags -R ~/.vim
 * The :UpdateTags command now passes any arguments given to it on to
   Exuberant Ctags, which sounds simple enough but required a complex
   implementation. This means users can now do things like:

     :UpdateTags -R ~/.vim

   Because Ctags can be run easily from inside Vim, users won't have to
   run it manually from the command line. The plug-in also makes sure
   the required command-line options to Ctags are always used.

 * Fixed a problem most users will probably never encounter. I'm not
   sure whether this is by design or an implementation detail but it's
   possible for the "!_TAG_FILE_SORTED" header to appear after one or
   more tags and Vim will apparently still use the header! For this
   reason the easytags#write_tagsfile() function should also recognize
   it, otherwise Vim might complain with "E432: Tags file not sorted".

 * Always sort tags in easytags#write_tagsfile() (understands foldcase)

 * Finally documented the :UpdateTags and :HighlightTags commands.

 * The dynamic highlighting can now be disabled for individual buffers,
   which can come in handy when the highlighting conflicts with another
   plug-in: Just set the 'b:easytags_nohl' variable to any value.

 * Removed hard wrapping from because I've recently switched
   to a 21" external monitor ;-)


Another bug fix for the broken :set tags= command
Previously* I fixed a bug where easytags.vim failed to register the
global tags file created by the plug-in with Vim, because even though
the &tags option was set by the plug-in, Vim would refuse to acknowledge
the new tags file, i.e. tagfiles() == [].

The fix then was to change :let &tags= to :set tags= which apparently
has a different implementation from :let &tags=?! I assumed this fix
would be valid for both Windows and UNIX, but apparently this still
doesn't work on Windows! There we actually have to use feedkeys() to
convince Vim to change the &tags option... What a hack! :-(

BTW I also fixed an embarrassing typo in the initialization code.

* Bug fix for strange "E433: No tags file" problem:


Bug fix for strange "E433: No tags file" problem
The plug-in is supposed to automatically register the global tags file
with Vim by setting the "tags" option but this didn't work because of
what's probably a bug in Vim: When you set the "tags" option using the
following syntax, Vim will fail to add the new tags file:

    let &tags = ...

But when you switch to the following syntax it works:

    :set tags=...


Version detection, better error handling, bug fix for dynamic highlig…

 * The plug-in now executes `ctags --version` on startup to verify that
   the correct version of Exuberant Ctags is installed because some
   systems (including Mac OS X apparently) ship with a `/usr/bin/ctags`
   installed that doesn't understand the extensive set of command-line
   arguments supported by Exuberant Ctags.

 * When a file was edited multiple times the dynamic highlighting
   wouldn't refresh because the plug-in thought the highlighting was
   still in effect while in reality it was cleared by reading the file
   again. Now the highlighting will be refreshed on the next CursorHold
   event like it's supposed to.


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.


Bug fix: Add easytags_file to &tags option
While writing the `easytags.vim` plug-in at one point I added the
following line to my `~/.vimrc` script:

    :set tags=~/.vimtags

After publishing the plug-in I totally forgot about the `tags` option
and how the plug-in depends on it for all of its functionality :-S

The plug-in now adds the (possibly user-defined) value of the
`easytags_file` option to Vim's `tags` option, thereby making Vim's
internals aware of the tags file.

Oh by the way, the plug-in is now more-or-less Windows compatible.
The only remaining problems are the flashing command prompt (which
I know how to fix) and the fact that CursorHold seems to fire


Alias support & defaults for C/C++/Obj-C/Obj-C++
In my ~/.vimrc I've set the following:

    :let c_syntax_for_h = 1

Which means easytags.vim will also scan *.h files as C source-code.
However Exuberant Ctags by default scans *.h files as C++, so when
you update your global tags file as follows from the command-line:

    ctags -af ~/.vimtags /usr/include/lua5.1/*.h

Which I happened to try today, the new tags won't be highlighted in
your C source-code because Exuberant Ctags thinks it's C++ and Vim
doesn't know otherwise. I've now added support for aliases between
file types and added a default set of aliases between C, C++, Obj-C
and Obj-C++.
Something went wrong with that request. Please try again.