ctags.rb
simple ruby wrapper for universal-ctags and ripper-tags
usage
>> pp Ctags.tags_for_file('/usr/lib/ruby/1.8/timeout.rb')
[
{:path=> "/usr/lib/ruby/1.8/timeout.rb", :kind=>"module", :language=>"Ruby", :pattern=>"module Timeout", :name=>"Timeout", :line=>30},
{:path=> "/usr/lib/ruby/1.8/timeout.rb", :kind=>"class", :class=>"Timeout", :language=>"Ruby", :pattern=>"class Error < Interrupt", :name=>"Error", :line=>35},
{:path=> "/usr/lib/ruby/1.8/timeout.rb", :kind=>"method", :class=>"Timeout", :language=>"Ruby", :pattern=>"def timeout(sec, klass = nil)", :name=>"timeout", :line=>52},
]
architecture
This ctags.rb gem includes the sources of my fork of universal-ctags. The source is compiled into a ctags
binary when the gem is installed, and the binary is invoked as an external program by this gem to generate code tags.
The changes in my fork include universal-ctags/ctags#1071, which adds an interactive mode. In this mode, a single long-running instance of ctags
can be used to generate tags for various inputs by sending it json commands over a pipe. Code can also be streamed into ctags
over stdin, for cases where it is fetched over a network and not readily available on disk. This parent-child setup was chosen for several reasons:
- the ctags codebase was written as a unix command line utility, which makes it very hard to link directly and use as a library (error handling generally causes an
exit(1)
and leaves global variables in a dirty state) - the language parsers in ctags could contain security vulnerabilities, so running them in a separate process provides for better sandboxing opportunities
- on some platforms (like win32), process bootup cost is very expensive. using a single long-running ctags invocation eliminates this overhead.
license
ctags.rb is licensed under the MIT license.
universal-ctags is licensed under the GPLv2 license.