-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdavis-fzf
executable file
·52 lines (44 loc) · 947 Bytes
/
davis-fzf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/sh
set -eu
TAGS=" artist album genre composer work "
expr_reduce() {
awk -vFS="\n" 'NR > 1 { printf(" AND ") } { printf "%s", $1 }'
}
escape_quotes() {
sed 's/"/\\\"/g'
}
alternatives() {
EXPR="$1"
TAG="$2"
if [ -n "$EXPR" ]; then
davis list "$TAG" "($EXPR)"
else
davis list "$TAG"
fi
}
foo() {
EXPR="${1:-}"
LAST="${2-}"
echo "$EXPR"
case "$TAGS" in
*" $LAST "*)
NEW_TERMS="$(alternatives "$EXPR" "$LAST" | fzf -m | escape_quotes | while read -r l; do echo "($LAST == \"$l\")"; done | expr_reduce)"
if [ -n "$EXPR" ]; then
EXPR="$EXPR AND $NEW_TERMS"
else
EXPR="$NEW_TERMS"
fi
foo "$EXPR"
;;
*)
SELECTED="$(echo "$TAGS path" | tr ' ' '\n' | grep -v '^$' | fzf)" || return 0
foo "$EXPR" "$SELECTED"
;;
esac
}
EXPR="$(foo | tail -n 1)"
if [ -n "$EXPR" ]; then
davis clear
davis search "($EXPR)" | rev | cut -d/ -f2- | rev | sort -u | xargs -L1 -d'\n' davis add
davis play
fi