Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting ctags to include module qualifiers in the tags file for Erlang code

Tags:

erlang

ctags

I'm using Exuberant ctags to index Erlang files.

The "tags" file contains functions, but they do not have module qualifiers; so I can't search for "module:function", only "function", which may give several results.

Do you know a way to get ctags to include module qualifiers in the tags file?

Thanks.

like image 262
hcs42 Avatar asked Sep 24 '09 12:09

hcs42


3 Answers

Like lht wrote, Exuberant Ctags 5.8 already stores the module of the function in the tags file. At least with recent versions of Vim (7.4) this information can be accessed. It is then possible to look up "module:function" using a custom "tag" function, e.g.:

function! ErlangTag()
    let isk_orig = &isk
    set isk+=:
    let keyword = expand('<cword>')
    let &isk = isk_orig
    let parts = split(keyword, ':')
    if len(parts) == 1
        execute 'tag' parts[0]
    elseif len(parts) == 2
        let [mod, fun] = parts
        let i = 1
        let fun_taglist = taglist('^' . fun . '$')
        for item in fun_taglist
           if item.kind == 'f' && item.module == mod
               silent execute i . 'tag' fnameescape(item.name)
               break
           endif
           let i += 1
        endfor
    endif
endfunction

nnoremap <buffer> <c-]>    :call ErlangTag()<cr>
like image 99
jmuc Avatar answered Sep 20 '22 10:09

jmuc


Exuberant ctags already supports tag field "module" for Erlang.

$ /usr/bin/ctags --version
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Aug 17 2010, 17:33:33
  Addresses: <[email protected]>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex
$ /usr/bin/ctags xref_parser.erl

A typical tag line with a tag field named "module" looks like:

yeccgoto_const  xref_parser.erl /^yeccgoto_const(24=_S, Cat, Ss, Stack, T, Ts, Tzr) ->$/;"      f       module:xref_parser

Actually, it is VIM which doesn't support this tag field as for now. From VIM doc:

{field} ..  A list of optional fields.  Each field has the form:

            <Tab>{fieldname}:{value}

        The {fieldname} identifies the field, and can only contain
        alphabetical characters [a-zA-Z].
        The {value} is any string, but cannot contain a <Tab>.

        There is one field that doesn't have a ':'.  This is the kind
        of the tag.  It is handled like it was preceded with "kind:".
        See the documentation of ctags for the kinds it produces.

        The only other field currently recognized by Vim is "file:"
        (with an empty value).  It is used for a static tag.

That's it. Only "kind" and "file" are supported tag field names.

like image 34
lht Avatar answered Sep 22 '22 10:09

lht


It sounds like you are not using the Erlang etags module: Generate Emacs TAGS file from Erlang source files.

like image 25
Christian Avatar answered Sep 20 '22 10:09

Christian