Home

Awesome

ptags

A parallel universal-ctags wrapper for git repository

Actions Status Crates.io codecov

Description

ptags is a universal-ctags wrapper to have the following features.

Install

Download binary

Download from release page, and extract to the directory in PATH.

Arch Linux

You can install from AUR.

If you use yay, you can install like below:

yay -S ptags       // latest tagged version
yay -S ptags-git   // current master of git repo

Cargo

You can install by cargo.

cargo install ptags

Requirement

ptags uses ctags and git command internally. The tested version is below.

CommandVersion
ctagsUniversal Ctags 0.0.0(f9e6e3c1) / Exuberant Ctags 5.8
gitgit version 2.14.2
git-lfsgit-lfs/2.3.3

Usage

ptags 0.1.12-pre
dalance@gmail.com
A parallel universal-ctags wrapper for git repository

USAGE:
    ptags [FLAGS] [OPTIONS] [--] [DIR]

FLAGS:
        --config               Generate configuration sample file
        --exclude-lfs          Exclude git-lfs tracked files
    -h, --help                 Prints help information
        --include-ignored      Include ignored files
        --include-submodule    Include submodule files
        --include-untracked    Include untracked files
    -s, --stat                 Show statistics
        --unsorted             Disable tags sort
        --validate-utf8        Validate UTF8 sequence of tag file
    -V, --version              Prints version information
    -v, --verbose              Verbose mode

OPTIONS:
        --bin-ctags <bin_ctags>           Path to ctags binary [default: ctags]
        --bin-git <bin_git>               Path to git binary [default: git]
        --completion <completion>         Generate shell completion file [possible values: bash, fish,
                                          zsh, powershell]
    -e, --exclude <exclude>...            Glob pattern of exclude file ( ex. --exclude '*.rs' )
    -c, --opt-ctags <opt_ctags>...        Options passed to ctags
    -g, --opt-git <opt_git>...            Options passed to git
        --opt-git-lfs <opt_git_lfs>...    Options passed to git-lfs
    -f, --file <output>                   Output filename ( filename '-' means output to stdout ) [default: tags]
    -t, --thread <thread>                 Number of threads [default: 8]

ARGS:
    <DIR>    Search directory [default: .]

You can pass options to ctags by-c/--ctags_opt option like below.

ptags -c --links=no -c --languages=Rust

Searched file types per options are below. --include-submodule and --include_untracked are exclusive. This is the restriction of git ls-files. Any include/exclude options without the above combination can be used simultaneously.

File typeDefault--exclude-lfs--include-ignored--include-submodule--include-untracked
trackedooooo
untrackedxxxxo
ignoredxxoxx
lfs trackedoxooo
in submodulesxxxox

You can override any default option by ~/.ptags.toml like below. The complete example of ~/.ptags.toml can be generated by --config option.

thread = 16
bin_ctags = "ctags2"
bin_git = "git2"

Benchmark

Environment

Data

NameRepositoryRevisionFilesSize[GB]
source0https://github.com/neovim/neovimf5b0f5e1723700.1
source1https://github.com/llvm-mirror/llvmddf9edb4020296701.2
source2https://github.com/torvalds/linux071e31e254e0529982.2
source3https://github.com/chromium/chromiumd79c68510b7e29320513

Result

ptags is up to x5 faster than universal-ctags.

CommandVersionsource0source1source2source3
ctags -RUniversal Ctags 0.0.0(f9e6e3c1)0.41s ( x1 )3.42s ( x1 )23.64s ( x1 )32.23 ( x1 )
ptags -t 16ptags 0.1.40.13s ( x3.15 )0.58s ( x5.90 )4.24s ( x5.58 )7.27s ( x4.43 )