*** empty log message ***
[bpt/emacs.git] / lisp / emulation / edt-mapper.el
index 2e54272..79dabcc 100644 (file)
@@ -1,18 +1,17 @@
-;;; edt-mapper.el  ---  Create an EDT LK-201 Map File for X-Windows Emacs.
+;;; edt-mapper.el --- create an EDT LK-201 map file for X-Windows Emacs
 
-;;;                             For GNU Emacs 19
+;; Copyright (C) 1994, 1995, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
-;; Copyright (C) 1994, 1995  Free Software Foundation, Inc.
-
-;; Author: Kevin Gallagher <kgallagh@spd.dsccc.com>
-;; Maintainer: Kevin Gallagher <kgallagh@spd.dsccc.com>
+;; Author: Kevin Gallagher <Kevin.Gallagher@boeing.com>
+;; Maintainer: Kevin Gallagher <Kevin.Gallagher@boeing.com>
 ;; Keywords: emulations
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
+;;
 
-;;  This emacs lisp program can be used to create an emacs lisp file
-;;  that defines the mapping of the user's keyboard under X-Windows to
-;;  the LK-201 keyboard function keys and keypad keys (around which
-;;  EDT has been designed).  Please read the "Usage" AND "Known
-;;  Problems" sections before attempting to run this program.  (The
-;;  design of this file, edt-mapper.el, was heavily influenced by
-;;  tpu-mapper.el.) 
-
-;;; Usage:
+;;  [Part of the GNU Emacs EDT Emulation.]
 
-;;  Simply load this file into the X-Windows version of emacs (version 19)
+;;  This emacs lisp program can be used to create an emacs lisp file
+;;  that defines the mapping of the user's keyboard to the LK-201
+;;  keyboard function keys and keypad keys (around which EDT has been
+;;  designed).  Please read the "Usage" AND "Known Problems" sections
+;;  below before attempting to run this program.  (The design of this
+;;  file, edt-mapper.el, was heavily influenced by tpu-mapper.el.)
+
+;;  Version 4.0 contains the following enhancements:
+
+;;  1.  If you access a workstation using an X Server, note that the
+;;      initialization file generated by edt-mapper.el will now
+;;      contain the name of the X Server vendor.  This is a
+;;      convenience for those who have access to their Unix account
+;;      from more than one type of X Server.  Since different X
+;;      Servers typically require different EDT emulation
+;;      initialization files, edt-mapper.el will now generate these
+;;      different initialization files and save them with different
+;;      names.
+
+;;  2.  Also, edt-mapper.el is now capable of binding an ASCII key
+;;      sequence, providing the ASCII key sequence prefix is already
+;;      known by Emacs to be a prefix.  As a result, some
+;;      terminal/keyboard/window system configurations, which don't
+;;      have a complete set of sensible function key map bindings, can
+;;      still be configured for EDT Emulation.
+
+
+;;  Usage:
+
+;;  Simply load this file into emacs (version 19 or higher)
 ;;  using the following command.
 
 ;;    emacs -q -l edt-mapper.el
 
-;;  The "-q" option prevents loading of your .emacs file (commands therein
-;;  might confuse this program).
+;;  The "-q" option prevents loading of your .emacs file (commands
+;;  therein might confuse this program).
 
-;;  An instruction screen showing the typical LK-201 terminal functions keys
-;;  will be displayed, and you will be prompted to press the keys on your
-;;  keyboard which you want to emulate the corresponding LK-201 keys.
+;;  An instruction screen showing the typical LK-201 terminal
+;;  functions keys will be displayed, and you will be prompted to
+;;  press the keys on your keyboard which you want to emulate the
+;;  corresponding LK-201 keys.
 
 ;;  Finally, you will be prompted for the name of the file to store
 ;;  the key definitions.  If you chose the default, it will be found
 ;;  and loaded automatically when the EDT emulation is started.  If
 ;;  you specify a different file name, you will need to set the
-;;  variable "edt-xkeys-file" before starting the EDT emulation.
+;;  variable "edt-keys-file" before starting the EDT emulation.
 ;;  Here's how you might go about doing that in your .emacs file.
 
