#!/bin/sh # This grossness allows expect to be anywhere in PATH: \ exec expect -f "$0" ${1+"$@"} # # h.soav 1.11 # by Adam M. Costello # # # Simulates a dvorak keyboard. # # Control characters are not mapped, because many of them can't be. # Instead, TAB acts as a dead key, causing the next character to be # CTRL'd if it is pressed within 1 second. Also, two TABs, separated # by less than one second, map immediately to a TAB. Exit is automatic # upon EOF on the shell's stdout, but TAB ~! can be used to force an # exit (attempting to close the shell first). set @ \00 set A \01 set B \02 set C \03 set D \04 set E \05 set F \06 set G \07 set H \10 set I \11 set J \12 set K \13 set L \14 set M \15 set N \16 set O \17 set P \20 set Q \21 set R \22 set S \23 set T \24 set U \25 set V \26 set W \27 set X \30 set Y \31 set Z \32 set \[ \33 set bs \34 set \] \35 set ^ \36 set _ \37 log_user 0 spawn $env(SHELL) log_user 1 set timeout 1 interact { ${I}@ {send ${@}} ${I}^ {send ${^}} -- - {send \]} _ {send \[} ${I}- {send ${]}} ${I}_ {send ${[}} q {send '} Q {send \"} w {send ,} W {send <} e {send .} E {send >} r {send p} R {send P} ${I}r {send $P} t {send y} T {send Y} ${I}t {send $Y} y {send f} Y {send F} ${I}y {send $F} u {send g} U {send G} ${I}u {send $G} i {send c} I {send C} ${I}i {send $C} o {send r} O {send R} ${I}o {send $R} p {send l} P {send L} ${I}p {send $L} \[ {send /} \{ {send ?} \] {send \}} \} {send \{} ${I}\\ {send $bs} ${I}a {send $A} s {send o} S {send O} ${I}s {send $O} d {send e} D {send E} ${I}d {send $E} f {send u} F {send U} ${I}f {send $U} g {send i} G {send I} ${I}g {send $I} h {send d} H {send D} ${I}h {send $D} j {send h} J {send H} ${I}j {send $H} k {send t} K {send T} ${I}k {send $T} l {send n} L {send N} ${I}l {send $N} \; {send s} : {send S} ${I}\; {send $S} ' {send -- -} \" {send _} ${I}\" {send $_} z {send \;} Z {send :} x {send q} X {send Q} ${I}x {send $Q} c {send j} C {send J} ${I}c {send $J} v {send k} V {send K} ${I}v {send $K} b {send x} B {send X} ${I}b {send $X} n {send b} N {send B} ${I}n {send $B} ${I}m {send $M} , {send w} < {send W} ${I}, {send $W} . {send v} > {send V} ${I}. {send $V} / {send z} ? {send Z} ${I}/ {send $Z} $I$I {send $I} $I~! {close; exit} timeout 1 {} }