An interactive cheatsheet tool for the command-line and application launchers.
navi allows you to browse through cheatsheets (that you may write yourself or download from maintainers) and execute commands. Argument suggestions are prompted to you.
It uses fzf, skim, or Alfred under the hood and it can be either used as a command or as a shell widget (à la Ctrl-R).
sh
brew install navi
sh
nix-env -iA nixpkgs.navi
bash
cargo install navi
```bash bash <(curl -sL https://raw.githubusercontent.com/denisidoro/navi/master/scripts/install)
```
You can download binaries here.
```bash git clone https://github.com/denisidoro/navi ~/.navi cd ~/.navi make install
```
You can find navi for more package managers by clicking on the image below:
Feel free to be the maintainer of navi for any package manager you'd like!
By running navi
for the first time, you'll be suggested to download some cheatsheets. By running navi
again, these cheatsheets will appear.
You can use navi as a widget to your shell. This way, your history is correctly populated and you can edit the command as you wish before executing it. To set it up, add this line to your .bashrc
-like file:
```sh
source <(echo "$(navi widget bash)")
source <(echo "$(navi widget zsh)")
navi widget fish | source ```
By default, Ctrl+G
is assigned to launching navi.
This is experimental. If you face any issues, please report the issue here.
navi
binary is in the $PATH
determined by ~/.bashrc
;.alfredworkflow
for the latest release.Please refer to navi --help
for more details.
If you don't have access to a Unix shell at the moment and you want to live preview navi, head to this playground. It'll start a docker container with instructions for you to install and use the tool. Note: login required.
You can find cheatsheet repositories with:
sh
navi repo browse
In addition, you can import cheatsheets from any git repository:
sh
navi repo add https://github.com/denisidoro/cheats
You can either start a git repo with cheatsheets and import it as described above or you can add them directly to data_dir/navi
.
The main repository for cheatsheets is denisidoro/cheats. Feel free to open a PR there for me to include your contributions.
In order to add your own repository as a featured cheatsheet repo, please edit this file. This list will be displayed when navi repo browse
is run.
Cheatsheets are described in .cheat
files that look like this:
```sh % git, code
git checkout
$ branch: git branch | awk '{print $NF}' ```
%
determine the start of a new cheatsheet and should contain tags, useful for searching;#
should be descriptions of commands;;
are ignored. You can use them for metacomments;$
should contain commands that generate a list of possible values for a given argument;@
should contain tags whose associated cheatsheet you want to base on;It's irrelevant how many files are used to store cheatsheets. They can be all in a single file if you wish, as long as you split them accordingly with lines starting with %
.
The interface prompts for variable names inside brackets (eg <branch>
).
Variable names should only include alphanumeric characters and _
.
If there's a corresponding line starting with $
for a variable, suggestions will be displayed. Otherwise, the user will be able to type any value for it.
If you hit <tab>
the query typed will be prefered. If you hit <enter>
the selection will be prefered.
For lines starting with $
you can use ---
to customize the behavior of fzf
or how the value is going to be used:
```sh
docker rmi
echo
$ image_id: docker images --- --column 3 --header-lines 1 --delimiter '\s\s+' $ mapped: echo 'false true' | tr ' ' '\n' --- --map "[[ $0 == t* ]] && echo 1 || echo 0" ```
The supported parameters are:
- --prevent-extra
(experimental): limits the user to select one of the suggestions;
- --column <number>
: extracts a single column from the selected result;
- --map <bash_code>
(experimental): applies a map function to the selected variable value;
In addition, it's possible to forward the following parameters to fzf
:
- --multi
;
- --header-lines <number>
;
- --delimiter <regex>
;
- --query <text>
;
- --filter <text>
;
- --header <text>
;
- --preview <bash_code>
;
- --preview-window <text>
.
The command for generating possible inputs can implicitly refer other variables by using the <varname>
syntax:
```sh
echo "
$ picturesfolder: echo "/my/pictures"
$ wallpaperfolder: echo "
If you want to make dependencies explicit, you can use the $varname
syntax:
```sh
echo
:
$ x: echo "hello hi" | tr ' ' '\n' $ y: echo "$x foo;$x bar" | tr ';' '\n' ```
With the @ same tags from other cheatsheet
syntax you can reuse the same variable in multiple cheatsheets.
```sh % dirs, common
$ pictures_folder: echo "/my/pictures"
% wallpapers @ dirs, common
echo "
% screenshots @ dirs, common
echo "
Commands may be multiline: ```sh
echo foo true \ && echo yes \ || echo no ```
```sh
jsons=($(echo "
$ jsons: find . -iname '*.json' -type f -print --- --multi ```
Lists can be stylized with the $FZFDEFAULTOPTS environment variable or similar variables/parameters (please refer to navi --help
). This way, you can change the color scheme, for example.
There are many similar projects out there (bro, eg, cheat.sh, tldr, cmdmenu, cheat, beavr, how2 and howdoi, to name a few).
Most of them provide excellent cheatsheet repositories, but lack a nice UI and argument suggestions.
In The Legend of Zelda Ocarina of Time, navi is a character that provides Link with a variety of clues to help him solve puzzles and progress in his quest.