-;;    (setq edt-xkeys-file (expand-file-name "~/.my-emacs-x-keys"))
+;;    (setq edt-keys-file (expand-file-name "~/.my-emacs-keys"))
+
+
+;;  Known Problems:
+
+;;  Sometimes, edt-mapper will ignore a key you press, and just
+;;  continue to prompt for the same key.  This can happen when your
+;;  window manager sucks up the key and doesn't pass it on to emacs,
+;;  or it could be an emacs bug.  Either way, there's nothing that
+;;  edt-mapper can do about it.  You must press RETURN, to skip the
+;;  current key and continue.  Later, you and/or your local Emacs guru
+;;  can try to figure out why the key is being ignored.
 
-;;; Known Problems:
+;;; History:
+;;
 
-;;  Sometimes, edt-mapper will ignore a key you press, and just continue to
-;;  prompt for the same key.  This can happen when your window manager sucks
-;;  up the key and doesn't pass it on to emacs, or it could be an emacs bug.
-;;  Either way, there's nothing that edt-mapper can do about it.  You must
-;;  press RETURN, to skip the current key and continue.  Later, you and/or
-;;  your local X guru can try to figure out why the key is being ignored.
+;;  Version 4.0    2000    Added 2 New Features
 
-;; ====================================================================
+;;; Code:
 
 ;;;
-;;;  Make sure we're running X-windows and Emacs version 19
+;;;  Make sure we're running Emacs version 19, or higher.
 ;;;
