navi/README.md

247 lines
8.8 KiB
Markdown
Raw Normal View History

2020-03-10 16:21:00 +00:00
# navi <img src="https://user-images.githubusercontent.com/3226564/65362934-b4432500-dbdf-11e9-8f75-815fbc5cbf8f.png" alt="icon" height="28px"/> [![Actions Status](https://github.com/denisidoro/navi/workflows/Tests/badge.svg)](https://github.com/denisidoro/navi/actions) ![GitHub release](https://img.shields.io/github/v/release/denisidoro/navi?include_prereleases)
2020-03-04 21:01:23 +00:00
2020-03-10 16:13:32 +00:00
> :information_source: If you're here because you upgraded **navi** and are having some issues, please check [this thread](https://github.com/denisidoro/navi/issues/201).
2020-02-25 14:04:28 +00:00
2020-03-10 16:13:32 +00:00
An interactive cheatsheet tool for the command-line.
2019-09-20 17:45:02 +00:00
2020-03-11 16:01:17 +00:00
![Demo](https://user-images.githubusercontent.com/3226564/76437136-ddc35900-6397-11ea-823c-d2da7615fe60.gif)
2019-09-20 17:01:12 +00:00
2020-03-12 23:40:20 +00:00
**navi** allows you to browse through cheatsheets (that you may write yourself or download from maintainers) and execute commands, with argument values prompted to you. It uses [fzf](https://github.com/junegunn/fzf) under the hood.
2019-09-20 17:01:12 +00:00
2020-03-12 16:21:49 +00:00
It can be either used as a command or as a shell widget (*à la* Ctrl-R).
2020-03-11 16:04:25 +00:00
2019-10-02 15:13:42 +00:00
Table of contents
-----------------
* [Installation](#installation)
* [Using Homebrew or Linuxbrew](#using-homebrew-or-linuxbrew)
2020-03-10 16:13:32 +00:00
* [Using one-liner script](#using-one-liner-script)
2020-03-04 23:08:58 +00:00
* [Downloading pre-compiled binaries](#downloading-pre-compiled-binaries)
* [Building from source](#building-from-source)
* [Usage](#usage)
* [Preventing execution](#preventing-execution)
* [Pre-filtering](#pre-filtering)
2019-09-27 17:31:56 +00:00
* [Shell widget](#shell-widget)
* [More options](#more-options)
* [Trying out online](#trying-out-online)
* [Cheatsheets](#cheatsheets)
* [Using your own custom cheatsheets](#using-your-own-custom-cheatsheets)
* [Submitting cheatsheets](#submitting-cheatsheets)
* [Cheatsheet syntax](#cheatsheet-syntax)
* [Syntax overview](#syntax-overview)
* [Variables](#variables)
* [Variable dependency](#variable-dependency)
* [Variable options](#variable-options)
* [Table formatting](#table-formatting)
* [Multiple choice](#multiple-choice)
2019-09-26 13:50:25 +00:00
* [List customization](#list-customization)
2020-03-11 16:01:17 +00:00
* [Motivation](#motivation)
* [Related projects](#related-projects)
* [Etymology](#etymology)
Installation
------------
2020-03-10 16:13:32 +00:00
### Using [Homebrew](http://brew.sh/) or [Linuxbrew](http://linuxbrew.sh/)
2020-03-11 14:32:46 +00:00
```sh
brew install denisidoro/tools/navi
```
Alternatively, you can use the official formula (but it will install a very old version of **navi**):
2019-09-22 16:54:14 +00:00
```sh
2019-12-01 00:32:02 +00:00
brew install navi
2019-09-22 16:54:14 +00:00
```
2020-03-10 16:13:32 +00:00
### Using one-liner script
2020-03-04 23:08:58 +00:00
```bash
2020-03-10 16:13:32 +00:00
bash <(curl -sL https://raw.githubusercontent.com/denisidoro/navi/master/scripts/install)
```
2020-03-10 16:13:32 +00:00
### Downloading pre-compiled binaries
You can download binaries [here](https://github.com/denisidoro/navi/releases/latest).
2020-03-04 23:08:58 +00:00
### Building from source
2019-10-23 16:59:15 +00:00
2020-03-04 23:08:58 +00:00
```bash
git clone https://github.com/denisidoro/navi ~/.navi
cd ~/.navi
make install # or make SOURCE_DIR=/opt/navi BIN_DIR=/usr/local/bin install
2019-10-23 16:59:15 +00:00
```
Usage
-----
By simply running `navi` you will be prompted with the default cheatsheets.
### Preventing execution
2019-09-26 13:50:25 +00:00
If you run `navi --print`, the selected snippet won't be executed. It will be printed to stdout instead.
### Pre-filtering
If you run `navi query <cmd>`, the results will be pre-filtered.
2019-09-27 17:31:56 +00:00
### Shell widget
2019-10-02 17:47:46 +00:00
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.
2019-09-27 17:31:56 +00:00
In order to use it, add this line to your `.bashrc`-like file:
2019-09-27 17:31:56 +00:00
```sh
# bash
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
source <(navi widget bash)
# zsh
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
source <(navi widget zsh)
2019-10-14 16:44:52 +00:00
# fish
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
navi widget fish | source
2019-09-27 17:31:56 +00:00
```
By default, `Ctrl+G` is assigned to launching **navi**. If you want to change the keybinding, replace the argument of `bind` or `bindkey` in [the widget file](https://github.com/denisidoro/navi/search?q=filename%3Anavi.plugin.*&unscoped_q=filename%3Anavi.plugin.*).
### More options
Please refer to `navi --help` for more details.
2019-09-20 18:28:15 +00:00
Trying out online
--------------------
2019-09-20 18:28:15 +00:00
If you don't have access to bash at the moment and you want to live preview **navi**, head to [this playground](https://www.katacoda.com/denisidoro/scenarios/navi). It'll start a docker container with instructions for you to install and use the tool. Note: login required.
2019-09-20 18:28:15 +00:00
Cheatsheets
-----------
2019-09-20 19:00:46 +00:00
### Using your own custom cheatsheets
2019-09-23 14:33:43 +00:00
In this case, you need to pass a `:`-separated list of separated directories which contain `.cheat` files:
2019-09-20 19:00:46 +00:00
```sh
navi --path "/folder/with/cheats"
2019-09-20 21:44:51 +00:00
```
Alternatively, you can set an environment variable in your `.bashrc`-like file:
```sh
export NAVI_PATH="/folder/with/cheats:/another/folder"
2019-09-20 19:00:46 +00:00
```
### Submitting cheatsheets
2019-09-20 22:16:47 +00:00
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
Feel free to open a PR on https://github.com/denisidoro/cheats for me to include your contributions.
2019-09-20 22:16:47 +00:00
Cheatsheet syntax
-----------------
2019-09-23 14:33:43 +00:00
Cheatsheets are described in `.cheat` files.
### Syntax overview
2019-09-20 17:01:12 +00:00
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
- lines starting with `%` determine the start of a new cheatsheet and should contain tags;
2019-09-20 17:01:12 +00:00
- lines starting with `#` should be descriptions of commands;
2020-03-10 16:13:32 +00:00
- lines starting with `;` are ignored. You can use them for metacomments;
2019-09-23 14:33:43 +00:00
- lines starting with `$` should contain commands that generate a list of possible values for a given argument;
2019-09-20 17:01:12 +00:00
- all the other non-empty lines are considered as executable commands.
For example, this is a valid `.cheat` file:
```sh
% git, code
# Change branch
git checkout <branch>
2019-09-21 23:16:20 +00:00
$ branch: git branch | awk '{print $NF}'
2019-09-20 17:01:12 +00:00
```
2020-03-10 16:13:32 +00:00
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 `%`.
Commands may be multiline:
```sh
Initial cheat repo support (#258) This PR makes navi stop bundling `.cheat` files and makes it able to download from repos on GitHub, using a standardized config directory. - it fixes #233 and #237 - it makes #52, #256 and #257 much easier to implement - it makes #40 harder to implement - it's an alternate solution to #140 - it's influenced by #238 and #254. This PR ended up being much bigger than I would like so if you could review only this description it would be already very nice! When navi is started for the first time, a welcome cheatsheet is shown: ![Screenshot at 2020-03-15 10-20-04](https://user-images.githubusercontent.com/3226564/76702240-19fffd80-66a7-11ea-884f-97c565bc1ead.png) If the user selects the first option, the user is prompted to download `.cheat`s from https://github.com/denisidoro/cheats: ![Screenshot at 2020-03-15 10-20-35](https://user-images.githubusercontent.com/3226564/76702239-19fffd80-66a7-11ea-8f69-324f669b1e01.png) ![Screenshot at 2020-03-15 10-22-59](https://user-images.githubusercontent.com/3226564/76702236-18363a00-66a7-11ea-8ff4-53b497f85888.png) The config folder is populated: ![Screenshot at 2020-03-15 10-21-11](https://user-images.githubusercontent.com/3226564/76702238-19676700-66a7-11ea-8367-3e7b5733f2b4.png) When run again, cheats are available: ![Screenshot at 2020-03-15 10-21-34](https://user-images.githubusercontent.com/3226564/76702237-19676700-66a7-11ea-9c2a-d8829340f3e9.png) ### Breaking changes In order to make navi stop bundling shell widgets as well, a breaking change has been introduced: `source $(navi widget bash)` won't work anymore. It should be `source <(navi widget bash)` now. Any ideas on how to make this transition more graceful?
2020-03-15 16:46:58 +00:00
# This will output "foo\nyes"
echo foo
2020-03-14 21:14:30 +00:00
true \
&& echo yes \
|| echo no
```
### Variables
The interface prompts for variable names inside brackets (eg `<branch>`).
2019-09-25 11:28:29 +00:00
Variable names should only include alphanumeric characters and `_`.
### Variable dependency
The command for generating possible inputs can refer other variables:
```sh
# If you select 2 for x, the possible values of y will be 12 and 22
echo <x> <y>
$ x: echo -e '1\n2\n3'
$ y: echo -e "$((x+10))\n$((x+20))"
```
### Variable options
2020-03-14 12:20:25 +00:00
For lines starting with `$` you can add use`---` to parse parameters to `fzf`.
2020-03-14 15:46:33 +00:00
* `--allow-extra` *(experimental)*: handles `fzf` option `--print-query`. `enter` will prefer a selection,
`tab` will prefer the query typed.
2020-03-14 12:20:25 +00:00
* `--multi` : forwarded option to `fzf`.
2020-03-14 15:46:33 +00:00
* `--header-lines` : forwarded option to `fzf`
2020-03-14 12:20:25 +00:00
* `--column` : forwarded option to `fzf`.
* `--delimiter` : forwarded option to `fzf`.
#### Table formatting
2020-03-11 16:01:17 +00:00
You can pick a specific column of a selection and set the number of lines considered as headers via `--column`, `--delimiter` and `--header-lines`:
```sh
# This will pick the 3rd column and use the first line as header
docker rmi <image_id>
2020-03-11 16:01:17 +00:00
$ image_id: docker images --- --column 3 --header-lines 1 --delimiter '\s\s+'
```
#### Multiple choice
You can select multiple values via `--multi` and hitting `<TAB>`:
```sh
# The resulting command will be something like: cat "a.txt" "b.txt"
cat <files>
2020-03-10 16:13:32 +00:00
$ files: ls --- --multi
```
2019-09-26 13:50:25 +00:00
List customization
------------------
2020-03-10 16:13:32 +00:00
Lists can be stylized with the [$FZF_DEFAULT_OPTS](https://github.com/junegunn/fzf) environment variable or `--fzf-overrides`. This way, you can change the [color scheme](https://github.com/junegunn/fzf/wiki/Color-schemes), for example.
2020-03-11 16:01:17 +00:00
Motivation
----------
The main objectives are:
- to increase discoverability, by finding snippets given keywords or descriptions;
- to prevent you from running auxiliar commands, copying the result into the clipboard and then pasting into the original command;
- to easily share one-liners with others so that they don't need to figure out how to write the commands;
- to improve terminal usage as a whole.
Sure, you can find autocompleters out there for all your favorite commands. However, they are very specific and each one may offer a different learning curve.
Or you can launch a browser and search for instructions on Google, but that takes some time.
**navi**, on the other hand, intends to be a general purpose platform for bookmarking any snippet at a very low cost.
Related projects
----------------
2019-09-23 14:33:43 +00:00
There are many similar projects out there ([bro](https://github.com/hubsmoke/bro), [eg](https://github.com/srsudar/eg), [cheat.sh](https://github.com/chubin/cheat.sh), [tldr](https://github.com/tldr-pages/tldr), [cmdmenu](https://github.com/amacfie/cmdmenu), [cheat](https://github.com/cheat/cheat), [beavr](https://github.com/denisidoro/beavr), [how2](https://github.com/santinic/how2) and [howdoi](https://github.com/gleitz/howdoi), to name a few).
2019-09-20 17:01:12 +00:00
2019-09-26 13:50:25 +00:00
Most of them provide excellent cheatsheet repositories, but lack a nice UI and argument suggestions.
2019-09-20 17:01:12 +00:00
Etymology
---------
2019-09-20 17:01:12 +00:00
In [The Legend of Zelda Ocarina of Time](https://zelda.gamepedia.com/Ocarina_of_Time), [navi](https://zelda.gamepedia.com/Navi) is a character that provides [Link](https://zelda.gamepedia.com/Link) with a variety of clues to help him solve puzzles and progress in his quest.