;; hacks:
;; meta-h is help
;; control-comma sets mark

(define-key global-map "\C-h" 'backward-delete-char)
(define-key global-map "\e[" 'rs6000-translate-meta)
(define-key global-map "\eh" 'help-for-help)

(setq rs6000-key-vector [?% nil nil nil nil nil nil nil nil ?\C-? nil
			       9 ?q ?w ?e ?r ?t ?y ?u ?i ?o
			       ?p ?[ ?] ?\ ?a ?s ?d ?f ?g ?h
			       ?j ?k ?l nil ?; nil ?' 13 ?z ?x
			       ?c ?v ?b ?n ?m 31 ?, nil ?. nil
			       ?/ nil ?` nil nil nil nil nil nil 49])
          
(define-key global-map (format "\e%c" 31) 'set-mark-command)




(defun rs6000-translate-meta ()
  (interactive)
  (let* ((c1 (read-char))
	 (c2 (read-char))
	 (c3 (read-char))
	 (c4 (read-char)))
    (if (eq c4 ?q)
	(let* ((rnum (+ (* 100 (- c1 48))
			(* 10 (- c2 48))
			(* 1 (- c3 48))))
	       (num (- rnum 62)))
	  (if (and (>= num 0)
		   (< num (length rs6000-key-vector))
		   (aref rs6000-key-vector num))
	      (let* ((string
		     (concat 
		      "\e" (make-string 1 (aref rs6000-key-vector num))))
		     (func (and (current-local-map)
				(lookup-key (current-local-map) string))))
		(call-interactively
		 (if (and func (not (numberp func)))
		     func
		   (or (lookup-key global-map string)
		       (error "No binding on q code")))))
	    (message "Unknown q code: %d" rnum)))
      (message "Unknown escape suffix: %c" c4))))
