-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
emoji-cli.sh
123 lines (103 loc) · 2.96 KB
/
emoji-cli.sh
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#
# _ _ _ _
# (_|_) | (_)
# ___ _ __ ___ ___ _ _ ______ ___| |_
# / _ \ '_ ` _ \ / _ \| | |______/ __| | |
# | __/ | | | | | (_) | | | | (__| | |
# \___|_| |_| |_|\___/| |_| \___|_|_|
# _/ |
# |__/
#
EMOJI_CLI_DICT="${0:A:h}/dict/emoji.json"
: "${EMOJI_CLI_FILTER:="fzf:peco:percol"}"
: "${EMOJI_CLI_KEYBIND:="^s"}"
# helper functions
is_zsh() { [ -n "$ZSH_VERSION" ]; }
available() {
local x candidates
# candidates should be list like "a:b:c" concatenated by a colon
candidates="$1:"
while [ -n "$candidates" ]; do
# the first remaining entry
x=${candidates%%:*}
# reset candidates
candidates=${candidates#*:}
# check if x is available
if (( $+commands[$x] )); then
echo "$x"
return 0
else
continue
fi
done
return 1
}
# unique EMOJI_CLI_FILTER
_EMOJI_CLI_FILTER="$(available "$EMOJI_CLI_FILTER")"
emoji::emoji_get() {
# reset filter
_EMOJI_CLI_FILTER="$(available "$EMOJI_CLI_FILTER")"
cat <"$EMOJI_CLI_DICT" \
| jq -r '.[]|"\(.emoji) \(":" + .aliases[0] + ":")"' \
| eval "$_EMOJI_CLI_FILTER" \
| awk '{print $2}'
}
emoji::emoji_get_with_tag() {
# reset filter
_EMOJI_CLI_FILTER="$(available "$EMOJI_CLI_FILTER")"
cat <"$EMOJI_CLI_DICT" \
| jq -r '.[] | select(.tags[],.aliases[]|contains("'"$1"'"))| "\(.emoji) \(":" + .aliases[0] + ":")"' \
| sort -k2,2 \
| uniq \
| eval "$_EMOJI_CLI_FILTER" \
| awk '{print $2}'
}
emoji::cli() {
local emoji
local _BUFFER _RBUFFER _LBUFFER
_RBUFFER=$RBUFFER
if [[ -n $LBUFFER ]]; then
_LBUFFER=${LBUFFER##* }
if [[ $_LBUFFER =~ [a-zA-z0-9+_-]$ ]]; then
local comp
comp="$(echo $_LBUFFER | grep -E -o ":?[a-zA-z0-9+_-]+")"
emoji="$(emoji::emoji_get_with_tag "${(L)comp#:}")"
_BUFFER="${LBUFFER%$comp}${emoji:-$comp}"
else
emoji="$(emoji::emoji_get)"
_BUFFER="${LBUFFER}${emoji}"
fi
else
emoji="$(emoji::emoji_get)"
_BUFFER="${emoji}"
fi
if [[ -n "$_RBUFFER" ]]; then
BUFFER=$_BUFFER$_RBUFFER
else
BUFFER=$_BUFFER
fi
CURSOR=$#_BUFFER
zle reset-prompt
}
# source only
if [[ ! $- =~ i ]]; then
echo "this script requires interactive shell mode" 1>&2
exit 1
fi
# zsh only
if ! is_zsh; then
echo "this script requires zsh" 1>&2
return 1
fi
if (( ! $+commands[jq] )); then
echo "jq: not found" 1>&2
return 1
fi
if [[ -z $_EMOJI_CLI_FILTER ]] || (( ! $+commands[$_EMOJI_CLI_FILTER] )); then
echo "$EMOJI_CLI_FILTER: not available as an interactive filter command" 1>&2
return 1
fi
# settings for keybind
zle -N emoji::cli
bindkey "$EMOJI_CLI_KEYBIND" emoji::cli
# vim:ft=zsh