+
 (cond
- ((not (and window-system (not (string-lessp emacs-version "19"))))
+ ((string-lessp emacs-version "19")
   (insert "
 
     Whoa!  This isn't going to work...
 
-    You must run edt-mapper.el under X-windows and Emacs version 19.
+    You must run edt-mapper.el under Emacs version 19 or higher.
 
     Press any key to exit.  ")
   (sit-for 600)
   (kill-emacs t)))
 
-
 ;;;
-;;;  Decide whether we're running GNU or Lucid emacs.
+;;;  Decide Emacs Variant, GNU Emacs or XEmacs (aka Lucid Emacs).
+;;;  Determine Window System, and X Server Vendor (if appropriate).
 ;;;
-(defconst edt-lucid-emacs19-p (string-match "Lucid" emacs-version)
-  "Non-NIL if we are running Lucid Emacs version 19.")
+(defconst edt-window-system (if (featurep 'xemacs) (console-type) window-system)
+  "Indicates window system \(in GNU Emacs\) or console type \(in XEmacs\).")
+
+(defconst edt-xserver (if (eq edt-window-system 'x)
+                         (if (featurep 'xemacs)
+                             ;; The Cygwin window manager has a `/' in its
+                             ;; name, which breaks the generated file name of
+                             ;; the custom key map file.  Replace `/' with a
+                             ;; `-' to work around that.
+                             (replace-in-string (x-server-vendor) "[ /]" "-")
+                           (subst-char-in-string ?/ ?- (subst-char-in-string ?  ?- (x-server-vendor))))
+                       nil)
+  "Indicates X server vendor name, if applicable.")
 
 
 ;;;
 (defvar edt-key-seq nil)
 (defvar edt-enter-seq nil)
 (defvar edt-return-seq nil)
+(defvar edt-term nil)
+
+;; To silence the byte-compiler
+(eval-when-compile
+  (defvar EDT-key-name)
+  (defvar edt-save-function-key-map))
+
+;;;
+;;;  Determine Terminal Type (if appropriate).
+;;;
 
+(if (and edt-window-system (not (eq edt-window-system 'tty)))
+    (setq edt-term nil)
+  (setq edt-term (getenv "TERM")))
 
 ;;;
-;;;  Make sure the window is big enough to display the instructions
+;;;  Make sure the window is big enough to display the instructions,
+;;;  except where window cannot be re-sized.
 ;;;
-(if edt-lucid-emacs19-p (set-screen-size nil 80 36)
-  (set-frame-size (selected-frame) 80 36))
 
+(if (and edt-window-system (not (eq edt-window-system 'tty)))
+    (set-frame-size (selected-frame) 80 36))
 
 ;;;
 ;;;  Create buffers - Directions and Keys
 ;;;   Display directions
 ;;;
 (switch-to-buffer "Directions")
-(insert "
+(if (and edt-window-system (not (eq edt-window-system 'tty)))
+    (insert "
                                   EDT MAPPER
 
-    You will be asked to press keys to create a custom mapping (under
-    X-Windows) of your keypad keys and function keys so that they can emulate
-    the LK-201 keypad and function keys or the subset of keys found on a 
-    VT-100 series terminal keyboard.  (The LK-201 keyboard is the standard
-    keyboard attached to VT-200 series terminals, and above.)  
+    You will be asked to press keys to create a custom mapping (under a
+    Window Manager) of your keypad keys and function keys so that they can
+    emulate the LK-201 keypad and function keys or the subset of keys found
+    on a VT-100 series terminal keyboard.  (The LK-201 keyboard is the
+    standard keyboard attached to VT-200 series terminals, and above.)
 
     Sometimes, edt-mapper will ignore a key you press, and just continue to
     prompt for the same key.  This can happen when your window manager sucks
-    up the key and doesn't pass it on to emacs, or it could be an emacs bug.
+    up the key and doesn't pass it on to Emacs, or it could be an Emacs bug.
     Either way, there's nothing that edt-mapper can do about it.  You must
     press RETURN, to skip the current key and continue.  Later, you and/or
-    your local X guru can try to figure out why the key is being ignored.
+    your local system guru can try to figure out why the key is being ignored.
 
     Start by pressing the RETURN key, and continue by pressing the keys
-    specified in the mini-buffer.  If you want to entirely omit a key, 
-    because your keyboard does not have a corresponding key, for example, 
+    specified in the mini-buffer.  If you want to entirely omit a key,
+    because your keyboard does not have a corresponding key, for example,
     just press RETURN at the prompt.
 
 ")
+  (insert "
+                                  EDT MAPPER
+
+    You will be asked to press keys to create a custom mapping of your
+    keypad keys and function keys so that they can emulate the LK-201
+    keypad and function keys or the subset of keys found on a VT-100
+    series terminal keyboard.  (The LK-201 keyboard is the standard
+    keyboard attached to VT-200 series terminals, and above.)
+
+    If you are using a real LK-201 keyboard, you should map the keys
+    exactly as they are on the keyboard.
+
+    Start by pressing the RETURN key, and continue by pressing the keys
+    specified in the mini-buffer.  If you want to entirely omit a key,
+    because your keyboard does not have a corresponding key, for example,
+    just press RETURN at the prompt.
+
+"))
+
 (delete-other-windows)
 
 ;;;
-;;;  Save <CR> for future reference
+;;;  Save <CR> for future reference.
+;;;
+;;;  For GNU Emacs, running in a Window System, first hide bindings in
+;;;  function-key-map.
 ;;;
 (cond
- (edt-lucid-emacs19-p
+ ((featurep 'xemacs)
   (setq edt-return-seq (read-key-sequence "Hit carriage-return <CR> to continue "))
   (setq edt-return (concat "[" (format "%s" (event-key (aref edt-return-seq 0))) "]")))
  (t
-  (message "Hit carriage-return <CR> to continue ")
-  (setq edt-return-seq (read-event))
-  (setq edt-return (concat "[" (format "%s" edt-return-seq) "]")))) 
+  (if edt-window-system
+      (progn
+       (setq edt-save-function-key-map function-key-map)
+       (setq function-key-map (make-sparse-keymap))))
+  (setq edt-return (read-key-sequence "Hit carriage-return <CR> to continue "))))
+
+;;;
+;;;  Remove prefix-key bindings to F1 and F2 in global-map so they can be
+;;;  bound in the EDT Emulation mode.
+;;;
+(global-unset-key [f1])
+(global-unset-key [f2])
 
 ;;;
 ;;;   Display Keypad Diagram and Begin Prompting for Keys
 ;;;
 (set-buffer "Directions")
 (delete-region (point-min) (point-max))
-(insert "
-
-
+(if (and edt-window-system (not (eq edt-window-system 'tty)))
+    (insert "
 
           PRESS THE KEY SPECIFIED IN THE MINIBUFFER BELOW.
 
-
-
-
     Here's a picture of the standard LK-201 keypad for reference:
 
           _______________________    _______________________________
                                     |               |       |       |
                                     |_______________|_______|_______|
 
+         REMEMBER:  JUST PRESS RETURN TO SKIP MAPPING A KEY.
+
 ")
+  (progn
+    (insert "
+    GENERATING A CUSTOM CONFIGURATION FILE FOR TERMINAL TYPE:  ")
+    (insert (format "%s." edt-term))
+    (insert "
+
+          PRESS THE KEY SPECIFIED IN THE MINIBUFFER BELOW.
+
+          _______________________    _______________________________
+         | HELP  |      DO       |  |  F17  |  F18  |  F19  |  F20  |
+         |_______|_______________|  |_______|_______|_______|_______|
+          _______________________    _______________________________
+         | FIND  |INSERT |REMOVE |  |  PF1  |  PF2  |  PF3  |  PF4  |
+         |_______|_______|_______|  |_______|_______|_______|_______|
+         |SELECT |PREVIOU| NEXT  |  |  KP7  |  KP8  |  KP9  |  KP-  |
+         |_______|_______|_______|  |_______|_______|_______|_______|
+                 |   UP  |          |  KP4  |  KP5  |  KP6  |  KP,  |
+          _______|_______|_______   |_______|_______|_______|_______|
+         |  LEFT |  DOWN | RIGHT |  |  KP1  |  KP2  |  KP3  |       |
+         |_______|_______|_______|  |_______|_______|_______|  KPE  |
+                                    |      KP0      |  KPP  |       |
+                                    |_______________|_______|_______|
+
+         REMEMBER:  JUST PRESS RETURN TO SKIP MAPPING A KEY.")))
+
 
 ;;;
 ;;;  Key mapping functions
 ;;;
-(defun edt-lucid-map-key (ident descrip func gold-func)
+(defun edt-map-key (ident descrip)
   (interactive)
-  (setq edt-key-seq (read-key-sequence (format "Press %s%s: " ident descrip)))
-  (setq edt-key (concat "[" (format "%s" (event-key (aref edt-key-seq 0))) "]"))
-  (cond ((not (equal edt-key edt-return))
-        (set-buffer "Keys")
-        (insert (format "    (\"%s\" . %s)\n" ident edt-key))
-        (set-buffer "Directions"))
-       ;; bogosity to get next prompt to come up, if the user hits <CR>!
-       ;; check periodically to see if this is still needed...
-       (t
-        (format "%s" edt-key)))
+  (if (featurep 'xemacs)
+      (progn 
+       (setq edt-key-seq (read-key-sequence (format "Press %s%s: " ident descrip)))
+       (setq edt-key (concat "[" (format "%s" (event-key (aref edt-key-seq 0))) "]"))
+       (cond ((not (equal edt-key edt-return))
+              (set-buffer "Keys")
+              (insert (format "    (\"%s\" . %s)\n" ident edt-key))
+              (set-buffer "Directions"))
+             ;; bogosity to get next prompt to come up, if the user hits <CR>!
+             ;; check periodically to see if this is still needed...
+             (t
+              (set-buffer "Keys")
+              (insert (format "    (\"%s\" . \"\" )\n" ident))
+              (set-buffer "Directions"))))
+    (setq edt-key (read-key-sequence (format "Press %s%s: " ident descrip)))
+    (cond ((not (equal edt-key edt-return))
+          (set-buffer "Keys")
+          (insert (if (vectorp edt-key)
+                      (format "    (\"%s\" . %s)\n" ident edt-key)
+                    (format "    (\"%s\" . \"%s\")\n" ident edt-key)))
+          (set-buffer "Directions"))
+         ;; bogosity to get next prompt to come up, if the user hits <CR>!
+         ;; check periodically to see if this is still needed...
+         (t
+          (set-buffer "Keys")
+          (insert (format "    (\"%s\" . \"\" )\n" ident))
+          (set-buffer "Directions"))))
   edt-key)
 
-(defun edt-gnu-map-key (ident descrip)
-  (interactive)
-  (message "Press %s%s: " ident descrip)
-  (setq edt-key-seq (read-event))
-  (setq edt-key (concat "[" (format "%s" edt-key-seq) "]"))
-  (cond ((not (equal edt-key edt-return))
-        (set-buffer "Keys")
-        (insert (format "    (\"%s\" . %s)\n" ident edt-key))
-        (set-buffer "Directions"))
-       ;; bogosity to get next prompt to come up, if the user hits <CR>!
-       ;; check periodically to see if this is still needed...
-       (t
-        (set-buffer "Keys")
-        (insert (format "    (\"%s\" . \"\" )\n" ident))
-        (set-buffer "Directions")))
-  edt-key)
-
-(fset 'edt-map-key (if edt-lucid-emacs19-p 'edt-lucid-map-key 'edt-gnu-map-key))
 (set-buffer "Keys")
 (insert "
 ;;
 (set-buffer "Directions")
 (delete-region (point-min) (point-max))
 (insert "
-                      ADDITIONAL FUNCTION KEYS
-
-    Your keyboard may have additional function keys which do not
-    correspond to any LK-201 keys.  The EDT Emulation can be
-    configured to recognize those keys, since you may wish to add your
-    own key bindings to those keys.
-    
-    For example, suppose your keyboard has a keycap marked \"Line Del\"
-    and you wish to add it to the list of keys which can be customized
-    by the EDT Emulation.  First, assign a unique single-word name to
-    the key for use by the EDT Emulation, let's say \"linedel\", in this
-    example.  Then, at the \"EDT Key Name:\" prompt, enter \"linedel\",
-    followed by a press of the RETURN key.  Finally, when prompted,
-    press the \"Line Del\" key.  You now will be able to bind functions
-    to \"linedel\" and \"Gold-linedel\" in edt-user.el in just the same way
-    you can customize bindings of the standard LK-201 keys.
-
-    When you have no additional function keys to specify, just press
-    RETURN at the \"EDT Key Name:\" prompt.  (If you change your mind
-    AFTER you enter an EDT Key Name and before you press a key at the
-    \"Press\" prompt, you may omit the key by simply pressing RETURN at
-    the prompt.)
+                       ADDITIONAL FUNCTION KEYS
+
+    Your keyboard may have additional function keys which do not correspond
+    to any LK-201 keys.  The EDT Emulation can be configured to recognize
+    those keys, since you may wish to add your own key bindings to those keys.
+
+    For example, suppose your keyboard has a keycap marked \"Line Del\" and
+    you wish to add it to the list of keys which can be customized by the EDT
+    Emulation.  First, assign a unique single-word name to the key for use by
+    the EDT Emulation, for example, \"linedel\".  Then, at the \"EDT Key
+    Name:\" prompt, enter \"linedel\", followed by a press of the RETURN key.
+    Finally, when prompted, press the \"Line Del\" key.  You now will be able
+    to bind functions to \"linedel\" and \"Gold-linedel\" in edt-user.el in
+    just the same way you can customize bindings of the LK-201 function and
+    keypad keys.
+
+    When you are done, just press RETURN at the \"EDT Key Name:\" prompt.
 ")
 (switch-to-buffer "Directions")
 ;;;
 (set-buffer "Keys")
 (insert "\
 ;;
-;;  Extra Keys 
+;;  Extra Keys
 ;;
 ")
+;;;
+;;;  Restore function-key-map.
+;;;
+(if (and edt-window-system (not (featurep 'xemacs)))
+    (setq function-key-map edt-save-function-key-map))
 (setq EDT-key-name "")
-(while (not 
-       (string-equal (setq EDT-key-name (read-string "EDT Key Name: ")) ""))
+(while (not
+        (string-equal (setq EDT-key-name (read-string "EDT Key Name: ")) ""))
   (edt-map-key EDT-key-name ""))
 
 ;
 ")
 
 ;;;
-;;;  Save the key mapping program and blow this pop stand
+;;;  Save the key mapping program
+;;;
+;;;
+;;;  Save the key mapping file
 ;;;
-(let ((file (if edt-lucid-emacs19-p "~/.edt-lucid-keys" "~/.edt-gnu-keys")))
+(let ((file (concat
+            "~/.edt-" (if (featurep 'xemacs) "xemacs" "gnu")
+            (if edt-term (concat "-" edt-term))
+            (if edt-xserver (concat "-" edt-xserver))
+            (if edt-window-system (concat "-" (upcase (symbol-name edt-window-system))))
+            "-keys")))
   (set-visited-file-name
    (read-file-name (format "Save key mapping to file (default %s): " file) nil file)))
 (save-buffer)
 (sit-for 600)
 (kill-emacs t)
 
+;;; arch-tag: 9eea59c8-b8b7-4d66-b858-c8920624c518
 ;;; edt-mapper.el ends here