     switch Object.keys(ruh)[0]
       when 'txt' then update rows: [mapr.rows..., ruh.txt]
       when 'tan' then ruh.tan.split("\n").reverse().map (txt)-> peer {txt}
-      when 'hop' then update cursor: buffer.transpose ruh.hop #; peer act:'bel'
+      when 'hop' then update cursor: ruh.hop; bell() # XX buffer.transpose?
       when 'pro' then update prompt: ruh.pro.cad
       when 'blk' then console.log "Stub #{str ruh}"
       when 'det' then buffer.receive ruh.det; sync ruh.det.ted
       when 'act' then switch ruh.act
         when 'clr' then update rows:[]
-        when 'bel' then flash ($ 'body'), 'black'
+        when 'bel' then bell()
         when 'nex' then update
           input: ""
           cursor: 0

    sync ted
    sendAction {det}


  Mousetrap.handleKey = (char, mod, e)->
    norm = {
      capslock:  'caps'
      pageup:    'pgup'
      pagedown:  'pgdn'
      backspace: 'baxp'
      enter:     'entr'
    }

    key = switch
      when char.length is 1
        if e.type is 'keypress'
          chac = char.charCodeAt(0)
          if chac < 32          # normalize ctrl keys
            char = String.fromCharCode chac | 96
          str: char
      when e.type is 'keydown'
        if char isnt 'space'
          act: norm[char] ? char
      when e.type is 'keyup' and norm[key] is 'caps'
        act: 'uncap'
    if !key then return
    if key.act and key.act in mod
      return
    e.preventDefault()
    mapr = matr.props
    #[fore, aft] = (
    #  [sli,cur] = [mapr.input.slice, mapr.cursor]
    #  [sli(0, cur), sli(cur)]
    #)

    switch mod.sort().join '-'
      when '', 'shift'
        if key.str

    #   )
    #   document.title = "Matri"  # XX  debug
    # later {mod, key}

