Added utf8-select, an interactive mksh+dialog UTF8 input box for GNU screen
[shellsnippets/shellsnippets.git] / mksh / utf8-select
1 #!/bin/mksh
2 #-
3 # Copyright © 2013
4 #       Thorsten Glaser <tg@mirbsd.org>
5 #       Dominik George <nik@naturalnet.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21
22 if [[ $1 = install ]]; then
23         script=$(readlink -f $0)
24
25         [[ -d ~/.local/share ]] || mkdir -p ~/.local/share
26         [[ -f ~/.local/share/unidata.txt ]] || wget -O ~/.local/share/unidata.txt "https://www.mirbsd.org/cvs.cgi/~checkout~/contrib/samples/unidata.txt?content-type=text%2Fplain"
27         [[ -x "$script" ]] || chmod +x "$script"
28
29         grep "bind ^U exec mksh $script" ~/.screenrc || print -r -- "bind ^U exec mksh $script" >>~/.screenrc
30
31         exit
32 elif [[ $1 = update ]]; then
33         [[ -f ~/.local/share/unidata.txt ]] && wget -O ~/.local/share/unidata.txt "https://www.mirbsd.org/cvs.cgi/~checkout~/contrib/samples/unidata.txt?content-type=text%2Fplain"
34
35         exit
36 fi
37
38 if [[ $1 != do ]]; then
39         screen -X eval 'split' 'focus down'
40         screen -X screen mksh "$0" do
41         exit $?
42 fi
43
44 set -U
45 UNIDATA=~/.local/share/unidata.txt
46
47 if ! T=$(mktemp -d /tmp/utf8-select.XXXXXXXXX); then
48         print -u2 Error creating temporary directory
49         exit 1
50 fi
51
52 cd "$T"
53
54 sed -n '/^.*U+\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\)  *[^ ]*  *\([^;]*\);.*$/s//\1        \2/p' \
55     <"$UNIDATA" | grep -v -e '^00[0189]' -e '^007F' -e '^D[89ABCDEF]' >U
56
57 res=
58 found=0
59 while :; do
60         dialog \
61             --cancel-label "No, thanks" \
62             --output-fd 3 \
63             --shadow \
64             --title 'UTF-8 selector' \
65             --inputbox "${res:+$res }Look up character?" 8 $((COLUMNS - 4)) \
66             3>o || break
67         [[ -s o ]] || break
68         res=
69
70         fgrep -i -e "$(<o)" U >r
71         if [[ ! -s r ]]; then
72                 res="No result!"
73                 continue
74         fi
75
76         set -A c
77         while IFS= read -r l; do
78                 typeset -i1 x=16#${l::4}
79
80                 s="${x#1#} ${l: 5}"
81                 c+=(${l::4} "$s")
82         done <r
83
84         dialog \
85             --cancel-label "No, thanks" \
86             --extra-button \
87             --extra-label "Back" \
88             --output-fd 3 \
89             --shadow \
90             --title 'UTF-8 selector' \
91             --menu 'Select Unicode character to insert' \
92             $((LINES-4)) $((COLUMNS-4)) $((LINES-10)) \
93             "${c[@]}" \
94             3>q
95         v=$?
96
97         (( v == 3 )) && continue
98         (( v )) && break
99         res="Nothing selected?"
100         [[ -s q ]] || continue
101         typeset -i1 ch=16#$(<q)
102         print -nr -- "${ch#1#}" >ch
103         screen -X readreg p "$T/ch"
104         screen -X eval 'focus up' 'paste p' 'focus down'
105         break
106 done
107
108 cd /
109 rm -rf "$T"
110
111 screen -X remove