Mappings for a Meta-Key.
Keith Gabryelski
ag at portnoy.UUCP
Sat May 7 04:40:35 AEST 1988
After getting Emacs working on our 386 Sco Xenix system I noticed the
alt key was not working. That is, it didn't set bit 7 as a normal
alt-key (meta-key) should. In fact, it apparently didn't do anything
at all. Well, I thought, this just sucks. This must be fixed.
Closer inspection into Sco Xenix documention (RTFM) revealed a very
robust keyboard mapping scheme. Using mapkey(M) and its counter parts
mapstr(M), and mapscrn(M) you (the system administrator) can set your
console keyboard to do most anything. You can also setup keyboard
maps on a per screen basis.
Several keymaps are supplied with your sco xenix system. They are in
the directory /usr/lib/keyboard and are used to remap keyboards for
use in other countries.
Below is the mapkey file I have installed on my system. This map
makes the alt-key a true "Meta-key". I have this mapkey loaded at
boot time from /etc/rc.
A meta key is similar to a control key in that you hold it down and
press another key to get a key not usually available on you keyboard
EXCEPT instead of sending a value from 0x00 (^@) to 0x1F (^_) [the
control characters] the meta key will send a value from 0x80 (~^@)
to 0xFF (~^?) [the meta-characters].
I have included a program called "octopus" which when run will give
you information on the keys sent from the keyboard.
To use the keymap. Place the keymap into a file and type:
mapkey FILENAME
[You might want to sick this file in /usr/lib/keyboard and
remap your keyboard in /etc/rc]
Now, hold down the `alt' key and press 'a'. You should see a letter
'a' with an accent mark over it. You've just sent 0xE1 (meta-a) to
your shell.
Note:
I did something weird with Alt-Shift-Tab. This should give
you a Meta-Backtab (whatever that is) but I replaced it with
Meta-Esc.
Also, Control-Shift-? is a delete (0x7F) so Meta-Control-Shift-?
is 0xFF.
I could of mapped Control-Space to 0x00, but I didn't.
To use octopus. Place the source code in a file called `octopus.c' and
type:
cc -o octopus octopus.c
./octopus
Sample output of octopus follows:
binary oct dec hex asc sym text
01100001 141 97 61 a a Lowercase-Letter-a
01100010 142 98 62 b b Lowercase-Letter-b
01100011 143 99 63 c c Lowercase-Letter-c
01100100 144 100 64 d d Lowercase-Letter-d
00000001 1 1 1 soh ^A Start of Header
00000010 2 2 2 stx ^B Start of Text
00000011 3 3 3 etx ^C End of Text
11100001 341 225 e1 ~a Meta-a
11100010 342 226 e2 ~b Meta-b
11100011 343 227 e3 ~c Meta-c
11100100 344 228 e4 ~d Meta-d
11000001 301 193 c1 ~A Meta-A
11000010 302 194 c2 ~B Meta-B
11000011 303 195 c3 ~C Meta-C
11000100 304 196 c4 ~D Meta-D
10000001 201 129 81 ~^A Meta-Control-A
10000010 202 130 82 ~^B Meta-Control-B
10000011 203 131 83 ~^C Meta-Control-C
10000100 204 132 84 ~^D Meta-Control-D
01111111 177 127 7f ^? Delete
00000000 0 0 0 nul ^@ Null
00000100 4 4 4 eot ^D End of Transmission
Quit (y or n)? Yes.
----- metakeys --------------------- cut me -----------------------------
# alt
# scan cntrl alt alt cntrl lock
# code base shift cntrl shift alt shift cntrl shift state
0 nop nop nop nop nop nop nop nop O
1 esc esc nop nop 0x9b 0x9b nop nop O
2 '1' '!' nop nop 0xb1 0xa1 nop nop O
3 '2' '@' nul nul 0xb2 0xc0 0x80 0x80 O
4 '3' '#' nop nop 0xb3 0xa3 nop nop O
5 '4' '$' nop nop 0xb4 0xa4 nop nop O
6 '5' '%' nop nop 0xb5 0xa5 nop nop O
7 '6' '^' rs rs 0xb6 0xde 0x9e 0x9e O
8 '7' '&' nop nop 0xb7 0xa6 nop nop O
9 '8' '*' nop nop 0xb8 0xaa nop nop O
10 '9' '(' nop nop 0xb9 0xa8 nop nop O
11 '0' ')' nop nop 0xb0 0xa9 nop nop O
12 '-' '_' ns ns 0xad 0xdf 0x9f 0x9f O
13 '=' '+' nop nop 0xbd 0xab nop nop O
14 bs bs del del 0x88 0x88 0xff 0xff O
15 ht btab nop nop 0x89 0x9b nop nop O
16 'q' 'Q' dc1 dc1 0xf1 0xd1 0x91 0x91 C
17 'w' 'W' etb etb 0xf7 0xd7 0x97 0x97 C
18 'e' 'E' enq enq 0xe5 0xc5 0x85 0x85 C
19 'r' 'R' dc2 dc2 0xf2 0xd2 0x92 0x92 C
20 't' 'T' dc4 dc4 0xf4 0xd4 0x94 0x94 C
21 'y' 'Y' em em 0xf9 0xd9 0x99 0x99 C
22 'u' 'U' nak nak 0xf5 0xd5 0x95 0x95 C
23 'i' 'I' ht ht 0xe9 0xc9 0x89 0x89 C
24 'o' 'O' si si 0xef 0xcf 0x8f 0x8f C
25 'p' 'P' dle dle 0xf0 0xd0 0x90 0x90 C
26 '[' '{' esc esc 0xdb 0xfb 0x9b 0x9b O
27 ']' '}' gs gs 0xdd 0xfd 0x9d 0x9d O
28 cr cr nl nl 0x8d 0x8d 0x8a 0x8a O
29 ctrl ctrl ctrl ctrl ctrl ctrl ctrl ctrl O
30 'a' 'A' soh soh 0xe1 0xc1 0x81 0x81 C
31 's' 'S' dc3 dc3 0xf3 0xd3 0x93 0x93 C
32 'd' 'D' eot eot 0xe4 0xc4 0x84 0x84 C
33 'f' 'F' ack ack 0xe6 0xc6 0x86 0x86 C
34 'g' 'G' bel bel 0xe7 0xc7 0x87 0x87 C
35 'h' 'H' bs bs 0xe8 0xc8 0x88 0x88 C
36 'j' 'J' nl nl 0xea 0xca 0x8a 0x8a C
37 'k' 'K' vt vt 0xeb 0xcb 0x8b 0x8b C
38 'l' 'L' np np 0xec 0xcc 0x8c 0x8c C
39 ';' ':' nop nop 0xbb 0xba nop nop O
40 '\'' '"' nop nop 0xa7 0xa2 nop nop O
41 '`' '~' nop nop 0xd0 0xfe nop nop O
42 lshift lshift lshift lshift lshift lshift lshift lshift O
43 '\\' '|' fs fs 0xdc 0x7c 0x9c 0x9c O
44 'z' 'Z' sub sub 0xfa 0xda 0x9a 0x9a C
45 'x' 'X' can can 0xf8 0xd8 0x98 0x98 C
46 'c' 'C' etx etx 0xe3 0xc3 0x83 0x83 C
47 'v' 'V' syn syn 0xf6 0xd6 0x96 0x96 C
48 'b' 'B' stx stx 0xe2 0xc2 0x82 0x82 C
49 'n' 'N' so so 0xee 0xce 0x8e 0x8e C
50 'm' 'M' cr cr 0xed 0xcd 0x8d 0x8d C
51 ',' '<' nop nop 0xac 0xbc nop nop O
52 '.' '>' nop nop 0xae 0xbe nop nop O
53 '/' '?' nop 0x7f 0xaf 0xbf nop 0xff O
54 rshift rshift rshift rshift rshift rshift rshift rshift O
55 '*' '*' nscr nscr '*' '*' nscr nscr O
56 alt alt alt alt alt alt alt alt O
57 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' O
58 clock clock clock clock clock clock clock clock O
59 fkey1 fkey13 fkey25 fkey37 scr1 scr11 scr1 scr11 O
60 fkey2 fkey14 fkey26 fkey38 scr2 scr12 scr2 scr12 O
61 fkey3 fkey15 fkey27 fkey39 scr3 scr13 scr3 scr13 O
62 fkey4 fkey16 fkey28 fkey40 scr4 scr14 scr4 scr14 O
63 fkey5 fkey17 fkey29 fkey41 scr5 scr15 scr5 scr15 O
64 fkey6 fkey18 fkey30 fkey42 scr6 scr16 scr6 scr16 O
65 fkey7 fkey19 fkey31 fkey43 scr7 scr7 scr7 scr7 O
66 fkey8 fkey20 fkey32 fkey44 scr8 scr8 scr8 scr8 O
67 fkey9 fkey21 fkey33 fkey45 scr9 scr9 scr9 scr9 O
68 fkey10 fkey22 fkey34 fkey46 scr10 scr10 scr10 scr10 O
69 nlock nlock dc3 dc3 nlock nlock dc3 dc3 O
70 slock slock del del slock slock del del O
71 fkey49 '7' '7' '7' '7' '7' '7' '7' N
72 fkey50 '8' '8' '8' '8' '8' '8' '8' N
73 fkey51 '9' '9' '9' '9' '9' '9' '9' N
74 fkey52 '-' '-' '-' '-' '-' '-' '-' N
75 fkey53 '4' '4' '4' '4' '4' '4' '4' N
76 fkey54 '5' '5' '5' '5' '5' '5' '5' N
77 fkey55 '6' '6' '6' '6' '6' '6' '6' N
78 fkey56 '+' '+' '+' '+' '+' '+' '+' N
79 fkey57 '1' '1' '1' '1' '1' '1' '1' N
80 fkey58 '2' '2' '2' '2' '2' '2' '2' N
81 fkey59 '3' '3' '3' '3' '3' '3' '3' N
82 fkey60 '0' '0' '0' '0' '0' '0' '0' N
83 del '.' del del del del del del N
84 0xad 0xad nop nop nop nop nop nop O
85 nop nop nop nop nop nop nop nop O
86 nop nop nop nop nop nop nop nop O
87 fkey11 fkey23 fkey35 fkey47 scr11 scr11 scr11 scr11 O
88 fkey12 fkey24 fkey36 fkey48 scr12 scr12 scr12 scr12 O
------------- octopus.c -------- cut me ----------------------
#include <stdio.h>
#include <ctype.h>
#include <termio.h>
static char *cntrlstr[32] =
{
"nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs ", "ht ",
"nl ", "vt ", "np ", "cr ", "so ", "si ", "dle", "dc1", "dc2",
"dc3", "dc4", "nak", "syn", "etb", "can", "em ", "sub", "esc", "fs ",
"gs ", "rs ", "us ",
};
static char *chrstr[256] =
{
"Null", "soh", "stx", "etx", "eot", "enq", "Ackknowledge", "Bell",
"Backspace", "htab", "Newline ", "Verticle Tab ", "np ", "Carriage Return",
"so", "si", "dle", "dc1", "dc2", "dc3", "dc4", "nak",
"syn", "etb", "can", "em", "sub", "Escape", "fs", "gs", "rs", "us",
"Space", "Exclamation-Point",
"Double-Quote", "Octothorpe", "Dollar-Sign", "Percent-Sign",
"Ampersand", "Single-Quote", "Left-Parenthesis",
"Right-Parenthesis", "Asterisk", "Plus-Sign", "Comma", "Dash",
"Period", "Slash", "Number-Zero", "Number-One", "Number-Two",
"Number-Three", "Number-Four", "Number-Five", "Number-Six",
"Number-Seven", "Number-Eight", "Number-Nine", "Colon",
"Semi-Colon", "Left-Broket", "Equality-Sign", "Right-Broket",
"Question-Mark", "At-Sign", "Capital-Letter-A",
"Capital-Letter-B", "Capital-Letter-C", "Capital-Letter-D",
"Capital-Letter-E", "Capital-Letter-F", "Capital-Letter-G",
"Capital-Letter-H", "Capital-Letter-I", "Capital-Letter-J",
"Capital-Letter-K", "Capital-Letter-L", "Capital-Letter-M",
"Capital-Letter-N", "Capital-Letter-O", "Capital-Letter-P",
"Capital-Letter-Q", "Capital-Letter-R", "Capital-Letter-S",
"Capital-Letter-T", "Capital-Letter-U", "Capital-Letter-V",
"Capital-Letter-W", "Capital-Letter-X", "Capital-Letter-Y",
"Capital-Letter-Z", "Left-Square-Bracket", "Backslash",
"Right-Square-Bracket", "Cercumflex", "Underline",
"Back-Single-Quote", "Lowercase-Letter-a", "Lowercase-Letter-b",
"Lowercase-Letter-c", "Lowercase-Letter-d", "Lowercase-Letter-e",
"Lowercase-Letter-f", "Lowercase-Letter-g", "Lowercase-Letter-h",
"Lowercase-Letter-i", "Lowercase-Letter-j", "Lowercase-Letter-k",
"Lowercase-Letter-l", "Lowercase-Letter-m", "Lowercase-Letter-n",
"Lowercase-Letter-o", "Lowercase-Letter-p", "Lowercase-Letter-q",
"Lowercase-Letter-r", "Lowercase-Letter-s", "Lowercase-Letter-t",
"Lowercase-Letter-u", "Lowercase-Letter-v", "Lowercase-Letter-w",
"Lowercase-Letter-x", "Lowercase-Letter-y", "Lowercase-Letter-z",
"Left-Curly-Brace", "Bar", "Right-Curly-Brace", "Tilde", "Delete",
};
main()
{
int c, i;
char buf[9], *bp;
char *meta, *control, *character;
struct termio term, saveterm;
(void) ioctl(0, TCGETA, &term);
saveterm=term;
term.c_iflag &= ~(ICRNL|IXON|IXOFF);
term.c_lflag &= ~(ISIG|ICANON|ECHO);
term.c_cc[VEOF] = 1;
term.c_cc[VEOL] = 0;
(void) ioctl(0, TCSETAW, &term);
buf[8] = '\0';
puts("\n binary oct dec hex asc sym text");
for (;;)
{
c = getchar();
bp = &buf[7];
for (i=0; i < 8; ++i)
*bp-- = ((c>>i)&1)+0x30;
i = c;
printf("%s %3o %3d %3x ", buf, c, c, c);
if (iscntrl(c) && (c != 0x7F))
fputs(cntrlstr[c], stdout);
else
printf(" %c ", c);
putchar(' ');
meta = "";
control = "";
character = " ";
if (!isascii(c))
{
meta = "Meta-";
putchar('~');
c &= 0x7F;
if (iscntrl(c))
{
if (c == 0x7F)
{
character = "Delete";
fputs("^?", stdout);
}
else
{
control = "Control-";
c |= 0x40;
if (isalpha(c))
*character = c;
else
character = chrstr[c];
printf("^%c", c);
}
}
else
{
if (isalpha(c))
*character = c;
else
character = chrstr[c];
printf("%c ", c);
}
}
else
{
if (iscntrl(c))
{
if (c == 0x7F)
{
character = "Delete";
fputs("^?", stdout);
}
else
{
control = "Control-";
c |= 0x40;
printf("^%c ", c);
if (isalpha(c))
*character = c;
else
character = chrstr[c];
}
}
else
{
character = chrstr[c];
printf(" %c ", c);
}
}
printf(" %s%s%s\n", meta, control, character);
if (i == 0x4)
{
fputs("Quit (y or n)? ", stdout);
switch(c = getchar())
{
case 'y':
case 'Y':
puts("Yes.");
(void) ioctl(0, TCSETAW, &saveterm);
exit(0);
default:
puts("No.");
break;
}
}
}
}
--
[ Keith ] UUCP: {ucsd, cbosgd!crash, sdcsvax!crash, nosc!crash}!portnoy!ag
[Gabryelski] INET: ag at portnoy.cts.com ARPA: portnoy!ag at ucsd.arpa
More information about the Comp.unix.xenix
mailing list