
tag is a lightweight wrapper around ag and ripgrep that generates shell aliases for your search matches. tag is a very fast Golang reimagining of sack.
tag supports ag and ripgrep (rg). There are no plans to support ack or grep. If you'd like to add support for more search backends, I encourage you to contribute!
tag makes it easy to immediately jump to a search match in your favorite editor. It eliminates the tedious task of typing vim foo/bar/baz.qux +42 to jump to a match by automatically generating these commands for you as shell aliases.
Inside vim, vim-grepper or ag.vim is probably the way to go. Outside vim (or inside a Neovim :terminal), tag is your best friend.
Finally, tag is unobtrusive. It should behave exactly like ag or ripgrep under most circumstances.
tag processes ag's output on-the-fly with Golang using pipes so the performance loss is neglible. In other words, tag is just as fast as ag!
$ cd ~/github/torvalds/linux
$ time ( for _ in {1..10}; do ag EXPORT_SYMBOL_GPL >/dev/null 2>&1; done )
16.66s user 16.54s system 347% cpu 9.562 total
$ time ( for _ in {1..10}; do tag EXPORT_SYMBOL_GPL >/dev/null 2>&1; done )
16.84s user 16.90s system 356% cpu 9.454 total
Update to the latest versions of ag or ripgrep. ag in particular must be version >= 0.25.0.
Install the tag binary using one of the following methods.
Homebrew (OSX)
$ brew tap aykamko/tag-ag
$ brew install tag-ag
AUR (Arch Linux)
Using your favorite AUR helper, install the tag-ag AUR package like this:
$ aura -A tag-ag
Developers and other platforms
$ go get -u github.com/aykamko/tag/...
$ go install github.com/aykamko/tag
By default, tag uses ag as its search backend. To use ripgrep instead, set the environment variable TAG_SEARCH_PROG=rg. (To persist this setting, put it in your bashrc/zshrc.)
Since tag generates a file with command aliases for your shell, you'll have to drop the following in your bashrc/zshrc to actually pick up those aliases.
bash
bash
if hash ag 2>/dev/null; then
export TAG_SEARCH_PROG=ag # replace with rg for ripgrep
tag() { command tag "$@"; source ${TAG_ALIAS_FILE:-/tmp/tag_aliases} 2>/dev/null; }
alias ag=tag # replace with rg for ripgrep
fi
zsh
zsh
if (( $+commands[tag] )); then
export TAG_SEARCH_PROG=ag # replace with rg for ripgrep
tag() { command tag "$@"; source ${TAG_ALIAS_FILE:-/tmp/tag_aliases} 2>/dev/null }
alias ag=tag # replace with rg for ripgrep
fi
fish - ~/.config/fish/functions/tag.fish
fish
function tag
set -x TAG_SEARCH_PROG ag # replace with rg for ripgrep
set -q TAG_ALIAS_FILE; or set -l TAG_ALIAS_FILE /tmp/tag_aliases
command tag $argv; and source $TAG_ALIAS_FILE ^/dev/null
alias ag tag # replace with rg for ripgrep
end
tag exposes the following configuration options via environment variables:
TAG_SEARCH_PROGag or ripgrep as the search backend. Must be one of ag or rg.agTAG_ALIAS_FILE/tmp/tag_aliasesTAG_ALIAS_PREFIXe in generated alias e42.eTAG_CMD_FMT_STRING{{.Filename}}, {{.LineNumber}}, and {{.ColumnNumber}} for proper substitution.vim -c 'call cursor({{.LineNumber}}, {{.ColumnNumber}})' '{{.Filename}}'