mirror of
https://github.com/denisidoro/navi
synced 2024-11-24 20:43:06 +00:00
0.3.0
This commit is contained in:
parent
4c9f8ba2ff
commit
132aee10ce
16 changed files with 146 additions and 34 deletions
8
Makefile
Normal file
8
Makefile
Normal file
|
@ -0,0 +1,8 @@
|
|||
BIN ?= navi
|
||||
PREFIX ?= /usr/local
|
||||
|
||||
install:
|
||||
scripts/symlink
|
||||
|
||||
uninstall:
|
||||
rm -f $(PREFIX)/bin/$(BIN)
|
72
README.md
Normal file
72
README.md
Normal file
|
@ -0,0 +1,72 @@
|
|||
# navi
|
||||
|
||||
An interactive cheatsheet tool for the command-line so that you'll never say the following again:
|
||||
|
||||
*- How to run that command again?*
|
||||
*- Oh, it's not in my bash history*
|
||||
*- Geez, it's almost what I wanted but I need to change some args*
|
||||
|
||||
![Demo](https://user-images.githubusercontent.com/3226564/65281359-d158f480-db08-11e9-8e69-e380d76c343b.gif)
|
||||
|
||||
**navi** allows you to browse through cheatsheets (that you may write yourself or downloaded from maintainers) and execute commands, prompting for argument values.
|
||||
|
||||
## Installation
|
||||
|
||||
**Using [brew](https://brew.sh/):**
|
||||
```
|
||||
brew install denisidoro/tools/navi
|
||||
```
|
||||
|
||||
**Without brew:**
|
||||
```
|
||||
git clone http://github.com/denisidoro/navi /opt/navi
|
||||
cd /opt/navi
|
||||
sudo make install
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Simply call `navi`
|
||||
|
||||
## Motivation
|
||||
|
||||
The main objectives are:
|
||||
- to increase discoverability, by finding commands 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 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 and 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 command at a very low cost.
|
||||
|
||||
## .cheat syntax
|
||||
|
||||
- lines starting with `%` should contain tags which will be added to any command in a given file;
|
||||
- lines starting with `#` should be descriptions of commands;
|
||||
- lines starting with `$` should contain commands that generate suggestion values for a given argument;
|
||||
- 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>
|
||||
|
||||
$ branch: git branch --format='%(refname:short)'
|
||||
```
|
||||
|
||||
For advanced usage, please refer to the files in [/cheats](https://github.com/denisidoro/navi/tree/master/cheats).
|
||||
|
||||
## Alternatives
|
||||
|
||||
- [denisidoro/beavr](https://github.com/denisidoro/beavr);
|
||||
- [how2](https://github.com/santinic/how2);
|
||||
- [howdoi](https://github.com/gleitz/howdoi);
|
||||
- [cheat](https://github.com/cheat/cheat).
|
||||
|
||||
## Etymology
|
||||
|
||||
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.
|
28
cheats
28
cheats
|
@ -1,28 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
export DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
|
||||
source "${DIR}/src/arg.sh"
|
||||
source "${DIR}/src/cheat.sh"
|
||||
source "${DIR}/src/docs.sh"
|
||||
source "${DIR}/src/misc.sh"
|
||||
source "${DIR}/src/selection.sh"
|
||||
source "${DIR}/src/str.sh"
|
||||
source "${DIR}/src/ui.sh"
|
||||
|
||||
source "${DIR}/src/main.sh"
|
||||
|
||||
##? Command cheatsheet tool
|
||||
##?
|
||||
##? Usage:
|
||||
##? cheats [options]
|
||||
##?
|
||||
##? Options:
|
||||
##? --print Prevent script execution [default: false]
|
||||
##? --no-interpolation Prevent argument interpolation [default: false]
|
||||
##? -c --cheat-folder <cheat-folder> Folder with cheatsheets
|
||||
|
||||
docs::eval "$@"
|
||||
|
||||
main "$@"
|
27
navi
Executable file
27
navi
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
export SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
source "${SCRIPT_DIR}/src/arg.sh"
|
||||
source "${SCRIPT_DIR}/src/cheat.sh"
|
||||
source "${SCRIPT_DIR}/src/docs.sh"
|
||||
source "${SCRIPT_DIR}/src/misc.sh"
|
||||
source "${SCRIPT_DIR}/src/selection.sh"
|
||||
source "${SCRIPT_DIR}/src/str.sh"
|
||||
source "${SCRIPT_DIR}/src/ui.sh"
|
||||
|
||||
source "${SCRIPT_DIR}/src/main.sh"
|
||||
|
||||
##? Command cheatsheet tool
|
||||
##?
|
||||
##? Usage:
|
||||
##? cheats [options]
|
||||
##?
|
||||
##? Options:
|
||||
##? --print Prevent script execution [default: false]
|
||||
##? --no-interpolation Prevent argument interpolation [default: false]
|
||||
|
||||
VERSION="0.3.0"
|
||||
docs::eval "$@"
|
||||
main "$@"
|
13
scripts/symlink
Executable file
13
scripts/symlink
Executable file
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
export SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
script() {
|
||||
echo "#!/usr/bin/env bash"
|
||||
echo "${SCRIPT_DIR}/navi" '$@'
|
||||
}
|
||||
|
||||
BIN="/usr/local/bin/navi"
|
||||
script > "$BIN"
|
||||
chmod +x "$BIN"
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
cheat::find() {
|
||||
find "${cheat_folder:-"${DIR}/sheets"}" -iname '*.cheat'
|
||||
find "${cheat_dir:-"${SCRIPT_DIR}/cheats"}" -iname '*.cheat'
|
||||
}
|
||||
|
||||
cheat::read_many() {
|
||||
|
|
28
src/docs.sh
28
src/docs.sh
|
@ -1,8 +1,28 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
docs::eval() {
|
||||
print=false
|
||||
no_interpolation=false
|
||||
cheat_folder=""
|
||||
docs::extract_help() {
|
||||
local readonly file="$1"
|
||||
grep "^##?" "$file" | cut -c 5-
|
||||
}
|
||||
|
||||
docs::eval() {
|
||||
local wait_for=""
|
||||
|
||||
print=false
|
||||
interpolation=true
|
||||
|
||||
for arg in $@; do
|
||||
case $arg in
|
||||
--print) print=true;;
|
||||
--no-interpolation) interpolation=false;;
|
||||
--version) echo "${VERSION:-unknown}" && exit 0;;
|
||||
--help) docs::extract_help "$0" && exit 0;;
|
||||
-d|--dir) wait_for="dir";;
|
||||
esac
|
||||
|
||||
case $wait_for in
|
||||
dir) cheat_dir="$arg"; wait_for="";;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ main() {
|
|||
local cmd="$(selection::command "$selection" "$cheat")"
|
||||
local arg value
|
||||
|
||||
if $no_interpolation; then
|
||||
if ! $interpolation; then
|
||||
echo "$cmd"
|
||||
exit 0
|
||||
fi
|
||||
|
|
Loading…
Reference in a new issue