
An interactive cheatsheet tool for the command-line - dnsfr
https://github.com/denisidoro/navi
======
kissgyorgy
Once I tried a tool like this, but just realized, there is already a method of
that: the ~/bin folder.

You can write bash scripts, or scripts in any programming language with the
proper shebang line, you can download other people's scripts, and you don't
need bash history to keep them. Listing all of them is just an ls. I tend to
not put file extensions of them and use good naming, so you can see everything
without looking into them.

~~~
crispyambulance

        > ... there is already a method of that: the ~/bin folder.
    

More power to you if you can do that, but for me it's a memory problem and a
problem of being able to figure out WTF options I need when I am in the middle
of something.

man pages (and --help) are great if you have the time to sit down, ponder and
experiment. But when you're trying to get stuff overwith, a massive wall of
historically interesting text just isn't helpful.

The vast majority of invocations of any given command, I suspect, are limited
to a not more than a handful of use-cases. In other words just enough
combinations of arguments and options to perform a small number of different
tasks. _This_ is what people are typically interested in when they're on the
command line. In that context getting massive dump of every possible option in
a man page is frustrating and counter-productive.

For example, "tar". I use this command in 2 simple ways: archive a directory
into a gzipped tar or extract a gzipped tar. This is what effectively everyone
uses it for >99% of the time: toggle between a directory and a tar.gz file.

Basically... just 2 forms "tar -zxvf" and "tar ..." oh shit, I forgot how to
tar/compress a directory, let's check the man page... ok "tar -cf" to create a
tar, but wait I want it gzipped, and actually I forgot what the z, v and f
stand for, now I need look each of those up, wait, do I really mean gzip? or
bzip, oops more research.

To be fair, tar might be too easy an example but you can easily go down a
manpage-rabbit-hole because of a lack of common usage examples.

~~~
rmetzler
I think it’s just a habit to turn these two or four versions of using tar into
the same amount of one liner shell scripts. Or maybe a longer one with options
and usage printing.

------
imposterr
Wow, this is really cool. I assumed this was going to be written in go or
rust, but taking a look it's actually all bash! I'm always surprised by how
much people can get out of bash.

It's also some of the cleanest bash I've seen. Definitely going to be using
some of these patterns for my own scripts.

~~~
dnsfr
Thanks! Actually it's written in bash because it started as a 25-line script.
If it gets bigger, I'll consider rust.

------
OJFord
This looks cool, a common workflow of mine is `cmd --blah --blah ` ah damn I
don't know the value for blah, okay, fzf ` --blah=(blahgen | fzf) ` oh I'm
also missing [...]

This seems like it can help do the same thing more quickly, so I'm keen to
give it a go.

I do like shell history though, a shame to just have a bunch of `navi` entries
- I wonder if it could be faked; populated with the chosen command afterwards?

~~~
dnsfr
I could write a zsh/bash plug-in so that it fills the prompt instead of
running the command, in the same manner as ctrl-r. What do you think?

~~~
rroblak
That would make the difference between me using this tool and not using this
tool. Losing my shell history isn't worth a momentary ergonomics gain.

------
dnsfr
navi allows you to browse through cheatsheets (that you may write yourself or
download from maintainers) and execute commands, prompting for argument
values.

~~~
blondin
not only this looks super awesome but this is also the first time i have seen
a shell program architected in such a nice way.

------
obituary_latte
Looks neat. I wish, though, there was a way to try it out in the browser as
advertised _without_ having to sign up or login. Might be a requirement of the
site hosting the demo but whoever it is, forcing login is always and forever a
deal breaker for me.

~~~
dnsfr
I didn't know it requires a login. Do you know any online free platform that
can launch a given docker image?

~~~
obituary_latte
Sorry but I do not.

