1 ;;; edt-mapper.el --- Create an EDT LK-201 Map File for X-Windows Emacs.
5 ;; Copyright (C) 1994 Free Software Foundation, Inc.
7 ;; Author: Kevin Gallagher <kgallagh@spd.dsccc.com>
8 ;; Maintainer: Kevin Gallagher <kgallagh@spd.dsccc.com>
9 ;; Keywords: emulations
11 ;; This file is part of GNU Emacs.
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
14 ;; it under the terms of the GNU General Public License as published by
15 ;; the Free Software Foundation; either version 2, or (at your option)
18 ;; GNU Emacs is distributed in the hope that it will be useful,
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;; GNU General Public License for more details.
23 ;; You should have received a copy of the GNU General Public License
24 ;; along with GNU Emacs; see the file COPYING. If not, write to
25 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
29 ;; This emacs lisp program can be used to create an emacs lisp file
30 ;; that defines the mapping of the user's keyboard under X-Windows to
31 ;; the LK-201 keyboard function keys and keypad keys (around which
32 ;; EDT has been designed). Please read the "Usage" AND "Known
33 ;; Problems" sections before attempting to run this program. (The
34 ;; design of this file, edt-mapper.el, was heavily influenced by
39 ;; Simply load this file into the X-Windows version of emacs (version 19)
40 ;; using the following command.
42 ;; emacs -q -l edt-mapper.el
44 ;; The "-q" option prevents loading of your .emacs file (commands therein
45 ;; might confuse this program).
47 ;; An instruction screen showing the typical LK-201 terminal functions keys
48 ;; will be displayed, and you will be prompted to press the keys on your
49 ;; keyboard which you want to emulate the corresponding LK-201 keys.
51 ;; Finally, you will be prompted for the name of the file to store
52 ;; the key definitions. If you chose the default, it will be found
53 ;; and loaded automatically when the EDT emulation is started. If
54 ;; you specify a different file name, you will need to set the
55 ;; variable "edt-xkeys-file" before starting the EDT emulation.
56 ;; Here's how you might go about doing that in your .emacs file.
58 ;; (setq edt-xkeys-file (expand-file-name "~/.my-emacs-x-keys"))
62 ;; Sometimes, edt-mapper will ignore a key you press, and just continue to
63 ;; prompt for the same key. This can happen when your window manager sucks
64 ;; up the key and doesn't pass it on to emacs, or it could be an emacs bug.
65 ;; Either way, there's nothing that edt-mapper can do about it. You must
66 ;; press RETURN, to skip the current key and continue. Later, you and/or
67 ;; your local X guru can try to figure out why the key is being ignored.
69 ;; ====================================================================
72 ;;; Revision Information
74 (defconst edt-mapper-revision
"$Revision: 1.1 $"
75 "Revision Number of EDT X-Windows Emacs Key Mapper.")
79 ;;; Make sure we're running X-windows and Emacs version 19
82 ((not (and window-system
(not (string-lessp emacs-version
"19"))))
85 Whoa! This isn't going to work...
87 You must run edt-mapper.el under X-windows and Emacs version 19.
89 Press any key to exit. ")
95 ;;; Decide whether we're running GNU or Lucid emacs.
97 (defconst edt-lucid-emacs19-p
(string-match "Lucid" emacs-version
)
98 "Non-NIL if we are running Lucid Emacs version 19.")
105 (defvar edt-enter nil
)
106 (defvar edt-return nil
)
107 (defvar edt-key-seq nil
)
108 (defvar edt-enter-seq nil
)
109 (defvar edt-return-seq nil
)
113 ;;; Make sure the window is big enough to display the instructions
115 (if edt-lucid-emacs19-p
(set-screen-size nil
80 36)
116 (set-frame-size (selected-frame) 80 36))
120 ;;; Create buffers - Directions and Keys
122 (if (not (get-buffer "Directions")) (generate-new-buffer "Directions"))
123 (if (not (get-buffer "Keys")) (generate-new-buffer "Keys"))
126 ;;; Put header in the Keys buffer
131 ;; Key definitions for the EDT emulation within GNU Emacs
139 ;;; Display directions
141 (switch-to-buffer "Directions")
145 You will be asked to press keys to create a custom mapping (under
146 X-Windows) of your keypad keys and function keys so that they can emulate
147 the LK-201 keypad and function keys or the subset of keys found on a
148 VT-100 series terminal keyboard. (The LK-201 keyboard is the standard
149 keyboard attached to VT-200 series terminals, and above.)
151 Sometimes, edt-mapper will ignore a key you press, and just continue to
152 prompt for the same key. This can happen when your window manager sucks
153 up the key and doesn't pass it on to emacs, or it could be an emacs bug.
154 Either way, there's nothing that edt-mapper can do about it. You must
155 press RETURN, to skip the current key and continue. Later, you and/or
156 your local X guru can try to figure out why the key is being ignored.
158 Start by pressing the RETURN key, and continue by pressing the keys
159 specified in the mini-buffer. If you want to entirely omit a key,
160 because your keyboard does not have a corresponding key, for example,
161 just press RETURN at the prompt.
164 (delete-other-windows)
167 ;;; Save <CR> for future reference
171 (setq edt-return-seq
(read-key-sequence "Hit carriage-return <CR> to continue "))
172 (setq edt-return
(concat "[" (format "%s" (event-key (aref edt-return-seq
0))) "]")))
174 (message "Hit carriage-return <CR> to continue ")
175 (setq edt-return-seq
(read-event))
176 (setq edt-return
(concat "[" (format "%s" edt-return-seq
) "]"))))
179 ;;; Display Keypad Diagram and Begin Prompting for Keys
181 (set-buffer "Directions")
182 (delete-region (point-min) (point-max))
187 PRESS THE KEY SPECIFIED IN THE MINIBUFFER BELOW.
192 Here's a picture of the standard LK-201 keypad for reference:
194 _______________________ _______________________________
195 | HELP | DO | | F17 | F18 | F19 | F20 |
197 |_______|_______________| |_______|_______|_______|_______|
198 _______________________ _______________________________
199 | FIND |INSERT |REMOVE | | PF1 | PF2 | PF3 | PF4 |
201 |_______|_______|_______| |_______|_______|_______|_______|
202 |SELECT |PREVIOU| NEXT | | KP7 | KP8 | KP9 | KP- |
204 |_______|_______|_______| |_______|_______|_______|_______|
205 | UP | | KP4 | KP5 | KP6 | KP, |
207 _______|_______|_______ |_______|_______|_______|_______|
208 | LEFT | DOWN | RIGHT | | KP1 | KP2 | KP3 | |
210 |_______|_______|_______| |_______|_______|_______| KPE |
213 |_______________|_______|_______|
218 ;;; Key mapping functions
220 (defun edt-lucid-map-key (ident descrip func gold-func
)
222 (setq edt-key-seq
(read-key-sequence (format "Press %s%s: " ident descrip
)))
223 (setq edt-key
(concat "[" (format "%s" (event-key (aref edt-key-seq
0))) "]"))
224 (cond ((not (equal edt-key edt-return
))
226 (insert (format " (\"%s\" . %s)\n" ident edt-key
))
227 (set-buffer "Directions"))
228 ;; bogosity to get next prompt to come up, if the user hits <CR>!
229 ;; check periodically to see if this is still needed...
231 (format "%s" edt-key
)))
234 (defun edt-gnu-map-key (ident descrip
)
236 (message "Press %s%s: " ident descrip
)
237 (setq edt-key-seq
(read-event))
238 (setq edt-key
(concat "[" (format "%s" edt-key-seq
) "]"))
239 (cond ((not (equal edt-key edt-return
))
241 (insert (format " (\"%s\" . %s)\n" ident edt-key
))
242 (set-buffer "Directions"))
243 ;; bogosity to get next prompt to come up, if the user hits <CR>!
244 ;; check periodically to see if this is still needed...
247 (insert (format " (\"%s\" . \"\" )\n" ident
))
248 (set-buffer "Directions")))
251 (fset 'edt-map-key
(if edt-lucid-emacs19-p
'edt-lucid-map-key
'edt-gnu-map-key
))
258 (set-buffer "Directions")
260 (edt-map-key "UP" " - The Up Arrow Key")
261 (edt-map-key "DOWN" " - The Down Arrow Key")
262 (edt-map-key "LEFT" " - The Left Arrow Key")
263 (edt-map-key "RIGHT" " - The Right Arrow Key")
272 (set-buffer "Directions")
274 (edt-map-key "PF1" " - The PF1 (GOLD) Key")
275 (edt-map-key "PF2" " - The Keypad PF2 Key")
276 (edt-map-key "PF3" " - The Keypad PF3 Key")
277 (edt-map-key "PF4" " - The Keypad PF4 Key")
282 ;; KP0-9 KP- KP, KPP and KPE
285 (set-buffer "Directions")
287 (edt-map-key "KP0" " - The Keypad 0 Key")
288 (edt-map-key "KP1" " - The Keypad 1 Key")
289 (edt-map-key "KP2" " - The Keypad 2 Key")
290 (edt-map-key "KP3" " - The Keypad 3 Key")
291 (edt-map-key "KP4" " - The Keypad 4 Key")
292 (edt-map-key "KP5" " - The Keypad 5 Key")
293 (edt-map-key "KP6" " - The Keypad 6 Key")
294 (edt-map-key "KP7" " - The Keypad 7 Key")
295 (edt-map-key "KP8" " - The Keypad 8 Key")
296 (edt-map-key "KP9" " - The Keypad 9 Key")
297 (edt-map-key "KP-" " - The Keypad - Key")
298 (edt-map-key "KP," " - The Keypad , Key")
299 (edt-map-key "KPP" " - The Keypad . Key")
300 (edt-map-key "KPE" " - The Keypad Enter Key")
301 ;; Save the enter key
302 (setq edt-enter edt-key
)
303 (setq edt-enter-seq edt-key-seq
)
309 ;; Editing keypad (FIND, INSERT, REMOVE)
310 ;; (SELECT, PREVIOUS, NEXT)
313 (set-buffer "Directions")
315 (edt-map-key "FIND" " - The Find key on the editing keypad")
316 (edt-map-key "INSERT" " - The Insert key on the editing keypad")
317 (edt-map-key "REMOVE" " - The Remove key on the editing keypad")
318 (edt-map-key "SELECT" " - The Select key on the editing keypad")
319 (edt-map-key "PREVIOUS" " - The Prev Scr key on the editing keypad")
320 (edt-map-key "NEXT" " - The Next Scr key on the editing keypad")
325 ;; F1-14 Help Do F17-F20
328 (set-buffer "Directions")
330 (edt-map-key "F1" " - F1 Function Key")
331 (edt-map-key "F2" " - F2 Function Key")
332 (edt-map-key "F3" " - F3 Function Key")
333 (edt-map-key "F4" " - F4 Function Key")
334 (edt-map-key "F5" " - F5 Function Key")
335 (edt-map-key "F6" " - F6 Function Key")
336 (edt-map-key "F7" " - F7 Function Key")
337 (edt-map-key "F8" " - F8 Function Key")
338 (edt-map-key "F9" " - F9 Function Key")
339 (edt-map-key "F10" " - F10 Function Key")
340 (edt-map-key "F11" " - F11 Function Key")
341 (edt-map-key "F12" " - F12 Function Key")
342 (edt-map-key "F13" " - F13 Function Key")
343 (edt-map-key "F14" " - F14 Function Key")
344 (edt-map-key "HELP" " - HELP Function Key")
345 (edt-map-key "DO" " - DO Function Key")
346 (edt-map-key "F17" " - F17 Function Key")
347 (edt-map-key "F18" " - F18 Function Key")
348 (edt-map-key "F19" " - F19 Function Key")
349 (edt-map-key "F20" " - F20 Function Key")
351 (set-buffer "Directions")
352 (delete-region (point-min) (point-max))
354 ADDITIONAL FUNCTION KEYS
356 Your keyboard may have additional function keys which do not
357 correspond to any LK-201 keys. The EDT Emulation can be
358 configured to recognize those keys, since you may wish to add your
359 own key bindings to those keys.
361 For example, suppose your keyboard has a keycap marked \"Line Del\"
362 and you wish to add it to the list of keys which can be customized
363 by the EDT Emulation. First, assign a unique single-word name to
364 the key for use by the EDT Emulation, let's say \"linedel\", in this
365 example. Then, at the \"EDT Key Name:\" prompt, enter \"linedel\",
366 followed by a press of the RETURN key. Finally, when prompted,
367 press the \"Line Del\" key. You now will be able to bind functions
368 to \"linedel\" and \"Gold-linedel\" in edt-user.el in just the same way
369 you can customize bindings of the standard LK-201 keys.
371 When you have no additional function keys to specify, just press
372 RETURN at the \"EDT Key Name:\" prompt. (If you change your mind
373 AFTER you enter an EDT Key Name and before you press a key at the
374 \"Press\" prompt, you may omit the key by simply pressing RETURN at
377 (switch-to-buffer "Directions")
379 ;;; Add support for extras keys
387 (setq EDT-key-name
"")
389 (string-equal (setq EDT-key-name
(read-string "EDT Key Name: ")) ""))
390 (edt-map-key EDT-key-name
""))
393 ; No more keys to add, so wrap up.
402 ;;; Save the key mapping program and blow this pop stand
404 (let ((file (if edt-lucid-emacs19-p
"~/.edt-lucid-keys" "~/.edt-gnu-keys")))
405 (set-visited-file-name
406 (read-file-name (format "Save key mapping to file (default %s): " file
) nil file
)))
409 (message "That's it! Press any key to exit")
413 ;;; edt-mapper.el ends here