[comp.unix.microport] Using a meta key that sends ESC N key

zeeff@b-tech.ann-arbor.mi.us (Jon Zeeff) (11/02/88)

A while back I asked for a way to get a meta key (alt key) on my 
terminal (the console on a '386 system) to work as a emacs meta key.  
In the hope that others will benefit from the authors time (thanks), 
I'm listing the responses I got.  The suggestion from Anton Rang 
seemed to work fine for me.  

Note that this is particularily relevant to Microport Unix emacs users 
- the alt key causes another key to send ESC N key.  

---------------------------------------------------------------------
From: matt@oddjob.uchicago.edu (Matt Crawford)

Copying the ESC keymap to ESC N is fine only until some key is 
rebound.  

How about instead binding ESC-N to the following function?

(defun sorta-meta ()
  "Act like a META key"
  (interactive)
  (setq prefix-arg current-prefix-arg
	this-command last-command
	unread-command-char ?\e))

Caution: untested.

------------------------------------------------------------------------
From: umix!esl.esl.com!lrs (Lynn Slater)

(defun eat-extra-n ()
  "Replaces the command input with Esc"
  (interactive)
  (setq unread-command-char 27))

(global-set-key "\en" 'eat-extra-n)


----------------------------------------------------------------
From: Paul Dworkin <umix!media-lab.media.mit.edu!paul>

  Try putting the following "magic" into your .emacs file.


The following is a quick hack with similar results:

	(define-key esc-map "n" 'ESC-prefix)

This makes ESC N become ESC.  The only problem with it is that you can't
invoke whatever function was on ESC N.

---------------------------------------------------------------------
From: Anton Rang <umix!cpsin3.cps.msu.edu!rang>

  I suspect you'd be able to do something like:

	(global-set-key "\eN" 'ESC-prefix)

[This worked well for me]

------------------------------------------------------------------
From: Mark D. Baushke <umix!silvlis.com!mdb>


;---------- make ESC N <key-sequence> behave like ESC <key-sequence> ----------
;; Note the following should probably be done inside a
;; lisp/term/<terminal>.el file rather than in your .emacs file.

;; Some versions of copy-keymap don't recurse to all levels.
(defun deep-copy-keymap (keymap)
  "Return a deep copy of KEYMAP.  That is, all levels are copied,
not just the top level."
  (if (not (keymapp keymap))
      keymap
    (cond

     ((listp keymap)
      (let ((new-keymap (copy-alist keymap)))
	(setq keymap (cdr new-keymap))
	(while keymap
	  (let ((binding (car keymap)))
	    (if (keymapp (cdr binding))
		(setcdr binding (deep-copy-keymap (cdr binding))))
	    )
	  (setq keymap (cdr keymap))
	  )
	new-keymap
	))

      ((vectorp keymap)
       (let ((i 0)
	     (n (length keymap))
	     (new-keymap (copy-sequence keymap)))
	 (while (< i n)
	   (if (keymapp (aref keymap i))
	       (aset new-keymap i (deep-copy-keymap (aref keymap i))))
	   (setq i (1+ i)))
	 new-keymap
	 )))))

;; Create a copy of the esc-map which can be bound to the N key.
(setq esc-n-map (deep-copy-keymap esc-map))

;; Install the key map.
(define-key esc-map "N" esc-n-map)

;;!; Alternative to last two lisp statements above would be given the
;;!; name of the terminal type which has the ESC N problem is is
;;!; "footype" then:
;;!;
;;!; (if (string= (getenv "TERM") "footype")
;;!;     (progn
;;!;       ;; Create a copy of the esc-map which can be bound to the N key.
;;!;       (setq esc-n-map (deep-copy-keymap esc-map))
;;!;       
;;!;       ;; Install the key map.
;;!;       (define-key esc-map "N" esc-n-map)))


------------------------------------------------------------------------------
From: umix!bigtex.cactus.org!james (James Van Artsdalen)

You can do certain mappings:

(setq term-file-prefix nil)

;; Map AT386/Microport function key escape sequences
;; into the standard slots in function-keymap.

(require 'keypad)

(defvar SS3-map nil
  "SS3-map maps the keypad on the AT keyboard.")

(if (not SS3-map)
    (progn

     (setq SS3-map (lookup-key global-map "\eO"))
     (if (not (keymapp SS3-map))
	 (setq SS3-map (make-keymap)))  ;; <ESC>O commands
     (setup-terminal-keymap SS3-map
	    '(("K" . ?N)		; page down
	      ("C" . ?P)		; page up
	      ("A" . ?\^a)		; home (beginning of line)
	      ("N" . ?.)        	; delete character
	      ("I" . ?\^b)		; end (end of line)
     	      ("P" . ??)	   	; help - F1
	      ("e" . backward-word)
	      ("o" . forward-word)
	      ("c" . beginning-of-buffer)
	      ("k" . end-of-buffer)
	      ("M" . overwrite-mode)
	      ("T" . ?\^c)))       ; isearch - F5

     (define-key global-map "\eO" SS3-map)))

(define-key SS3-map "\C-K" 'end-of-buffer)
(define-key SS3-map "\C-C" 'beginning-of-buffer)
;; (define-key SS3-map "\C-E" 'backward-word)
;; (define-key SS3-map "\C-O" 'forward-word)

(defvar SS2-map nil
  "SS2-map maps the function keys on the AT keyboard.")

(if (not SS2-map)
    (progn

     (setq SS2-map (lookup-key global-map "\eN"))
     (if (not (keymapp SS2-map))
	 (setq SS2-map (make-keymap)))  ;; <ESC>N commands
     (setup-terminal-keymap SS2-map
	    '(("u" . advertised-undo)	        ; undo
	      ("b" . list-buffers)
	      ("g" . goto-line)
	      ("w" . write-file)
	      ("s" . save-buffer)
	      ("1" . digit-argument)
	      ("2" . digit-argument)
	      ("3" . digit-argument)
	      ("4" . digit-argument)
	      ("5" . digit-argument)
	      ("6" . digit-argument)
	      ("7" . digit-argument)
	      ("8" . digit-argument)
	      ("9" . digit-argument)
	      ("0" . digit-argument)
	      ("i" . overwrite-mode)
              ("x" . save-buffers-kill-emacs)))

     (define-key global-map "\eN" SS2-map)))

;;;
;;;  install ispell
;;;

;;; 
(autoload 'ispell-word "ispell"
	  "Check spelling of word at or before point" t)
(autoload 'ispell-complete-word
	  "ispell" "Complete word at or before point" t)
(autoload 'ispell-region "ispell"
	  "Check spelling of every word in the region" t)
(autoload 'ispell-buffer "ispell"
	  "Check spelling of every word in the buffer" t)

;;; (autoload 'ispell-word "ispell"
;;;   "Check the spelling of word in buffer." t)
;;; (global-set-key "\e$" 'ispell-word)
;;; (autoload 'ispell-region "ispell"
;;;   "Check the spelling of region." t)
;;; (autoload 'ispell-buffer "ispell"
;;;   "Check the spelling of buffer." t)


-- 
Jon Zeeff      			Ann Arbor, MI
umix!b-tech!zeeff  		zeeff@b-tech.ann-arbor.mi.us