/trag_vim

A language-aware source code scanner (with support for git grep, ack, ag, sift ...)

Primary LanguageVim ScriptGNU General Public License v3.0GPL-3.0

This plugin uses ad-hoc searches to find strings in files. For certain 
languages, it can also find variable/function/class definitions, 
function calls etc.

Other than |tags| or |cscope|, it doesn't build a database to speed up 
searches but always scans all files. It can make use of the following 
external tools in order to gain acceptable performance for medium-sized 
projects:

    - `git grep`
    - `ack` http://beyondgrep.com/
    - `ag` https://github.com/ggreer/the_silver_searcher
    - `sift` https://sift-tool.org/

The builtin vimscript-based version file scanner and also 
|vimgrep| are suitable for small projects. See |g:trag#grep_type| for 
available options.


Usage~

First, define which files belong to your project. See 
|g:trag#file_sources| for available sources. If the variable contains 
"vcs" and the current buffer is under control of a supported VCS, trag 
will scan the files in the VCS. Maybe your project's source files are 
already registered in your tags files, in which case those will be used.

Secondly, use |:Trag| to scan your project's files. You can restrict searches 
to certain "kinds" like only variable definitions or only function calls. See 
|trag-kinds| for details.

You can also type <Leader>r# to search for the word under cursor (see 
|g:trag_map_leader| and |TragInstallMap()| for details on maps). In 
supported filetypes, <Leader>rd will search for the definition of the 
word under cursor.

Currently the following filetypes are supported:

    - java
    - javascript
    - json
    - make
    - r
    - ruby
    - viki
    - vim

Run `:echo globpath(&rtp, 'ftplugin/*/trag.vim')` to get a full listing 
of supported filetypes.

NOTE: Some kinds are available only for a subset of known filetypes.

Default maps (see also |TragInstallMap()|):

    <Leader>rr ... Trag the word under cursor
    <Leader>rq ... Show |quickfix|list via |:Tragcw|
    <Leader>rl ... Show |location-list| via |:Traglw|
    <Leader>rf ... Edit a file from the files list, i.e. the list that would be 
                   used if no "--file_sources" argument were passed to 
                   |:Trag|
    <Leader>r<Leader>x ... The same as `:Trag -l -i=x -x=i <cword><cr>`
                   where x is a alphabetical letter that describes a kind in 
                   |g:trag_kinds| and <cword> is the word under cursor.
                   "-x=i" (exclude commented text) is only added if kind x is 
                   in |g:trag_kinds_ignored_comments|.


-----------------------------------------------------------------------
Install~

Edit the vba file and type: >

    :so %

See :help vimball for details. If you have difficulties or use vim 7.0, 
please make sure, you have the current version of vimball (vimscript 
#1502) installed.

This script requires tlib (vimscript #1863) to be installed.


-----------------------------------------------------------------------
                                                    *trag-kinds*
Kinds~

Certain commands take a "kind" as argument. A "kind" in the context of 
trag means a way how the expression is interpreted and (in the future) 
how the lines are scanned. The meaning of the letter is specific for a 
certain filetype. In general, the following list should serve as a 
common base:

    c ... class definitions
    d ... function/method definitions
    f ... function calls
    i ... ignored lines, comments etc.
    l ... variable definition
    m ... module definitions
    r ... variable assignment (e.g. "= WORD")
    u ... uses of word (ignore comments)
    w ... find as word
    x ... subclasses

    fuzzy ... use a typo-tolerant regexp
    todo  ... TODO markers etc.

EXPERIMENTAL: Kinds can be joined as comma-separated list (OR) of 
period-seprated list (CONTAIN). This may be unintuitive but that's the 
way it is. Order in CONTAIN-patterns matters, i.e. w.i doesn't make too 
much sense (a word that CONTAINs a comment, which could only be the word 
itself) but i.w does (a comment that CONTAINs a word, which is quite 
possible).

The available command-line options are documented in |:Trag|. These 
command-line options allow users to defined which lines should be matched.

Example:
    -i=l,r ...... a word either on the left OR right hand side of an 
                  assignment
    -x=i ........ match lines that are not comments
    -i=w -x=i ... word that is NOT contained in a comment

More examples:
    File contents: >
        #1 function Foo() {}
        #2 function FooBar() {}
        #3 let x = FooBar()
        #4 let x = Foo()
<
    :TRag Foo
    => Find "Foo": 1-4

    :TRag -i=w Foo
    => Find the __w__ords "Foo": 1, 4

    :TRag -i=d Foo
    => Find __d__efinitions of "Foo": 1, 2

    :TRag -i=d.w Foo
    => Find __d__efinitions of the __w__ord "Foo": 1

    :TRag -i=f Foo
    => Find (__f__unction) calls of "Foo": 3, 4

    :TRag -i=f.w Foo
    => Find (__f__unction) calls of the __w__ord "Foo": 4


Not every kind is defined for every filetype. Currenty, support for 
the following filetype(s) is somewhat above average:
    - ruby
    - vim

Use |:TRagDefKind| to define new kinds.

See |trag#Grep()| for details of how to use this.


-----------------------------------------------------------------------
Install~

To install the vimball, edit the vba file and type: >

    :so %

See :help vimball for details.

To install from github, please use
    1. git + a plugin loader like enable_vim, pathogen, vim-unbundle etc.
    2. a plugin manager like VAM, Vundle, NeoBundle, vim-plug etc.

The tlib_vim plugin is required:
https://github.com/tomtom/tlib_vim

Also available via git: http://github.com/tomtom/trag_vim




Dependencies:
  tlib (>= 1.23) :: http://github.com/tomtom/tlib_vim

License: GPLv3 or later