Article View: comp.emacs
Article #3215Re: emacs key bindings for the keypad
From: Steve Preston
Date: Wed, 16 Dec 1992 00:13
Date: Wed, 16 Dec 1992 00:13
170 lines
6001 bytes
6001 bytes
>>>>> In article <19735@sunfse.ese.lmsc.lockheed.com>, page@leadse5.UUCP (Dan Page) writes:
> I have been trying furiously to map the keypad of my X terminal to
> emacs functions. Success has been spotty and not satisfactory. Mapping
> of the F1-F12 keys went off without a hitch using the sun-raw-map.
> However, my keypad is set to send a numeric value (or '.', or '-')
> when these keys are hit. So remapping the '5' key on the keypad also
> remaps the '5' key on the keyboard. Further, the PF1-PF4 keys seem to
> be dead when I am in emacs. I have successfully set the keypad to
> application mode when I am in an X window, but this somehow gets reset
> by emacs. I cannot find the equivalent of sun-raw-map that deals with
> the keypad. Calling all large brains to help me with this problem.
The problem is that, when running as an X client, emacs does not check
for "keypad" keysyms when a KeyPress event occurs. It *does* check
for "function key" keysyms (at least on non-AIX machines). There is
thus no way that emacs can know the difference between "keypad 5" and
regular "5".
I patched x11term to remedy this. My emacs will act as if a keypad
key generates ESC O plus an alphabetic character. This is what the
vt100 keypad keys transmit in keypad application mode. Here is the
patch :
------------------------------cut here------------------------------
*** x11term.c.orig Sat Oct 24 00:31:56 1992
--- x11term.c Tue Dec 15 18:51:28 1992
***************
*** 1463,1468 ****
--- 1463,1528 ----
#endif /* sun */
nbytes = strlen(mapping_buf);
}
+ else if (IsKeypadKey(keysym)) {
+ strcpy(mapping_buf,"\033O"); /* ESC - O (aka SS3) */
+ switch (keysym) {
+ case XK_KP_F1:
+ mapping_buf[2]='P';
+ break;
+ case XK_KP_F2:
+ mapping_buf[2]='Q';
+ break;
+ case XK_KP_F3:
+ mapping_buf[2]='R';
+ break;
+ case XK_KP_F4:
+ mapping_buf[2]='S';
+ break;
+ case XK_KP_Subtract:
+ mapping_buf[2]='m';
+ break;
+ case XK_KP_Separator:
+ mapping_buf[2]='l';
+ break;
+ case XK_KP_Enter:
+ mapping_buf[2]='e';
+ break;
+ case XK_KP_Decimal:
+ mapping_buf[2]='n';
+ break;
+ case XK_KP_0:
+ mapping_buf[2]='p';
+ break;
+ case XK_KP_1:
+ mapping_buf[2]='q';
+ break;
+ case XK_KP_2:
+ mapping_buf[2]='r';
+ break;
+ case XK_KP_3:
+ mapping_buf[2]='s';
+ break;
+ case XK_KP_4:
+ mapping_buf[2]='t';
+ break;
+ case XK_KP_5:
+ mapping_buf[2]='u';
+ break;
+ case XK_KP_6:
+ mapping_buf[2]='v';
+ break;
+ case XK_KP_7:
+ mapping_buf[2]='w';
+ break;
+ case XK_KP_8:
+ mapping_buf[2]='x';
+ break;
+ case XK_KP_9:
+ mapping_buf[2]='y';
+ break;
+ }
+ nbytes = 3;
+ }
else {
#endif /* not AIX */
switch (keysym) {
------------------------------cut here------------------------------
And here are the relavent lines in my .emacs file
(setq load-path (cons "/usr/local/emacs/emacs-lisp" load-path))
(setq term-setup-hook
(function
(lambda ()
(if (eq window-system 'x)
(progn (define-key mouse-map x-button-left 'x-mouse-ignore)
(define-key mouse-map x-button-middle 'x-mouse-set-point)
(define-key mouse-map x-button-right 'x-mouse-set-mark)
(load "term/x11.el")
)))))
(define-key function-keymap "8" 'scroll-one-line-down)
(define-key function-keymap "2" 'scroll-one-line-up)
(define-key function-keymap "5" 'goto-line)
(define-key function-keymap "3" 'forward-page-top)
(define-key function-keymap "9" 'backward-page-top)
(define-key function-keymap "7" 'top-of-window)
(define-key function-keymap "4" 'middle-of-window)
(define-key function-keymap "1" 'bottom-of-window)
The file x11.el to be loaded is just a cut-and-paste from vt100.el;
it should have the GPL header, like all the other FSF .el files. I
put it into /usr/local/emacs/emacs-lisp/term/x11.el.
------------------------------x11.el------------------------------
;; Map VT100 function key escape sequences
;; into the standard slots in function-keymap.
(require 'keypad)
(defvar SS3-map nil
"SS3-map maps the SS3 function keys on the VT100 keyboard.
The SS3 keys are the numeric keypad keys in keypad application mode
\(DECKPAM). SS3 is DEC's name for the sequence <ESC>O which is
the common prefix of what these keys transmit.")
(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
'(("A" . ?u) ; up arrow
("B" . ?d) ; down-arrow
("C" . ?r) ; right-arrow
("D" . ?l) ; left-arrow
("M" . ?e) ; Enter
("P" . ?\C-a) ; PF1
("Q" . ?\C-b) ; PF2
("R" . ?\C-c) ; PF3
("S" . ?\C-d) ; PF4
("l" . ?,) ; ,
("m" . ?-) ; -
("n" . ?.) ; .
("p" . ?0) ; 0
("q" . ?1) ; 1
("r" . ?2) ; 2
("s" . ?3) ; 3
("t" . ?4) ; 4
("u" . ?5) ; 5
("v" . ?6) ; 6
("w" . ?7) ; 7
("x" . ?8) ; 8
("y" . ?9))) ; 9
(define-key global-map "\eO" SS3-map)))
(global-set-key "\e[" nil) ; so function keys can be remapped.
------------------------end of x11.el------------------------------
--
--
Steve Preston (spreston@gte.com)
Technical Details
Message-ID:
<STEVE.92Dec15191333@eowyn.gte.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!noc.near.net!ceylon!steveReferences:
<19735@sunfse.ese.lmsc.lockheed.com>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!noc.near.net!ceylon!steve From: steve@eowyn.gte.com (Steve Preston) Newsgroups: comp.emacs Subject: Re: emacs key bindings for the keypad Message-ID: <STEVE.92Dec15191333@eowyn.gte.com> Date: 16 Dec 92 00:13:33 GMT References: <19735@sunfse.ese.lmsc.lockheed.com> Sender: news@ceylon.gte.com Organization: GTE Laboratories Lines: 170 In-reply-to: page@leadse5.UUCP's message of 11 Dec 92 01:44:29 GMT