summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Isidoro <denisidoro@users.noreply.github.com>2020-01-17 15:29:16 -0300
committerGitHub <noreply@github.com>2020-01-17 15:29:16 -0300
commita70c6dfadd2a82f65a5569f06de98a4fd5fa6374 (patch)
tree69531cb1040e780141d227de7ed76cf124a6369c
parent8f2bc5f7e770921e20165babf17b5c8f7675c8dc (diff)
Add support for multiple choice (#175)v0.18.0
Fixes #173
-rw-r--r--README.md23
-rwxr-xr-xnavi2
-rw-r--r--src/arg.sh37
3 files changed, 52 insertions, 10 deletions
diff --git a/README.md b/README.md
index 466627c..7954df7 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,9 @@ Table of contents
* [Cheatsheet syntax](#cheatsheet-syntax)
* [Syntax overview](#syntax-overview)
* [Variables](#variables)
- * [Table formatting](#table-formatting)
+ * [Variable options](#variable-options)
+ * [Table formatting](#table-formatting)
+ * [Multiple choice](#multiple-choice)
* [List customization](#list-customization)
* [Related projects](#related-projects)
* [Etymology](#etymology)
@@ -233,9 +235,13 @@ $ x: echo -e '1\n2\n3'
$ y: echo -e "$((x+10))\n$((x+20))"
```
-### Table formatting
+### Variable options
-You can pick a specific column of a selection and set the number of lines considered as headers:
+For lines starting with `$` you can add extra options using `---`.
+
+#### Table formatting
+
+You can pick a specific column of a selection and set the number of lines considered as headers via `--column` and `--headers`:
```sh
# This will pick the 3rd column and use the first line as header
@@ -244,6 +250,17 @@ docker rmi <image_id>
$ image_id: docker images --- --column 3 --headers 1
```
+#### 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>
+
+$ files: ls --- --multi true
+```
+
List customization
------------------
diff --git a/navi b/navi
index f935fc7..16da67f 100755
--- a/navi
+++ b/navi
@@ -4,7 +4,7 @@ set -euo pipefail
export NAVI_HOME="$(cd "$(dirname "$0")" && pwd)"
source "${NAVI_HOME}/src/main.sh"
-VERSION="0.17.1"
+VERSION="0.18.0"
NAVI_ENV="${NAVI_ENV:-prod}"
opts::eval "$@"
diff --git a/src/arg.sh b/src/arg.sh
index 4707721..6fd2afc 100644
--- a/src/arg.sh
+++ b/src/arg.sh
@@ -19,14 +19,28 @@ arg::escape() {
arg::interpolate() {
local -r arg="$1"
- local -r value="$2"
+ local -r value="$(echo "$2" | tr "$ESCAPE_CHAR_3" '\n')"
- local -r words="$(echo "$value" | wc -w | xargs)"
+ local -r lines="$(echo "$value" | wc -l)"
+
+ if [ $lines -lt 2 ]; then
+
+ local -r words="$(echo "$value" | wc -w | xargs)"
+
+ if [[ $words > 1 ]]; then
+ sed "s|<${arg}>|\"${value}\"|g"
+ else
+ sed "s|<${arg}>|${value}|g"
+ fi
- if [[ $words > 1 ]]; then
- sed "s|<${arg}>|\"${value}\"|g"
else
- sed "s|<${arg}>|${value}|g"
+
+ local -r newvalue="$(echo "$value" \
+ | xargs -I% echo '"%"' \
+ | tr '\n' ' ')"
+
+ sed "s|<${arg}>|${newvalue}|g"
+
fi
}
@@ -78,8 +92,19 @@ arg::pick() {
if [ -n "$fn" ]; then
local suggestions="$(eval "$fn" 2>/dev/null)"
+
+ local args
+ args+=("--prompt"); args+=("${arg}: ")
+ args+=("--header-lines"); args+=("${headers:-0}")
+ if ${multi:-false}; then
+ args+=("-m")
+ fi
+
if [ -n "$suggestions" ]; then
- echo "$suggestions" | ui::fzf --prompt "$arg: " --header-lines "${headers:-0}" | str::column "${column:-}" "${separator:-}"
+ echo "$suggestions" \
+ | ui::fzf ${args[@]:-} \
+ | str::column "${column:-}" "${separator:-}" \
+ | tr '\n' "$ESCAPE_CHAR_3"
fi
elif ${NAVI_USE_FZF_ALL_INPUTS:-false}; then
echo "" | ui::fzf --prompt "$arg: " --print-query --no-select-1 --height 1