Skip to content
0mpPublic

About

POSIX-compliant shell movement boosting hack for real ninjas (aka `cd x` and `cd ...`)

Topics

Resources

Contributing

Stars

43 stars

Watchers

3 watching

Forks

Latest commit

 

History

198 Commits

Folders and files

Repository files navigation

goat

Overview

I used to retrieve carefully-constructed cd commands from my history. But then, I got a goat.

~ Jonathan Paugh on Google+

[ ~/Pictures ] $ goat dev ~/Documents/devel # create a link to the dev directory
[ ~/Pictures ] $ ls # see that there is no ~/Pictures/dev directory here
seahorses wallpapers
[ ~/Pictures ] $ cd dev # the goat framework's got you covered!
[ ~/Documents/devel ] $

Oh my! This is a POSIX-compliant shell movement boosting hack for real ninjas.
#posix_me_harder #posixly_correct

~ 0mp

Sometimes you jump around your filesystem tree a lot and you end up putting a couple of ugly aliases into your shell's rc file.

I should try it, even if it is dumb!

~ dse on What the Daily WTF? about goat v1.1.1

With goat you can easily manage your ninja shortcuts - just type goat p ~/Projects to introduce a new link and then cd p to jump to its destination.

Rad! I can do cd .... now instead of performing a horse galloping-like waltz with ../ being my miserable dance floor. I'm cloning this goat straight away!

~ YA0mp

BTW, Bash completion is now fully working with goat's shortcuts.

Building

$ make all

Installation

$ make install

Aferwards, add libgoat sourcing to your shell's initialization file (e.g., ~/.bashrc):

$ echo '. "$(goat libexec)"' >> ~/.bashrc

Goat is going to be available the next time you start your shell.

Installation troubleshooting

Make sure that ~/.local/bin is in your PATH, e.g.:

$ cat <<'EOF' >> ~/.bashrc
case "$PATH" in
    *$HOME/.local/bin*) ;;
    *) PATH="$HOME/.local/bin:$PATH" ;;
esac
EOF

In a non-XDG environment or if bash-completion version is 2.8 or lower, make sure that files inside ~/.local/share/bash_completion/completions are actually sourced by the Bash completion library, e.g.,

$ cat <<'EOF' >> ~/.bash_completion
if [[ -d ~/.local/share/bash_completion/completions ]]
then
    for f in ~/.local/share/bash_completion/completions/*
    do
        [[ -f $f ]] && source "$f"
    done
fi
EOF

Usage overview

Create a shortcut named “f” to ~/Documents/dev/freebsd (no need to use
the link command explicitly here):

      $ goat f ~/Documents/dev/freebsd

Follow a link to change a directory with cd(1):

      $ cd f

Take the “f” shortcut and enter its destination subdirectory with just
one command:

      $ pwd
      /home/0mp
      $ cd f/ports
      $ pwd
      /usr/home/0mp/freebsd/ports

Create a shortcut named “p” to the current directory:

      $ goat p .

Go up the filesystem tree with ... (same as the standard “cd ../../”):

      $ cd ...

List all your links:

      $ goat list
      dots    ->      /usr/home/0mp/.dotfiles
      down    ->      /usr/home/0mp/Downloads
      f       ->      /usr/home/0mp/freebsd
      p       ->      /usr/home/0mp/freebsd/ports
      pa      ->      /usr/home/0mp/freebsd/patches
      src     ->      /usr/home/0mp/freebsd/svn/src
      svn     ->      /usr/home/0mp/freebsd/svn

Delete a link (or more):

      $ goat delete f p

Delete all the links which point to directories with the given prefix:

      $ goat deleteprefix "$HOME/Documents"

License

Licensed under 2-Clause BSD license. Copyright © 2016-2026 Mateusz Piotrowski

About

POSIX-compliant shell movement boosting hack for real ninjas (aka `cd x` and `cd ...`)

Topics

Resources

Contributing

Stars

43 stars

Watchers

3 watching

Forks

Contributors

Languages