hcs42
hcs42

Reputation: 13716

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

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.

Upvotes: 6

Views: 1402

Answers (4)

jmuc
jmuc

Reputation: 1571

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>

Upvotes: 5

CaTFooD
CaTFooD

Reputation: 73

i'm a sublime 2 text user and find ctags works correctly in my computer. and i use ctags plugin for sublime 2.


->ctags --version

Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Jul 24 2012, 11:45:55
Addresses: <[email protected]>, http://ctags.sourceforge.net
Optional compiled features: +wildcards, +regex

Upvotes: 0

lht
lht

Reputation: 378

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.

Upvotes: 4

Christian
Christian

Reputation: 9486

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

Upvotes: 1

Related Questions