Print pokemon in the CLI! An adaptation of the classic "cowsay"
Other docs
(These commands can also be used to update your existing pokesay)
- OSX / darwin
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" bash darwin amd64
- OSX / darwin (M1)
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" bash darwin arm64
- Linux x64
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" bash linux amd64
- Android ARM64 (Termux)
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" bash android arm64
- Windows x64 (.exe)
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" bash windows amd64
Just pipe some text! e.g.
echo yolo | pokesay
To see it every time you open a terminal, add it to your .bashrc
file!
(This requires that you have fortune
installed)
echo 'fortune | pokesay' >> $HOME/.bashrc
Note: The pokesay tool is intended to only be used with piped text input from STDIN, entering text by typing (or other methods) might not work as expected!
Run pokesay with
-h
or--help
to see the full usage
Usage: pokesay [-bCfhjLlsuvW] [-c value] [-n value] [-t value] [-w value] [parameters ...]
-b, --info-border draw a border around the info box
-c, --category=value
choose a pokemon from a specific category
-C, --no-category-info
do not print pokemon category information in the info box
-f, --fastest run with the fastest possible configuration (--nowrap &
--notabspaces)
-h, --help display this help message
-j, --japanese-name
print the japanese name in the info box
-L, --list-categories
list all available categories
-l, --list-names list all available names
-n, --name=value choose a pokemon from a specific name
-s, --no-tab-spaces
do not replace tab characters (fastest)
-t, --tab-width=value
replace any tab characters with N spaces [4]
-u, --unicode-borders
use unicode characters to draw the border around the speech
box (and info box if --info-border is enabled)
-v, --verbose print verbose output
-W, --no-wrap disable text wrapping (fastest)
-w, --width=value the max speech bubble width [80]
- List all available categories
pokesay -L
- List all available names
pokesay -l
- Print a message with a random pokemon
echo 'Hello, world!' | pokesay
- Print a message with a specific pokemon
echo 'Hello, world!' | pokesay -n pikachu
- Print a message with a specific pokemon category
# big pokemon (i.e. with a large dimensions in the terminal) echo 'Hello, world!' | pokesay -c big # shiny pokemon echo 'Hello, world!' | pokesay -c shiny
- Print a message with a specific pokemon category and name
# for shiny charizards echo 'Hello, world!' | pokesay -c shiny -n charizard
This project extends on the original fortune | cowsay
, a simple command combo that can be added to
your .bashrc to give you a random message spoken by a cow every time you open a new shell.
☯ ~ fortune | cowsay
______________________________________
/ Hollywood is where if you don't have \
| happiness you send out for it. |
| |
\ -- Rex Reed /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
As a personal project, this has been lovingly over-engineered with a focus on the lowest latency possible, so that it doesn't slow down your terminal experience.
-
These pokemon sprites used here are sourced from the awesome repo msikma/pokesprite
-
All of these sprites are converted into a form that can be rendered in a terminal (unicode characters and colour control sequences) by the
img2xterm
tool, found at rossy/img2xterm -
Use some go tools (
encoding/gob
andgo:embed
) to generate a go source code file that encodes all of the converted unicode sprites as gzipped text and some search-optimised data structures. -
Finally, this is built with the main CLI logic in
pokesay.go
into an single executable that can be easily popped into a directory in the user's$PATH
If all you are after is installing the program to use, then there are no dependencies required! Navigate to the Releases and download the latest binary.
- Short-term
- optionally print ID assigned to each pokemon, support deterministic selection via the same ID
- Longer-term
- In Beta
- support long and short cli args (e.g. --name/-n)
- Completed
- Make the category struct faster to load - currently takes up to 80% of the execution time
- Store metadata and names in a more storage-efficient manner
- Import japanese names from data/pokemon.json
- Fix bad whitespace stripping when building assets
- List all names
- Make data structure to hold categories, names and pokemon
- Increase speed
- Improve categories to be more specific than shiny/regular
- Filter by both name and category
There are many other projects that bring pokemon to the terminal! Check them out via the links.
Inspired by the pokeshell project, I've included a comparison table
project | dependencies | speed | japanese names | size categories | selection by name | selection by category | animated sprites |
---|---|---|---|---|---|---|---|
pokeshell | imagemagick, chafa | ? | ? | ? | ? | ? | ? |
pokemon-icat | python | ? | ? | ? | ? | ? | ? |
pokemon-colorscripts | python3 | ? | ? | ? | ? | ? | ? |
pokemonsay-newgenerations | cowsay (perl) | ? | ? | ? | ? | ? | ? |
pokeTerm | python3 | ? | ? | ? | ? | ? | ? |
krabby | rust, cargo | ? | ❌ | ❌ | ✓ | ❌ | ❌ |
pokemonsay | npm | ? | ? | ? | ? | ? | ? |