with Access_List;
with Ada;
with Command;
with Common;
with Compilation;
with Cmvc;
with Daemon;
with Debug;
with Editor;
with File_Utilities;
with Job;
with Library;
with Operator;
with Queue;
with Text;
with Visible_Key_Names;
with What;

procedure Rt_Commands is

    -- Release D_9_0_0, last updated 2/3/87

    use Visible_Key_Names;

    type Intent is (Prompt, Execute, Interrupt);

    Action : Intent;

    Key_1 : Rational_Key_Names;
    Key_2 : Rational_Key_Names;

    -- Interrupt and Prompt are first because they are shorter and can be moved
    -- around very easily.  Each of the keys is replicated in comments in the
    -- main Execute case statement.

begin
    case Action is
        when Interrupt =>
            case Key_1 is

                when C_G | Cs_G =>
                    Job.Interrupt;

                when M_G | Ms_G =>
                    Job.Kill (0);

                when Cm_F6 =>
                    Debug.Stop (Name => "");

                when F19 =>
                    Job.Disable (0);
                when C_F19 =>
                    Job.Kill (0);
                when others =>
                    null;
            end case;

        when Prompt =>

            case Key_1 is
                when Cm_F9 =>
                    Debug.Modify (New_Value => "",
                                  Variable => "<SELECTION>",
                                  Stack_Frame => 0);
                when M_F15 =>
                    Library.Create_Directory (Name => "");
                when Cm_F15 =>
                    Text.Create (Image_Name => "");
                when Cs_F15 =>
                    Library.Create_World (Name => "");

                when Object =>
                    case Key_2 is
                        when 'l' | 'L' =>
                            Common.Revert;
                        when others =>
                            null;
                    end case;

                when others =>
                    null;
            end case;

        when Execute =>
            case Key_1 is
                when Promot =>
                    Common.Promote;
                when C_Promot =>
                    Command.Spawn;
                when M_Promot =>
                    Command.Debug;
                when Complt =>
                    Common.Complete;
                when Format =>
                    Common.Format;

                when C_A | Cs_A =>
                    Editor.Line.Beginning_Of;
                when C_B | Cs_B =>
                    Editor.Cursor.Backward;
                when C_C | Cs_C =>
                    Editor.Hold_Stack.Push;
                when C_D | Cs_D =>
                    Editor.Char.Delete_Forward;
                when C_E | Cs_E =>
                    Editor.Line.End_Of;
                when C_F | Cs_F =>
                    Editor.Cursor.Forward;
