#!/bin/bash -eu # AT translated set 2 encoder type xxd > /dev/null || exit 1 if ! test -f dumpkeys.cache; then sudo dumpkeys --keys-only > dumpkeys.cache fi # XXX: hardcoded values are generated by: #make_break_shift="$(eval echo \$at_table_$(echo -n Shift | xxd -ps))" #make_shift="${make_break_shift% *}" #break_shift="${make_break_shift#* }" make_shift=36 break_shift=b6 map_set() { # $1 - keycode # $2 - normal value # $3 - shifted value [ "${2}${3}" = "nulnul" ] && return 1 make=$(printf %02x "$1") break=$(printf %02x "$(($1 | 128))") eval "at_table_$(echo -n "${3#+}" | xxd -ps)='$make_shift $make $break $break_shift'" eval "at_table_$(echo -n "${2#+}" | xxd -ps)='$make $break'" } map_alias() { # $1,$3,$5,... - names # $2,$4,$6,... - aliases while [ -n "$1" -a -n "$2" ]; do eval "at_table_$(echo -n "${2#+}" | xxd -ps)=\${at_table_$(echo -n "${1#+}" | xxd -ps)}" shift shift done } # at_table_$normal = n # at_table_$shifted = n while read keycode n _ normal shifted rest; do [ "$keycode" = "keycode" ] || continue map_set "${n}" "${normal}" "${shifted}" done < dumpkeys.cache # Extra mapping map_alias \ one 1 exclam '!' \ two 2 at '@' \ three 3 numbersign '#' \ four 4 dollar '$' \ five 5 percent '%' \ six 6 asciicircum '^' \ seven 7 ampersand '&' \ eight 8 asterisk '*' \ nine 9 parenleft '(' \ zero 0 parenright ')' \ minus '-' underscore '_' \ equal '=' plus '+' map_alias \ bracketleft '[' braceleft '{' \ bracketright ']' braceright '}' \ semicolon ';' colon ':' \ apostrophe "'" quotedbl '"' \ grave '`' asciitilde '~' \ backslash "\\" bar '|' \ comma ',' less '<' \ period '.' greater '>' \ slash '/' question '?' \ space ' ' Return $'\n' translate() { for t in $(echo -n "$*" | xxd -ps | sed -e 's/../& /g'); do n="at_table_$t" v="${!n}" [ -z "$v" ] && echo "$0: unknown char: '$t'." >&2 echo -n " ${v}" done echo } [ "$(basename "$0")" = "translate.sh" ] && translate " vmlinuz initrd=initrd.img biosdevname=0 ks=cdrom:/ks.cfg ip=10.20.0.2 gw=10.20.0.1 dns1=10.20.0.1 netmask=255.255.255.0 hostname=fuel.domain.tld showmenu=no "