network info (primary I/F) script; with workaround for Debian #798329 and iproute2...
[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 : ${XDG_DATA_HOME:=~/.local/share}
23
24 if [[ $1 = install ]]; then
25         script=$(readlink -f $0)
26
27         [[ -d $XDG_DATA_HOME ]] || mkdir -p $XDG_DATA_HOME
28         [[ -f $XDG_DATA_HOME/unidata.txt ]] || wget -O $XDG_DATA_HOME/unidata.txt "https://www.mirbsd.org/cvs.cgi/~checkout~/contrib/samples/unidata.txt?content-type=text%2Fplain"
29         [[ -x "$script" ]] || chmod +x "$script"
30
31         grep "bind ^U exec mksh $script" ~/.screenrc || print -r -- "bind ^U exec mksh $script" >>~/.screenrc
32
33         exit
34 elif [[ $1 = update ]]; then
35         [[ -f $XDG_DATA_HOME/unidata.txt ]] && wget -O $XDG_DATA_HOME/unidata.txt "https://www.mirbsd.org/cvs.cgi/~checkout~/contrib/samples/unidata.txt?content-type=text%2Fplain"
36
37         exit
38 fi
39
40 if [[ $1 != do ]]; then
41         screen -X eval 'split' 'focus down'
42         screen -X screen mksh "$0" do
43         exit $?
44 fi
45
46 set -U
47 UNIDATA=$XDG_DATA_HOME/unidata.txt
48
49 if ! T=$(mktemp -d /tmp/utf8-select.XXXXXXXXX); then
50         print -u2 Error creating temporary directory
51         exit 1
52 fi
53
54 cd "$T"
55
56 sed -n '/^.*U+\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\)  *[^ ]*  *\([^;]*\);.*$/s//\1        \2/p' \
57     <"$UNIDATA" | grep -v -e '^00[0189]' -e '^007F' -e '^D[89ABCDEF]' >U
58
59 res=
60 found=0
61 while :; do
62         dialog \
63             --cancel-label "No, thanks" \
64             --output-fd 3 \
65             --shadow \
66             --title 'UTF-8 selector' \
67             --inputbox "${res:+$res }Look up character?" 8 $((COLUMNS - 4)) \
68             3>o || break
69         [[ -s o ]] || break
70         res=
71
72         fgrep -i -e "$(<o)" U >r
73         if [[ ! -s r ]]; then
74                 res="No result!"
75                 continue
76         fi
77
78         set -A c
79         while IFS= read -r l; do
80                 typeset -i1 x=16#${l::4}
81
82                 s="${x#1#} ${l: 5}"
83                 c+=(${l::4} "$s")
84         done <r
85
86         dialog \
87             --cancel-label "No, thanks" \
88             --extra-button \
89             --extra-label "Back" \
90             --output-fd 3 \
91             --shadow \
92             --title 'UTF-8 selector' \
93             --menu 'Select Unicode character to insert' \
94             $((LINES-4)) $((COLUMNS-4)) $((LINES-10)) \
95             "${c[@]}" \
96             3>q
97         v=$?
98
99         (( v == 3 )) && continue
100         (( v )) && break
101         res="Nothing selected?"
102         [[ -s q ]] || continue
103         typeset -i1 ch=16#$(<q)
104         print -nr -- "${ch#1#}" >ch
105         screen -X readreg p "$T/ch"
106         screen -X eval 'focus up' 'paste p' 'focus down'
107         break
108 done
109
110 cd /
111 rm -rf "$T"
112
113 screen -X remove