--           -- when C_G | Cs_G => Job.Interrupt; -- Interrupt
                when C_H | Cs_H =>
                    Editor.Cursor.Left;
                when C_I | Cs_I =>
                    Editor.Line.Insert (-1);
                when C_J | Cs_J =>
                    Editor.Cursor.Right;
                when C_K | Cs_K =>
                    Editor.Line.Delete_Forward;
                when C_L | Cs_L =>
                    Editor.Screen.Redraw;
                when C_M | Cs_M =>
                    Editor.Mark.Push;
                when C_N | Cs_N =>
                    Editor.Cursor.Down;
                when C_O | Cs_O =>
                    Editor.Line.Open;
                when C_Q | Cs_Q =>
                    Editor.Key.Name;
                when C_R =>
                    Editor.Search.Previous;
                when Cs_R =>
                    Editor.Search.Previous (Wildcard => True);
                when C_S =>
                    Editor.Search.Next;
                when Cs_S =>
                    Editor.Search.Next (Wildcard => True);
                when C_T | Cs_T =>
                    Editor.Char.Transpose;
                when C_U | Cs_U =>
                    Editor.Cursor.Up;
                when C_V | Cs_V =>
                    Editor.Image.Down;
                when C_X | Cs_X =>
                    Editor.Set.Designation_Off;
                when C_Y | Cs_Y =>
                    Editor.Hold_Stack.Top;
                when C_Z | Cs_Z =>
                    Editor.Image.Up;

                when C_Left_Bracket | C_Left_Brace =>
                    Editor.Region.Start;
                when C_Right_Bracket | C_Right_Brace =>
                    Editor.Region.Finish;

                when C_Exclam | C_1 =>
                    Common.Expand;
                when C_Query | C_Slash =>
                    Common.Explain;
                when C_Quote | C_Tick | Cs_Tick =>
                    Editor.Char.Quote;
                when C_Left_Paren | C_9 =>
                    Editor.Char.Insert_String ("(""");
                when C_Right_Paren | C_0 =>
                    Editor.Char.Insert_String (""")");
                when C_Colon | C_Semicolon =>
                    Editor.Char.Insert_String (":=");
                when C_Plus | C_Equal =>
                    Editor.Char.Insert_String ("=>");


                when C_Circumflex | C_6 =>
                    Editor.Char.Capitalize;
                when C_Greater_Than | C_Period =>
                    Editor.Char.Upper_Case;
                when C_Less_Than | C_Comma =>
                    Editor.Char.Lower_Case;

                when M_A | Ms_A | M_B | Ms_B =>
                    Editor.Word.Beginning_Of;
                when M_C | Ms_C =>
                    Editor.Hold_Stack.Next;
                when M_D | Ms_D =>
                    Editor.Word.Delete;
                when M_E | Ms_E =>
                    Editor.Word.End_Of;
--           -- when M_G | Ms_G => Job,Kill (0); -- Interrupt
                when M_H | Ms_H =>
                    Editor.Word.Previous;
                when M_J | Ms_J =>
                    Editor.Word.Next;
                when M_K | Ms_K =>
                    Editor.Word.Delete_Forward;
                when M_L | Ms_L =>
                    Editor.Screen.Clear;
                when M_M | Ms_M =>
                    Editor.Mark.Next;
                when M_N | Ms_N =>
                    Editor.Cursor.Next (Prompt => True, Underline => True);
                when M_O | Ms_O =>
                    Editor.Line.Join;
                when M_Q | Ms_Q =>
                    Editor.Key.Prompt;

--              -- For search, Meta         => Search/Replace,
--              --             Shift        => Wildcard
--              --             Control_Meta => Global Replace
                when M_R =>
                    Editor.Search.Replace_Previous;
                when Ms_R =>
                    Editor.Search.Replace_Previous (Wildcard => True);
                when M_S =>
                    Editor.Search.Replace_Next;
                when Ms_S =>
                    Editor.Search.Replace_Next (Wildcard => True);
                when Cm_R =>
                    Editor.Search.Replace_Previous (Repeat => -1);
                when Cms_R =>
                    Editor.Search.Replace_Previous
                       (Wildcard => True, Repeat => -1);
                when Cm_S =>
                    Editor.Search.Replace_Next (Repeat => -1);
                when Cms_S =>
                    Editor.Search.Replace_Next (Wildcard => True, Repeat => -1);

                when M_T | Ms_T =>
                    Editor.Word.Transpose;
                when M_U | Ms_U =>
                    Editor.Cursor.Previous;
                when M_V | Ms_V =>
                    Editor.Window.Next;
                when M_X | Ms_X =>
                    Editor.Macro.Execute;
                when M_Y | Ms_Y =>
                    Editor.Hold_Stack.Next;
                when M_Z | Ms_Z =>
                    Editor.Window.Previous;

                when M_Circumflex | M_6 =>
                    Editor.Word.Capitalize;
                when M_Greater_Than | M_Period =>
                    Editor.Word.Upper_Case;
                when M_Less_Than | M_Comma =>
                    Editor.Word.Lower_Case;
                when M_Left_Bracket | M_Left_Brace =>
                    Editor.Macro.Start;
                when M_Right_Bracket | M_Right_Brace =>
                    Editor.Macro.Finish;

                when Cm_A | Cms_A | Cm_B | Cms_B =>
                    Editor.Line.Beginning_Of;
                when Cm_C | Cms_C =>
                    Editor.Line.Copy;
                when Cm_D | Cms_D =>
                    Editor.Line.Delete;
                when Cm_E | Cms_E =>
                    Editor.Line.End_Of;
                when Cm_F | Cms_F =>
                    Editor.Cursor.Right (8);
                when Cm_H | Cms_H =>
                    Editor.Cursor.Left (8);
                when Cm_I | Cms_I =>
                    Ada.Insert_Blank_Line;
                when Cm_J | Cms_J =>
                    Editor.Cursor.Right (8);
                when Cm_K | Cms_K =>
                    Ada.Delete_Blank_Line;
                when Cm_N | Cms_N =>
                    Editor.Cursor.Down (8);
                when Cm_O | Cms_O =>
                    Editor.Line.Join;
                when Cm_T | Cms_T =>
                    Editor.Line.Transpose;
                when Cm_U | Cms_U =>
                    Editor.Cursor.Up (8);

                when Cm_Circumflex | Cm_6 =>
                    Editor.Line.Capitalize;
                when Cm_Greater_Than | Cm_Period =>
                    Editor.Line.Upper_Case;
                when Cm_Less_Than | Cm_Comma =>
                    Editor.Line.Lower_Case;

                when Delete =>
                    Editor.Char.Delete_Backward;
                when C_Delete | Cs_Delete =>
                    Editor.Char.Delete_Spaces;
                when M_Delete | Ms_Delete =>
                    Editor.Word.Delete_Backward;
                when Cm_Delete | Cms_Delete =>
                    Editor.Line.Delete_Backward;

                when Tab | S_Tab =>
                    Editor.Char.Tab_Forward;
                when C_Tab | Cs_Tab =>
                    Editor.Char.Tab_Backward;
                when M_Tab | Ms_Tab =>
                    Editor.Char.Tab_To_Comment;
                when Cm_Tab | Cms_Tab =>
                    What.Tabs;

                when S_Space | C_Space | M_Space | Cm_Space |
                     Cs_Space | Ms_Space | Cms_Space =>
                    Editor.Char.Insert_Character (1, ' ');

                when Carriage_Return =>
                    Editor.Line.Indent;
                when S_Carriage_Return =>
                    Editor.Line.Insert;
                when C_Carriage_Return | Cs_Carriage_Return | Enter | S_Enter =>
                    Common.Commit;
                when M_Carriage_Return | Ms_Carriage_Return |
                     M_Enter | Ms_Enter =>
                    Command.Debug;

--           -- F1 - F5 intentionally left unused
--           -- F6 - F9 Debugger keys

--           -- F6 -- Debugger execution control
                when F6 =>
                    Debug.Run;
                when S_F6 =>
                    Debug.Execute;
                when C_F6 =>
                    Debug.Run (Stop_At => Debug.Local_Statement);
                when M_F6 =>
                    Debug.Run (Debug.Returned);
--           -- when Cm_F6 => Debug.Stop; -- Interrupts
                when Cms_F6 =>
                    Debug.Task_Display;

--           -- F7 -- Debugger source and breakpoints
                when F7 =>
                    Debug.Source (Location => "", Stack_Frame => 0);
                when S_F7 =>
                    Debug.Break (Default_Lifetime => False);
                when C_F7 =>
                    Debug.Break;
                when M_F7 =>
                    Debug.Activate (Breakpoint => 0);
                when Cm_F7 =>
                    Debug.Remove (Breakpoint => 0);
                when Cms_F7 =>
                    Debug.Show;

--           -- F8 -- Debugger stack and exceptions
                when F8 =>
                    Debug.Stack;
                when S_F8 =>
                    Debug.Forget;
                when C_F8 =>
                    Debug.Catch;
                when M_F8 =>
                    Debug.Propagate;
                when Cm_F8 =>
                    Debug.Show (Debug.Exceptions);
                when Cms_F8 =>
                    Debug.Information (Debug.Rendezvous);

--           -- F9 -- Debugger put/modify and detail control
                when F9 =>
                    Debug.Put;
                when C_F9 =>
                    Debug.Set_Value
                       (Variable => Debug.Element_Count, To_Value => 5);
                when S_F9 =>
                    Debug.Set_Value
                       (Variable => Debug.First_Element, To_Value => 0);
                when M_F9 =>
                    Debug.Set_Value
                       (Variable => Debug.Pointer_Level, To_Value => 5);
--           -- when Cm_F9 => Debug.Modify; -- Prompt
                when Cms_F9 =>
                    Debug.Current_Debugger ("");

--           -- F10 -- Traversal - Definition, Enclosing, Other part, etc.
--           --        Shift => In_Place
                when F10 =>
                    Common.Definition
                       (Name => "<CURSOR>", In_Place => False, Visible => True);
                when S_F10 =>
                    Common.Definition
                       (Name => "<CURSOR>", In_Place => True, Visible => True);
                when C_F10 =>
                    Ada.Other_Part (Name => "<IMAGE>", In_Place => False);
                when Cs_F10 =>
                    Ada.Other_Part (Name => "<IMAGE>", In_Place => True);
                when M_F10 =>
                    Common.Enclosing;
                when Ms_F10 =>
                    Common.Enclosing (In_Place => True, Library => False);
                when Cms_F10 =>
                    Common.Enclosing (In_Place => True, Library => True);
                when Cm_F10 =>
                    What.Home_Library;

--           -- F11 -- Help and Print
                when F11 =>
                    What.Does ("");
                when S_F11 =>
                    What.Does ("Help_on_Help");
                when M_F11 =>
                    Editor.Key.Name;
                when C_F11 =>
                    Editor.Image.Find ("Help Window");
                when Cm_F11 =>
                    Queue.Print (Options => "width => 132");

--           -- F12 -- Prompt
                when F12 =>
                    Editor.Key.Prompt (Key_Code => "");
                when C_F12 =>
                    Cmvc.Check_Out (What_Object => "<CURSOR>",
                                    Comments => "",
                                    Allow_Demotion => False,
                                    Allow_Implicit_Accept_Changes => True,
                                    Expected_Check_In_Time => "<TOMORROW>",
                                    Work_Order => "<DEFAULT>",
                                    Response => "<PROFILE>");

                when M_F12 =>
                    Cmvc.Check_In (What_Object => "<CURSOR>",
                                   Comments => "",
                                   Work_Order => "<DEFAULT>",
                                   Response => "<PROFILE>");
                when Cm_F12 =>
                    Cmvc.Accept_Changes (Destination => "<CURSOR>",
                                         Source => "<LATEST>",
                                         Allow_Demotion => False,
                                         Comments => "",
                                         Work_Order => "<DEFAULT>",
                                         Response => "<PROFILE>");
                when Cs_F12 =>
                    Cmvc.Show (Objects => "<CURSOR>", Response => "<PROFILE>");
                when Cms_F12 =>
                    Cmvc.Show_Checked_Out_In_View
                       (In_View => "<CURSOR>", Response => "<PROFILE>");
                when Ms_F12 =>
                    Cmvc.Show_Checked_Out_By_User
                       (In_View => "<CURSOR>", Response => "<PROFILE>");
                when S_F12 =>
                    Cmvc.Show_Out_Of_Date_Objects
                       (In_View => "<CURSOR>", Response => "<PROFILE>");


--           -- F13 -- Ada promotion
--           --        Control => Coded
--           --        Meta    => Closure, i.e. Compilation
                when F13 =>
                    Ada.Install_Unit;
                when S_F13 =>
                    Ada.Install_Stub;
                when C_F13 =>
                    Ada.Code_Unit;
                when M_F13 =>
                    Compilation.Promote (Unit => "<Image>",
                                         Scope => Compilation.All_Parts,
                                         Goal => Compilation.Installed,
                                         Limit => "<WORLDS>",
                                         Effort_Only => False,
                                         Response => "<PROFILE>");
                when Cm_F13 =>
                    Compilation.Make (Unit => "<IMAGE>",
                                      Scope => Compilation.All_Parts,
                                      Goal => Compilation.Coded,
                                      Limit => "<WORLDS>",
                                      Effort_Only => False,
                                      Response => "<PROFILE>");
                when Ms_F13 =>
                    Compilation.Promote (Unit => "<IMAGE>",
                                         Scope => Compilation.All_Parts,
                                         Goal => Compilation.Installed,
                                         Limit => "<ALL_WORLDS>",
                                         Effort_Only => False,
                                         Response => "<PROFILE>");

                when Cms_F13 =>
                    Compilation.Make (Unit => "<IMAGE>",
                                      Scope => Compilation.Load_Views,
                                      Goal => Compilation.Coded,
                                      Limit => "<ALL_WORLDS>",
                                      Effort_Only => False,
                                      Response => "<PROFILE>");

--           -- F14 -- Ada edit/demotion
                when F14 =>
                    Common.Edit;
                when S_F14 =>
                    Common.Demote;
                when C_F14 =>
                    Ada.Source_Unit;
                when M_F14 =>
                    Ada.Withdraw;
                when Cm_F14 =>
                    Compilation.Demote (Unit => "<SELECTION>",
                                        Goal => Compilation.Source,
                                        Limit => "<WORLDS>",
                                        Effort_Only => False,
                                        Response => "<PROFILE>");
                when Cms_F14 =>
                    Compilation.Demote (Unit => "<SELECTION>",
                                        Goal => Compilation.Source,
                                        Limit => "<ALL_WORLDS>",
                                        Effort_Only => False,
                                        Response => "<PROFILE>");
                when Cs_F14 =>
                    Compilation.Demote (Unit => "<SELECTION>",
                                        Goal => Compilation.Installed,
                                        Limit => "<WORLDS>",
                                        Effort_Only => False,
                                        Response => "<PROFILE>");
                when Ms_F14 =>
                    Compilation.Demote (Unit => "<SELECTION>",
                                        Goal => Compilation.Installed,
                                        Limit => "<ALL_WORLDS>",
                                        Effort_Only => False,
                                        Response => "<PROFILE>");

--           -- F15 -- Create and Ada construction
                when F15 =>
                    Common.Create_Command;
                when S_F15 =>
                    Ada.Create_Body;
                when C_F15 =>
                    Common.Object.Insert;
--           -- when M_F15  => Library.Create_Directory; -- Prompt
--           -- when CM_F15 => Library.Create_World;     -- Prompt
--           -- when CS_F15 => Text.Create_File;         -- Prompt
                when Cms_F15 =>
                    Ada.Create_Private;

--           -- F16 -- Ada semantic information
--           --        Meta is Show_Usage; for Show_Usage,
--           --                Control => Global
--           --                Shift   => Closure
                when F16 =>
                    Common.Semanticize;
                when S_F16 =>
                    Ada.Get_Errors;
                when C_F16 =>
                    Common.Clear_Underlining;
                when M_F16 =>
                    Ada.Show_Usage (Name => "<CURSOR>",
                                    Global => False,
                                    Limit => "<WORLDS>",
                                    Closure => False);
                when Cm_F16 =>
                    Ada.Show_Usage (Name => "<CURSOR>",
                                    Global => True,
                                    Limit => "<ALL_WORLDS>",
                                    Closure => False);
                when Cms_F16 =>
                    Ada.Show_Usage (Name => "<CURSOR>",
                                    Global => True,
                                    Limit => "<ALL_WORLDS>",
                                    Closure => True);


--           -- F17 -- Explain, Item Off and Show_Unused
                when F17 =>
                    Common.Explain;
                when C_F17 =>
                    Editor.Set.Designation_Off;
                when M_F17 =>
                    Ada.Show_Unused (In_Unit => "<IMAGE>",
                                     Check_Other_Units => False);
                when Cm_F17 =>
                    Ada.Show_Unused (In_Unit => "<IMAGE>",
                                     Check_Other_Units => True);
                when Cms_F17 =>
                    Ada.Make_Inline;

--           -- F18 -- Next underline/prompt
--           -- This set of assignments assumes that next underline is the
--           -- most common operation and is faster (for the user) than
--           -- stepping through prompts.
--           --
--           -- Control changes Next to Previous
--           -- Shift   turns off Prompt, i.e. Underline only
--           -- Meta    turns off Underline, i.e. Prompt only
--           --
                when F18 =>
                    Editor.Cursor.Next (Prompt => True, Underline => True);
                when C_F18 =>
                    Editor.Cursor.Previous (Prompt => True, Underline => True);
                when M_F18 =>
                    Editor.Cursor.Next (Prompt => True, Underline => False);
                when Cm_F18 =>
                    Editor.Cursor.Previous (Prompt => True, Underline => False);
                when S_F18 =>
                    Editor.Cursor.Next (Prompt => False, Underline => True);
                when Cs_F18 =>
                    Editor.Cursor.Previous (Prompt => False, Underline => True);
                when Cms_F18 =>
                    Ada.Make_Separate;

--           -- F19 -- Jobs; End of Input
--           -- when F19   => Job.Disable (0); -- Interrupt
--           -- when C_F19 => Job.Kill (0);
                when M_F19 =>
                    Job.Connect (0);
                when S_F19 =>
                    Job.Enable (0);
                when Cm_F19 | Dot =>
                    Text.End_Of_Input;

--           -- F20 -- Information keys
                when F20 =>
                    What.Time;
                when S_F20 =>
                    What.Load (Verbose => True);
                when C_F20 =>
                    What.Users (All_Users => True);
                when M_F20 =>
                    What.Locks (Name => "<IMAGE>");
                when Cm_F20 =>
                    What.Object;
                when Cms_F20 =>
                    Access_List.Display (For_Object => "<CURSOR>");


--           -- Arrow keys:
--           --     M   => Word
--           --     S   => Image
--           --     C   => Object
--           --     CM  => Traversal/Window
--           --     CS  => Screen
--           --     CMS => Screen Stack
--           -- Horizontal scrolling would logically be S_Left/Right
--           -- User feedback indicates that this is too easy to hit, so
--           -- S_Left/Right are In_Place versions of C_Left/Right and
--           -- MS_Left/Right are horizontal scrolling

                when Up =>
                    Editor.Cursor.Up;
                when S_Up =>
                    Editor.Image.Up;
                when C_Up =>
                    Common.Object.Previous;
                when M_Up =>
                    Editor.Cursor.Previous;
                when Cs_Up =>
                    Editor.Screen.Up;
                when Cm_Up =>
                    Editor.Window.Previous;
                when Cms_Up =>
                    Editor.Screen.Top;

                when Down =>
                    Editor.Cursor.Down;
                when S_Down =>
                    Editor.Image.Down;
                when C_Down =>
                    Common.Object.Next;
                when M_Down =>
                    Editor.Cursor.Next;
                when Cs_Down =>
                    Editor.Screen.Down;
                when Cm_Down =>
                    Editor.Window.Next;
                when Cms_Down =>
                    Editor.Screen.Push;

                when Right =>
                    Editor.Cursor.Right;
                when S_Right =>
                    Common.Definition (In_Place => True);
                when C_Right =>
                    Common.Object.Child;
                when M_Right =>
                    Editor.Word.Next;
                when Cs_Right =>
                    Editor.Screen.Right;
                when Ms_Right =>
                    Editor.Image.Right;
                when Cm_Right =>
                    Common.Definition;
                when Cms_Right =>
                    Editor.Screen.Next;

                when Left =>
                    Editor.Cursor.Left;
                when S_Left =>
                    Common.Enclosing (In_Place => True);
                when C_Left =>
                    Common.Object.Parent;
                when M_Left =>
                    Editor.Word.Previous;
                when Cs_Left =>
                    Editor.Screen.Left;
                when Ms_Left =>
                    Editor.Image.Left;
                when Cm_Left =>
                    Common.Enclosing;
                when Cms_Left =>
                    Editor.Screen.Previous;

                when Begin_Of =>
                    Editor.Line.Beginning_Of;
                when S_Begin_Of =>
                    Editor.Image.Beginning_Of;
                when C_Begin_Of =>
                    Common.Object.First_Child;
                when M_Begin_Of =>
                    Editor.Word.Beginning_Of;
                when Cm_Begin_Of =>
                    Editor.Window.Beginning_Of;
                when Cms_Begin_Of =>
                    Editor.Screen.Top;

                when End_Of =>
                    Editor.Line.End_Of;
                when S_End_Of =>
                    Editor.Image.End_Of;
                when C_End_Of =>
                    Common.Object.Last_Child;
                when M_End_Of =>
                    Editor.Word.End_Of;
                when Cm_End_Of =>
                    Editor.Window.End_Of;

                when Numeric_0 | S_Numeric_0 | C_Numeric_0 | M_Numeric_0 =>
                    Editor.Set.Argument_Digit (0);
                when Numeric_1 | S_Numeric_1 | C_Numeric_1 | M_Numeric_1 =>
                    Editor.Set.Argument_Digit (1);
                when Numeric_2 | S_Numeric_2 | C_Numeric_2 | M_Numeric_2 =>
                    Editor.Set.Argument_Digit (2);
                when Numeric_3 | S_Numeric_3 | C_Numeric_3 | M_Numeric_3 =>
                    Editor.Set.Argument_Digit (3);
                when Numeric_4 | S_Numeric_4 | C_Numeric_4 | M_Numeric_4 =>
                    Editor.Set.Argument_Digit (4);
                when Numeric_5 | S_Numeric_5 | C_Numeric_5 | M_Numeric_5 =>
                    Editor.Set.Argument_Digit (5);
                when Numeric_6 | S_Numeric_6 | C_Numeric_6 | M_Numeric_6 =>
                    Editor.Set.Argument_Digit (6);
                when Numeric_7 | S_Numeric_7 | C_Numeric_7 | M_Numeric_7 =>
                    Editor.Set.Argument_Digit (7);
                when Numeric_8 | S_Numeric_8 | C_Numeric_8 | M_Numeric_8 =>
                    Editor.Set.Argument_Digit (8);
                when Numeric_9 | S_Numeric_9 | C_Numeric_9 | M_Numeric_9 =>
                    Editor.Set.Argument_Digit (9);
                when Numeric_Comma | S_Numeric_Comma |
                     C_Numeric_Comma | M_Numeric_Comma =>
                    Editor.Set.Argument_Prefix;
                when Dash | C_Dash | M_Dash | S_Dash =>
                    Editor.Set.Argument_Minus;

--           -- Prefix keys above keypad in Left-Right order
--           -- Object, Region, Window, Image, Line, Word, Mark

                when Object =>
                    case Key_2 is

                        when '1' | '!' =>
                            Common.Expand;
                        when '.' | '>' =>
                            Common.Elide;
                        when '/' | '?' =>
                            Common.Explain;
                        when 'c' | 'C' =>
                            Common.Object.Copy;
                        when 'd' | 'D' | 'k' | 'K' =>
                            Common.Object.Delete;
                        when 'g' | 'G' =>
                            Common.Abandon;
                        when 'i' | 'I' =>
                            Common.Object.Insert;
                        when 'm' | 'M' =>
                            Common.Object.Move;
                        when 'x' | 'X' =>
                            Common.Release;
                        when 'r' | 'R' =>
                            Common.Redo;
                        when 's' | 'S' =>
                            Common.Sort_Image;
                        when 'u' | 'U' =>
                            Common.Undo;
                        when Down =>
                            Common.Object.Next;
                        when Left =>
                            Common.Object.Parent;
                        when Right =>
                            Common.Object.Child;
                        when Up =>
                            Common.Object.Previous;
                        when Begin_Of =>
                            Common.Object.First_Child;
                        when End_Of =>
                            Common.Object.Last_Child;
                        when F10 =>
                            Common.Definition;
                        when Tab =>
                            Editor.Char.Tab_To_Comment;
                        when others =>
                            null;
                    end case;

                when Region =>
                    case Key_2 is
                        when '-' | '_' =>
                            Editor.Region.Comment;
                        when '=' | '+' =>
                            Editor.Region.Uncomment;
                        when 'r' | 'R' =>
                            Editor.Hold_Stack.Rotate;
                        when 't' | 'T' =>
                            Editor.Hold_Stack.Swap;
                        when 'X' | 'x' =>
                            Editor.Region.Off;
                        when '<' | ',' =>
                            Editor.Region.Lower_Case;
                        when '>' | '.' =>
                            Editor.Region.Upper_Case;
                        when 'c' | 'C' =>
                            Editor.Region.Copy;
                        when 'd' | 'D' | 'k' | 'K' =>
                            Editor.Region.Delete;
                        when 'm' | 'M' =>
                            Editor.Region.Move;
                        when '[' | '{' =>
                            Editor.Region.Start;
                        when ']' | '}' =>
                            Editor.Region.Finish;
                        when '^' | '6' =>
                            Editor.Region.Capitalize;
                        when End_Of =>
                            Editor.Region.End_Of;
                        when Begin_Of =>
                            Editor.Region.Beginning_Of;
                        when Left =>
                            Editor.Hold_Stack.Previous;
                        when Right =>
                            Editor.Hold_Stack.Next;
                        when Up =>
                            Editor.Hold_Stack.Top;
                        when Down =>
                            Editor.Hold_Stack.Push;
                        when Format =>
                            Editor.Region.Fill;
                        when Complt =>
                            Editor.Region.Justify;
                        when 'p' | 'P' =>
                            Editor.Hold_Stack.Copy_Top;
                        when Delete =>
                            Editor.Hold_Stack.Delete_Top;
                        when others =>
                            null;
                    end case;

                when Window =>
                    case Key_2 is
                        when '!' | '1' =>
                            Editor.Window.Expand;
                        when '.' | '>' =>
                            Editor.Window.Expand (-4);
                        when '?' | '/' | F10 =>
                            Editor.Window.Directory;
                        when 'c' | 'C' =>
                            Editor.Window.Copy;
                        when 'd' | 'D' | 'k' | 'K' =>
                            Editor.Window.Delete;
                        when 'j' | 'J' =>
                            Editor.Window.Join (1);
                        when 't' | 'T' =>
                            Editor.Window.Transpose;
                        when 'x' | 'X' =>
                            Editor.Window.Delete;
                        when Delete =>
                            Editor.Window.Join (-1);
                        when End_Of =>
                            Editor.Window.End_Of;
                        when Down =>
                            Editor.Window.Next;
                        when Format =>
                            Editor.Window.Focus;
                        when Promot =>
                            Editor.Window.Promote;
                        when F14 | S_F14 =>
                            Editor.Window.Demote;
                        when Begin_Of =>
                            Editor.Window.Beginning_Of;
                        when Left =>
                            Editor.Window.Parent;
                        when Right =>
                            Editor.Window.Child;
                        when Up =>
                            Editor.Window.Previous;
                        when others =>
                            null;
                    end case;

                when Image =>
                    case Key_2 is
                        when End_Of =>
                            Editor.Image.End_Of;
                        when Down =>
                            Editor.Image.Down;
                        when Begin_Of =>
                            Editor.Image.Beginning_Of;
                        when Left =>
                            Editor.Image.Left;
                        when Right =>
                            Editor.Image.Right;
                        when Up =>
                            Editor.Image.Up;
                        when 'I' | 'i' =>
                            Editor.Set.Insert_Mode (True);
                        when 'O' | 'o' =>
                            Editor.Set.Insert_Mode (False);
                        when 'F' | 'f' =>
                            Editor.Set.Fill_Mode (True);
                        when 'X' | 'x' =>
                            Editor.Set.Fill_Mode (False);
                        when '?' | '/' =>
                            Editor.Image.Find ("");
                        when others =>
                            null;
                    end case;

                when Line =>
                    case Key_2 is
                        when '<' | ',' =>
                            Editor.Line.Lower_Case;
                        when '>' | '.' =>
                            Editor.Line.Upper_Case;
                        when '?' | '/' =>
                            What.Line;
                        when Begin_Of =>
                            Editor.Line.Beginning_Of;
                        when 'c' | 'C' =>
                            Editor.Line.Copy;
                        when 'd' | 'D' =>
                            Editor.Line.Delete;
                        when End_Of =>
                            Editor.Line.End_Of;
                        when 'i' | 'I' =>
                            Editor.Line.Insert;
                        when 'j' | 'J' =>
                            Editor.Line.Join;
                        when 'k' | 'K' =>
                            Editor.Line.Delete_Forward;
                        when 'o' | 'O' =>
                            Editor.Line.Open;
                        when 't' | 'T' =>
                            Editor.Line.Transpose;
                        when '^' | '6' =>
                            Editor.Line.Capitalize;
                        when Delete =>
                            Editor.Line.Delete_Backward;
                        when '$' | '4' =>
                            Editor.Line.Center;
                        when Up =>
                            Editor.Cursor.Up;
                        when Down =>
                            Editor.Cursor.Down;
                        when others =>
                            null;
                    end case;

                when Word =>
                    case Key_2 is
                        when '<' | ',' =>
                            Editor.Word.Lower_Case;
                        when '>' | '.' =>
                            Editor.Word.Upper_Case;
                        when 'd' | 'D' =>
                            Editor.Word.Delete;
                        when 'K' | 'k' =>
                            Editor.Word.Delete_Forward;
                        when 't' | 'T' =>
                            Editor.Word.Transpose;
                        when '^' | '6' =>
                            Editor.Word.Capitalize;
                        when Delete =>
                            Editor.Word.Delete_Backward;
                        when End_Of =>
                            Editor.Word.End_Of;
                        when Begin_Of =>
                            Editor.Word.Beginning_Of;
                        when Left =>
                            Editor.Word.Previous;
                        when Right =>
                            Editor.Word.Next;
                        when others =>
                            null;
                    end case;

                when Mark =>
                    case Key_2 is
                        when 'r' | 'R' =>
                            Editor.Mark.Rotate;
                        when 't' | 'T' =>
                            Editor.Mark.Swap;
                        when 'p' | 'P' =>
                            Editor.Mark.Copy_Top;
                        when Delete =>
                            Editor.Mark.Delete_Top;
                        when Down =>
                            Editor.Mark.Push;
                        when Right =>
                            Editor.Mark.Next;
                        when Left =>
                            Editor.Mark.Previous;
                        when Up =>
                            Editor.Mark.Top;
                        when Begin_Of | '[' | '{' =>
                            Editor.Macro.Start;
                        when End_Of | ']' | '}' =>
                            Editor.Macro.Finish;
                        when Promot | Enter | Carriage_Return =>
                            Editor.Macro.Execute;
                        when F10 =>
                            Editor.Macro.Bind;
                        when others =>
                            null;
                    end case;

                when others =>
                    null;
            end case;


    end case;
end Rt_Commands;