[comp.sys.sgi] Want a "meta" key for Gnu emacs on 4D's

mecklen%gr.utah.edu@wasatch.utah.edu (Robert Mecklenburg) (05/03/89)

We run Gnu emacs on personal irises and a 4D/140GT.  The editor works well
(although we haven't bothered to compile in job control), but lacks a meta key.
Here's what we've found:

    a.  The keyboard is equipped with a conveniently located "ALT" key, but it
	doesn't just set the eighth bit, it redefines the entire key sequence
	(as documented in "4Sight User's Guide" page GA-5).  Furthermore, the
	eighth bit is zero on the down event and one on the up event.

    b.  Gnu emacs has features to use ANSI style function keys, however this
	does not include any support of the "ALT" key in particular.

    c.  The file "/usr/include/gl/ansicode.h" in conjunction with the "4Sight
	User's Guide" page GA-3 suggests that wsh might have meta key
	translation:

	    /usr/include/gl/ansicode.h:
		#define SGIMKEN 99 /* meta key enable/disable */
		
	But all reasonable control sequences I've tried using this flag/number
	have no effect.

    d.  The NeWs server might be induced to perform meta key translation (as
	suggested by "/usr/NeWs/lib/NeWs/bindkey.ps"), however, to be useful
	you would want to rebind every key on the keyboard (116 of them) and
	the shifted and controled versions as well.  That's a *big* translation
	table.

    e.  Finally, it is certainly possible to extend Gnu with a "smart" get
	character function which could perform the necessary translation, but
	this is even more painful than (d) (but probably more robust and
	faster).

So the question is: Is there any way to get a "real" meta key?

Thanks
Robert Mecklenburg

scotth@sgi.com (Scott Henry) (05/08/89)

mecklen%gr.utah.edu@wasatch.utah.edu (Robert Mecklenburg) requests:

> We run Gnu emacs on personal irises and a 4D/140GT.  The editor works well
> (although we haven't bothered to compile in job control), but lacks a meta key.
> Here's what we've found:
> ... [stuff deleted] ...
> So the question is: Is there any way to get a "real" meta key?

Several months ago, someone (I'm sorry, but I lost the reference) dug deep
into the 4Sight code and figured out how to make the ALT keys into META
keys (and also make the CAPS-LOCK into a CTRL key where it belongs).

The basic instructions are: patch the following diff file against
/usr/NeWS/lib/NeWS/UI.ps, and put it in ~/NeWS (since you don't want to
mess up your real UI.ps, and 4Sight looks in ~/NeWS before
/usr/NeWS/lib/NeWS for loading code). I am also including the entries in
my ~/user.ps which implement the key mappings.

--------------- UI.ps.diff -----------------------------
*** /usr/NeWS/lib/NeWS/UI.ps	Thu Mar  9 16:51:01 1989
--- ~/NeWS/UI.ps	Wed Mar  8 09:39:49 1989
***************
*** 318,326 ****
--- 318,358 ----
  	} ifelse
      } def
  
+ % new code for meta key
+ /MetaDown false def			% true when either alt key is down
+ 
+ {
+     createevent dup begin 		% gobble alt key
+                                         % Do not eat the right ctrl key.
+                                         % We will need it to swap with capslock
+                                         % in user.ps.
+ 	    /Name [28419 28560 28559] def % first one is left ctrl key
+ 	    /Priority 4 def
+ 	    /Exclusivity true def
+ 	end
+     expressinterest
+     {
+ 	awaitevent
+ 	dup /Action get /DownTransition eq
+ 		{/MetaDown true store}     % downtrans -> set  flag
+ 		{/MetaDown false store}	   % uptrans -> clear flag
+ 	ifelse
+     } loop
+ } fork
+ %end new code
+ 
      /deliver_keyboard_to_focus {				% event => -
  	dup dup begin						% ev ev
  	    sgi_translatekey					% ev (string)
+ % new code for meta key
+ 	    dup dup type /stringtype eq		% if there's a string
+ 	    exch length 0 ne and		% of nonzero length
+ 	    MetaDown and			% and meta is down
+ 	    Action /DownTransition eq and	% and ev is a keypress
+ 	    {dup dup 0 get 128 or		% then ior 128 into
+ 	     0 exch put				% the 1st char in the string
+ 	    } if
+ % end new code
  	    /ClientData exch def				% ev
  	end
  	InteractionLock monitorlocked MenuBusy 0 ne or {
----------------- end UI.ps.diff -------------------------

Here are the relevant parts of my ~/user.ps

------------------ ~/user.ps -------------------------
%
% User customization file.
%

%   Earlier, I posted some code to swap the functionality of the Caps Lock
% and left-hand Ctrl key.  I have now written some code to make key
% remapping more flexible.  This code is also better because Caps Lock was
% still Caps Lock for an instant in the old code.  It not does function as
% Caps Lock at all in this code.  If you put the following in your user.ps
% (and take out the stuff I sent out before, if you have it), you can make
% any IRIS key behave as any other.  This will only work under 3.1 however,
% so if you haven't upgraded, you may want to keep the old code until you
% do upgrade.

/replacekeys { % origkeyvals_array changedkeyvals_array -> -
    {
        /changedvals exch def
        /origvals exch def
        /keysdict origvals length dict def
        keysdict begin
            0 1 origvals length 1 sub {
                dup origvals exch get changedvals
                3 2 roll get def
            } for
        end
        createevent dup begin
            /Name origvals def
            /Priority 2 def
            /Exclusivity true def
        end
        expressinterest
        {
            awaitevent dup dup begin
                /Name get keysdict exch get /Name exch def
            end
            redistributeevent
        } loop
    } fork pop pop pop
} def

%
% customizations
%
/RestartActions [ 
    { [ 28420 ] [ 28561 ] replacekeys }
    % other startup actions here
] def

------------------------ end of ~/user.ps -------------------

I have been using these patches for several months on a 4D70G under IRIX
3.1 and 3.1D and now have full Meta-key access to GNUEmacs. This posted
code will map both ALT keys and the left CTRL key to work as Meta-keys,
and maps the CAPS-Lock and right CTRL keys as CTRL keys. Note that you no
longer have a Caps-Lock key after these modifications. (I almost never use
it, so I don't miss it). Note that this modification only works when in
4Sight (since it is done in the NeWS server), and the keyboard has normal
functionality when in NOGRAPHICS mode...

Disclaimer: these are my own modifications to SGI-supplied code based upon
previously posted public domain code. No warranty is expressed or implied.
It works for me!

--
---------------------
              Scott Henry <scotth@sgi.com>
#include <std_disclaimer.h>