------
faizshah
This is really cool, I remember a similar effort being posted here a few years
ago:
[https://news.ycombinator.com/item?id=7121268](https://news.ycombinator.com/item?id=7121268)

I really like this implementation!

------
anchpop
Is there any way to run this on Windows, for people who use Cygwin or Git
Bash? It seems really cool and useful

~~~
dnsfr
I think it should work out of the box. Did you get any error?

------
superasn
Looks like a really useful tool. Another tool I use like this is bropages or
the `bro` command(1) which gives many examples similar to this for any command
like ls, docker, etc. Sometimes it's useful when you don't have time to read
the entire man page.

(1) [https://www.ostechnix.com/3-good-alternatives-man-pages-
ever...](https://www.ostechnix.com/3-good-alternatives-man-pages-every-linux-
user-know/)

------
DavideNL
Looks really nice;

I don't like the fact that an unknown command is executed _before_ i can
see/inspect what it is. Currently you won't even see what command was executed
afterwards, you only see the result...

Would be nice to be able to also show the command below the item/result.

\--print is possible, but it's cumbersome and not interactive: you can't
"accept" the command after inspecting, and execute it.

~~~
dnsfr
Based on your input, the latest version has a preview window: [https://user-
images.githubusercontent.com/3226564/65380182-6...](https://user-
images.githubusercontent.com/3226564/65380182-69431380-dcac-11e9-9af8-0f7b3c869d0f.gif)

I hope you like it!

~~~
DavideNL
That was fast, great!

------
acoustep
This looks really cool. I’ve been building something similar in Crystal to
scratch my own itch -
[https://video.twimg.com/tweet_video/EEQqvAeWkAAx3-3.mp4](https://video.twimg.com/tweet_video/EEQqvAeWkAAx3-3.mp4)

------
oyebenny
I want to use this, but I'm afraid of it be deprecated or not being maintained
over time.

------
davidjhall
Is there a key command or way to find out what's below the cheat? For
instance, I tried the "local ip address" example in the demo and it gave the
IP address but now 'how' \-- ifconfig? was it in a text file? env var? script?

~~~
mikelward
Appears to be implemented here.

[https://github.com/denisidoro/navi/blob/master/cheats/networ...](https://github.com/denisidoro/navi/blob/master/cheats/network.cheat)

I'd nitpick on the implementation, but the point is you can change it. :)

~~~
mikelward
On Linux, you can do something more robust that also supports IPv6 based on

    
    
        ip -o a sh up primary scope global

------
callmeschroeder
Same idea as
[https://news.ycombinator.com/item?id=19436884](https://news.ycombinator.com/item?id=19436884)
but more polished and faster.

~~~
dnsfr
I'll add it to the "alternatives" section

------
pcr910303
This is pretty cool! It’s great to see that lots of tools are trying to make
the command line less intimidating, and adopting more friendly methods than
the man pages.

About the cheatsheets itself, it might be great to share the cheatsheets with
a project sharing somewhat similar goals, tldr.sh[0] (which focuses less on
interactivity but more on completeness and practicality).

I’m more than excited to see the shell being more approachable. I have
introduced the shell to quite a lot of my non-programmer friends with package
managers and bulk renaming, but they don’t use the shell enough to memorize
all of the commands. These efforts lower the barrier to use the shell... hence
making the demonstration of the command line’s powers more easy.

[0] [https://tldr.sh](https://tldr.sh)

------
otroquecorre
Simply brilliant. Making bash easier

------
apotheosis
Would be neat if `navi git` started it up and applied a filter at the same
time.

~~~
dnsfr
Cool! Will do it!

My only concern is that this way it would be impossible to add subcommands to
navi

Let's say that in the future I want to add a command for removing a cheat
(navi remove)

The way you described, it would look for snippets which contain "remove"

Any ideas?

------
ozzmotik
oh this is really cool, thanks for sharing. i also really appreciate that you
have links to other projects that offer similar features so people can
contrast and compare and find what works best for them.

------
rushi_agrawal
Similar concept: cheat.sh

~~~
dnsfr
I'll add it to the "alternatives" section

------
kenshinji
Does it also work in zsh?

~~~
OJFord
Not sure what you mean, the shebang line is bash, so you need bash installed,
but invoking it from zsh shouldn't cause a problem any more than invoking
anything else could.

If you meant 'why is the shebang line bash, isn't it POSIX compliant' \- I
don't know.

Looks nice though. Not sure I fully understand how the chaining/'prompts you
for arguments' works (from UX perspective) but keen to give it a go.

------
matthewtovbin
Great tool!!!

