# ctags-lang-julia

Random notes about tagging Julia source code with Universal-ctags

Version:

  6.2.0

Manual group:

  Universal-ctags

Manual section:

  7

## SYNOPSIS

ctags … --languages=+Julia …
ctags … --language-force=Julia …
ctags … --map-Julia=+.jl …

## DESCRIPTION

This man page gathers random notes about tagging Julia source code.

## TAGGING `import` AND `using` EXPRESSIONS

### Summary

using X

> name | kind | role | other noticeable fields
> --- | --- | --- | ---
> X | module | used | N/A

using X: a, b

> name | kind | role | other noticeable fields
> --- | --- | --- | ---
> X | module | namespace | N/A
> a, b | unknown | used | scope:module:X

import X

> name | kind | role | other noticeable fields
> --- | --- | --- | ---
> X | module | imported | N/A

import X.a, Y.b

> name | kind | role | other noticeable fields
> --- | --- | --- | ---
> X, Y | module | namespace | N/A
> a | unknown | imported | scope:module:X
> b | unknown | imported | scope:module:Y

import X: a, b

> name | kind | role | other noticeable fields
> --- | --- | --- | ---
> X | module | namespace | N/A
> a,b | unknown | imported | scope:module:X

### Examples

“input.jl”

    using X0

“output.tags” with “--options=NONE -o - --extras=+r --fields=+rzK input.jl”

    X0      input.jl        /^using X0$/;"  kind:module     roles:used

`--extras=+r` (or `--extras=+{reference}`) option is needed for this tag, since it’s a reference tag. This is because module `X` is not defined here. It is defined in another file. Enable `roles:` field with `--fields=+r` is for recording that the module is “used”, i.e., loaded by `using`.

“input.jl”

    import X1.a, X2.b, X3

“output.tags” with “--options=NONE -o - --extras=+r --fields=+rzKZ input.jl”

    X1      input.jl        /^import X1.a, X2.b, X3$/;"     kind:module     roles:namespace
    X2      input.jl        /^import X1.a, X2.b, X3$/;"     kind:module     roles:namespace
    X3      input.jl        /^import X1.a, X2.b, X3$/;"     kind:module     roles:imported
    a       input.jl        /^import X1.a, X2.b, X3$/;"     kind:unknown    scope:module:X1 roles:imported
    b       input.jl        /^import X1.a, X2.b, X3$/;"     kind:unknown    scope:module:X2 roles:imported

Why `X1` and `X2` have role “namespace”, while `X3` have role “imported”? It’s because the symbol `a` in module `X1`, and `b` in module `X2` are brought to the current scope, but `X1` and `X2` themselves are not. We use “namespace” role for such modules.

`X3` is different. The symbol `X3`, together with all exported symbols in `X3`, is brought to current scope. For such modules, we use “imported” or “used” role depending whether they are loaded by `import` or `using`.

Also, notice that `a` and `b` have the “unknown” kind. This is because we cannot know whether it’s a function, constant, or macro, etc.

## SEE ALSO

ctags(1), ctags-client-tools(7)