! ! This is the TELEX EVE_and_EDT TPU Interface, an extension to ! the EVE TPU Interface. The interface is designed to ease ! the transition of users from EDT to EVE by providing an 'EDT ! style' editing keypad to access EVE commands. This serves ! two purposes, ! ! 1. To provide a short-hand notation for EVE commands that ! would otherwise have to be entered on the command line. ! ! 2. To reduce the frustration associated with learning a new ! key pad. With the EVE_and_EDT Interface, the same ! sequence of key strokes will produce the same (or very ! similar) results whether you are using EDT or EVE. ! ! ! Use the following DCL commands to compile the editor: ! ! $ ASSIGN/USER_MODE SYS$DISK:'F$DIRECTORY()' TPU$EVEPLUS ! $ EDIT/TPU/NODISPLAY/SECTION=SYS$SHARE:EVESECINI - ! /COMMAND=TPU$EVEPLUS:EVEANDEDT ! ! A TPU section file - EVEANDEDT.TPU$SECTION will be created in the ! current directory. ! ! Note that EVEANDEDT looks for its help library in the directory ! specified by the logical name TPU$EVEPLUS. ! ! ! ! Written by : Scott E. Smith ! Telex Computer Products ! 3301 Terminal Drive ! Raleigh, NC 27604 ! ! Version: 09-Dec-1985 ! ! ! ! Modified to take advantage of VMS Version 4.4 TPU key maps. ! VMS V4.4 modifications by: ! Scott E. Smith ! Sperry Coroporation ! Aerospace & Marine Group ! Marine Systems Division ! Charlottesville, VA 22906 ! (804) 973-0186 ! ! Version: 22-May-1986 ! ! ! ! Submitted By: ! Scott E. Smith ! Sperry Marine Inc. ! Charlottesville, VA 22906 ! (804) 973-0186 ! ! Version: 23-Apr-1987 ! ! ! This software draws heavily from the sources provided by DEC ! to the EVE and EDT emulator interfaces, SYS$LIBRARY:EDTSECINI.TPU ! and SYS$LIBRARY:EVESECINI.TPU, which contain the following notice: ! ! COPYRIGHT © 1983, 1984, 1985 BY ! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS ! ALL RIGHTS RESERVED ! ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ! TRANSFERRED. ! ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ! CORPORATION. ! ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ! ! !- procedure eve$edt_init_variables ! initialize global variables ! ! Initialize some variables ! ! eve$x_edt_word_restoring_line := 0; ! flags restoring word across line bound eve$x_edt_character_restoring_line := 0;! flags restoring char across line bound eve$x_edt_line_restoring_line := 0; ! flags restoring line across line bound eve$x_edt_deleted_line := ''; ! last line deleted by edt_erase_line eve$x_edt_deleted_word := ''; ! last word deleted by edt_erase_word eve$x_edt_deleted_character := ''; ! last char deleted by edt_erase_character ! ! these variables added for Version 21-Oct-1985 eve$arg1_substitute := eve$arg1_buffer; eve$arg2_substitute := eve$arg1_buffer; eve$arg3_substitute := eve$arg1_buffer; eve$x_edt_subs_temp := eve$x_null; eve$x_edt_subs_target := eve$x_null; eve$x_edt_subs_replacement := eve$x_null; ! ! these variables added for Version 22-May-1986 eve$x_edt_keys := "eve$edt_keys"; ! Edt numeric keypad ! ! these variables added for Version 11-Aug-1986 eve$arg4_substitute := eve$arg1_buffer; eve$arg5_substitute := eve$arg1_buffer; ! eve$x_edt_help_lib := "tpu$eveplus:eveandedt.hlb"; ! ! define this version eve$x_version := eve$x_version + "and EDT V23-Apr-1987"; ! endprocedure ! ! ! ! procedure eve_edt_help ! pf2 (help) ! get help using help library specified by ! string eve$x_edt_help_lib local last_key_name, ! Keyword for last key after help prompt this_window; ! Current window this_window := current_window; map (info_window, help_buffer); last_key_name := "return"; message (eve$x_null); eve$edt_help_keypad; unmap (info_window); position (this_window); eve$x_ambiguous_parse := 0; message (eve$x_null); endprocedure; ! ! ! Procedure to display keypad-oriented help. ! procedure eve$edt_help_keypad local help_char, ! Keyword of key to provide help on which_topic, ! String with help library subtopic showing_keypad; ! True if currently displaying keypad diagram which_topic := eve$x_null; set (status_line, info_window, reverse, " Help buffer"); eve$edt_help_text ("keypad_diagram edt_vt100"); showing_keypad := 1; loop if showing_keypad then help_char := eve$prompt_key ("Press key that you want help on (Return to leave help): "); else help_char := eve$prompt_key ("Press key that you want help on (Help for keypad, Return to leave help): "); endif; which_topic := eve$lookup_comment (help_char); exitif which_topic = "return"; if which_topic = eve$x_null then if eve$alphabetic (help_char) <> eve$x_null then which_topic := "typing"; else which_topic := "unknown"; endif; endif; if (which_topic = "help") and (not showing_keypad) then eve$edt_help_text ("keypad_diagram edt_vt100"); showing_keypad := 1; else eve$edt_help_text ("eveandedt " + which_topic); showing_keypad := 0; endif; endloop; endprocedure; ! ! ! Do help_text for a given topic, stripping librarian header information, ! and update the info_window. Use the library specified by the variable ! EVE$X_EDT_HELP_LIB. ! ! Parameters: ! ! topic String containing topic for VMS ! librarian - input procedure eve$edt_help_text (topic) on_error ! Invalid topic, do our best update (info_window); return; endon_error; help_text (eve$x_edt_help_lib, topic, off, help_buffer); position (beginning_of (help_buffer)); move_vertical (5); this_range := search (eve$pattern_whitespace, forward); ! error if not found if length (this_range) > 4 then ! allow indentation if desired move_horizontal (3); else move_horizontal (length (this_range) - 1); endif; erase (create_range (beginning_of (help_buffer), mark (none), none)); update (info_window); endprocedure; ! ! ! procedure eve_edt_find_next ! pf3 (find next) ! Find the next occurence of the target of the ! last EVE_FIND command if eve$x_target = eve$x_null then message ("No previous target to find"); return (0); else eve$find (eve$x_target,0); endif; endprocedure ! ! ! ! procedure eve_edt_substitute ! GOLD/ENTER local new_target, ! Local copy of target lowercase_target, ! Lowercase version of eve$x_target this_position, ! Marker for current cursor position how_exact, ! Keyword to indicate case-sensitivity find_range; ! Range returned by search on_error if error = tpu$_strnotfound then find_range := 0; endif; endon_error; if eve$x_target = eve$kt_null then message ("No previous target to find"); return (0); endif; lowercase_target := eve$x_target; if get_info (lowercase_target, eve$kt_type) = string then change_case (lowercase_target, lower); endif; if lowercase_target = eve$x_target then how_exact := no_exact; else how_exact := exact; endif; this_position := mark (none); find_range := search (eve$x_target, forward, how_exact); if find_range = 0 then message ('No select range active'); return (0); endif; if this_position = beginning_of (find_range) then position (find_range); erase (find_range); eve_insert_here; else message ('No select range active'); find_range := 0; return (0); endif; if current_direction = forward then if this_position <> end_of (current_buffer) then find_range := search (eve$x_target, forward, how_exact); else find_range := 0; endif; else if this_position <> beginning_of (current_buffer) then move_horizontal (-1); find_range := search (eve$x_target, reverse, how_exact); else find_range := 0; endif; endif; if find_range = 0 then if get_info (eve$x_target, eve$kt_type) = string then message (fao ("Could not find: !AS", eve$x_target)); else message ("Could not find: "); endif; position (this_position); else position (find_range); endif; endprocedure; ! ! ! ! procedure eve_edt_erase_line ! pf4 (erase line) ! erase the rest of line and save the deleted eve_erase_line; ! text in a special buffer. eve$x_edt_deleted_line := eve$x_restore_text; eve$x_edt_line_restoring_line := eve$x_restoring_line; endprocedure ! ! ! ! procedure eve_edt_erase_start_of_line ! ctrl/u (erase start of line) ! erase the rest of line and save the eve_erase_start_of_line; ! deleted text in a special buffer. eve$x_edt_deleted_line := eve$x_restore_text; eve$x_edt_line_restoring_line := eve$x_restoring_line; endprocedure ! ! ! ! procedure eve_edt_erase_end_of_line ! kp2 (erase end of line) ! erase to end of line (but not the ! terminator) -- store deleted text in ! special buffer local this_position; ! Marker for current cursor position this_position := mark (none); if this_position = end_of (current_buffer) then return; else if current_character = eve$x_null then eve$x_restoring_line := 1; move_horizontal (1); if mark (none) = end_of (current_buffer) then move_horizontal (-1); eve$x_restore_text := eve$x_null; else eve$x_restore_text := erase_line; endif; else eve$x_restoring_line := 0; eve$x_restore_text := erase_character (length (current_line)); endif; endif; eve$x_edt_deleted_line := eve$x_restore_text; eve$x_edt_line_restoring_line := eve$x_restoring_line; endprocedure; ! ! ! ! procedure eve_edt_erase_previous_word ! Linefeed (ctrl/j) ! erase word and store the deleted text eve_erase_previous_word; ! in a seperate buffer eve$x_edt_deleted_word := eve$x_restore_text; eve$x_edt_word_restoring_line := eve$x_restoring_line; endprocedure ! ! ! ! procedure eve_edt_erase_word ! minus (delete word) ! erase word and store the deleted text eve_erase_word; ! in a seperate buffer eve$x_edt_deleted_word := eve$x_restore_text; eve$x_edt_word_restoring_line := eve$x_restoring_line; endprocedure ! ! ! ! procedure eve_edt_restore_line ! gold pf4 (undelete line) ! restore text from the deleted line buffer local save_restore_text, save_restoring_line; save_restore_text := eve$x_restore_text; save_restoring_line := eve$x_restoring_line; eve$x_restore_text := eve$x_edt_deleted_line; eve$x_restoring_line := eve$x_edt_line_restoring_line; eve_restore; eve$x_restore_text := save_restore_text; eve$x_restoring_line := save_restoring_line; endprocedure ! ! ! ! procedure eve_edt_restore_word ! gold minus (undelete word) ! restore text from the special delete word local save_restore_text, ! buffer save_restoring_line; save_restore_text := eve$x_restore_text; save_restoring_line := eve$x_restoring_line; eve$x_restore_text := eve$x_edt_deleted_word; eve$x_restoring_line := eve$x_edt_word_restoring_line; eve_restore; eve$x_restore_text := save_restore_text; eve$x_restoring_line := save_restoring_line; endprocedure ! ! ! ! procedure eve_edt_erase_character ! keypad comma (erase chracter) ! erase text and store in a special ! buffer -- behavior depends on current ! mode local this_position; ! Marker for current cursor position this_position := mark (none); if this_position = end_of (current_buffer) then return; else if current_character = eve$x_null then eve$x_edt_deleted_character := eve$x_null; eve$x_edt_character_restoring_line := 1; move_horizontal (1); if mark (none) = end_of (current_buffer) then move_horizontal (-1); else eve$append_line; endif; else eve$x_edt_deleted_character := current_character; eve$x_edt_character_restoring_line := 0; if get_info (current_buffer, "mode") = overstrike then copy_text (" "); else erase_character (1); endif; endif; endif; endprocedure; ! ! ! ! procedure eve_edt_restore_character ! gold comma (undelete character) ! restore text from the deleted ! character buffer -- behavior depend ! on current mode local save_restore_text, save_restoring_line; if (get_info (current_buffer, "mode") = overstrike) and (current_offset > 0) and (not eve$x_edt_character_restoring_line) then move_horizontal (-1); copy_text (eve$x_edt_deleted_character); else save_restore_text := eve$x_restore_text; save_restoring_line := eve$x_restoring_line; eve$x_restore_text := eve$x_edt_deleted_character; eve$x_restoring_line := eve$x_edt_character_restoring_line; eve_restore; eve$x_restore_text := save_restore_text; eve$x_restoring_line := save_restoring_line; endif; endprocedure ! ! ! ! procedure eve_edt_page ! kp7 (page) LOCAL dir , next_page ; on_error if error = tpu$_strnotfound then if dir = REVERSE then position(beginning_of(current_buffer)) else position(end_of(current_buffer)) endif; endif; return endon_error dir := current_direction; if dir = FORWARD then move_horizontal(1) else move_horizontal(-1) endif; next_page := search(ascii(12),dir); position(beginning_of(next_page)); endprocedure; ! ! ! ! procedure eve_edt_screen ! kp8 (screen) ! scroll a screenful of text in the if current_direction = forward ! current direction then eve$move_by_screen (1) else eve$move_by_screen (-1) endif; endprocedure ! ! ! ! procedure eve_edt_append ! kp9 (append) ! Append the select region to the insert here buffer local this_position, ! Marker for current cursor position remove_range; ! Range being removed this_position := mark (none); if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Append must be used in the same buffer as Select."); else remove_range := select_range; ! Select & Remove in same spot => erase this character if remove_range = 0 then if this_position = end_of (current_buffer) then message ("Nothing to append"); eve$x_select_position := 0; return; else remove_range := create_range (mark (none), mark (none), none); endif; endif; position (end_of(paste_buffer)); move_horizontal (-1); move_text (remove_range); position (this_position); eve$x_select_position := 0; remove_range := 0; message ("Append completed."); endif; else message ("Use Select before using Append."); endif; endprocedure; ! ! ! ! procedure eve_edt_replace_range ! gold kp9 (replace range) ! replace selected range with insert here buffer local this_position, ! Marker for current cursor position remove_range; ! Range being removed this_position := mark (none); if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Replace must be used in the same buffer as Select."); else remove_range := select_range; ! Select & Remove in same spot => erase this character if remove_range = 0 then if this_position = end_of (current_buffer) then message ("Nothing to remove"); eve$x_select_position := 0; return; else remove_range := create_range (mark (none), mark (none), none); endif; endif; erase (remove_range); eve$x_select_position := 0; remove_range := 0; eve_insert_here; message ("Replace completed."); endif; else message ("Use Select before using Replace."); endif; endprocedure; ! ! ! ! procedure eve_edt_change_case ! gold kp1 (change case) ! change case of all characters in the ! select region local change_range, ! Range being changed character; ! Temporary stoage if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Change Case must be used in the same buffer as Select."); else change_range := select_range; ! Select & Change in same spot => change case this character if change_range = 0 then if mark (none) = end_of (current_buffer) then eve$x_select_position := 0; return; else change_range := create_range (mark (none), mark (none), none); endif; endif; change_case(change_range, invert); eve$x_select_position := 0; change_range := 0; endif; else !change case of current character if current_character <> eve$x_null then character :=current_character; change_case(character,invert); if (get_info (current_buffer, "mode") = insert) then erase_character(1) endif; copy_text(character); if current_direction <> forward then move_horizontal(-2); endif; return endif; endif; endprocedure; ! ! ! ! procedure eve_edt_fill ! gold kp7 (fill) ! fill the select region or current paragraph ! if no select region is active local fill_range, ! Range being filled character; ! Temporary stoage on_error fill_range := 0; set (screen_update, on); endon_error; if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Fill must be used in the same buffer as Select."); else fill_range := select_range; if fill_range = 0 then message ("Nothing to fill"); return (0); endif; set (screen_update, off); fill (fill_range, eve$x_fill_separators); eve$show_first_line; eve$x_select_position := 0; fill_range := 0; set (screen_update, on); endif; else !fill paragraph eve_fill_paragraph; endif; endprocedure; ! ! ! ! procedure eve_edt_end_of_line ! kp2 (end of line) ! Move the next End of Line if current_direction = forward then if mark(none) <> end_of (current_buffer) then if current_offset = length (current_line) then move_vertical(1) endif; ! move back if mark(none) <> end_of(current_buffer) then move_horizontal(length(current_line)-current_offset); ! goto EOL endif; endif else move_horizontal(( - current_offset)+(-1)) endif; endprocedure ! end of EOL ! ! ! ! procedure eve_edt_move_by_character ! kp3 (move by character) ! move one character in the current ! direction if current_direction = forward then move_horizontal(1) else move_horizontal(-1) endif; endprocedure ! ! ! ! procedure eve_edt_special_insert ! gold kp3 (special insert) ! insert character with specified value copy_text(ascii(int(read_line("Decimal value of character: ")))); endprocedure ! ! ! ! procedure eve_edt_open_line ! gold kp0 (open line) split_line; ! open a new line at the cursor position move_horizontal (-1); endprocedure ! ! ! ! procedure eve_edt_start_of_line ! kp0 (start of line) ! move in the current direction to the ! start of the next line LOCAL o; ! edt equiv. of Keypad 0 o := current_offset; move_horizontal(- o); if current_direction = forward then move_vertical(1) else if o = 0 then move_vertical(-1) endif; endif; endprocedure ! ! ! ! procedure eve_edt_reset ! gold period (reset) eve$x_select_position := 0; ! reset the current select range message ("Selection cancelled."); endprocedure ! ! ! procedure eve_edt_margin_compute ! ctrl/a key eve_set_left_margin ((((current_offset / 4) * 4) + 1)); endprocedure procedure eve_edt_margin_decrement ! ctrl/d key eve_set_left_margin(get_info(current_buffer,eve$kt_left_margin)-4); endprocedure procedure eve_edt_margin_increment ! ctrl/e key eve_set_left_margin(get_info(current_buffer,eve$kt_left_margin)+4); endprocedure ! ! ! ! ! Search and replace procedure. Case-sensitivity of search is ! same as for the find command. If case-insensitive, replacements ! are done to match case of current occurrence. ! ! Parameters: ! ! substitute_parameter_1 Old string - input ! substitute_parameter_2 New string - input ! substitute_parameter_3 Range - input ! substitute_parameter_4 start substitute column - input (default 1) ! substitute_parameter_5 end substitute column - input ! (default eve$x_larget_width) ! ! The range parameter may be: ! "one" - (default) Replace only the next occurrence in the ! current_direction. ! "rest"- Replace all occurrences between the current position and ! the end of buffer in the current direction. Return the ! cursor to its starting postion. ! "all" - Replace occurrences and return cursor its current position. ! "select" - Replace all occurrences in the current select range and ! return the cursor to its current position. ! procedure eve_substitute (substitute_parameter_1, substitute_parameter_2, substitute_parameter_3, substitute_parameter_4, substitute_parameter_5) local this_buffer, ! Current buffer this_position, start_marker, end_marker, range_parameter, selected_range, direction, once_only, null_parameters, start_column, end_column, this_mode, ! Keyword for current mode lowercase_target, ! Lowercase version of target string lowercase_replacement, ! Lowercase version of replacement string uppercase_target, ! Uppercase version of target string uppercase_replacement, ! Uppercase version of replacement string capital_target, ! Capitalized version of target string capital_replacement, ! Capitalized version of replacement string how_exact, ! Keyword to indicate case-sensitivity replace_range, ! Range of current occurrence range_length, ! Length of replace_action this_occurrence, ! String of replace_range occurrences; ! Number of replacements made so far this_position := mark (none); this_buffer := current_buffer; this_mode := get_info (current_buffer, "mode"); set (insert, this_buffer); if substitute_parameter_1 = eve$x_null then null_parameters := 1; else eve$x_edt_subs_temp := substitute_parameter_1; null_parameters := 0; endif; if not (eve$prompt_string (eve$x_edt_subs_temp, eve$x_edt_subs_target, "Old string: ", "No string to replace")) then return; endif; if null_parameters then eve$x_edt_subs_replacement := read_line ("New string: "); ! empty string is ok here else eve$x_edt_subs_replacement := substitute_parameter_2; endif; range_parameter := substitute_parameter_3; if get_info (range_parameter, "type") = string then change_case (range_parameter, lower); endif; once_only := 0; if range_parameter = eve$x_null then range_length := 0; else range_length := length (range_parameter); endif; if (range_length = 0) or (range_parameter = substr ("one", 1, range_length)) then once_only := 1; start_marker := mark (none); end_marker := end_of (current_buffer); direction := current_direction; else if range_parameter = substr ("all", 1, range_length) then start_marker := beginning_of (current_buffer); end_marker := end_of (current_buffer); direction := forward; else if range_parameter = substr ("rest", 1, range_length) then start_marker := mark (none); end_marker := end_of (current_buffer); direction := current_direction; else if range_parameter = substr ("select", 1, range_length) then if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Substitute must be used in the same buffer as Select."); else selected_range := select_range; eve$x_select_position := 0; start_marker := beginning_of (selected_range); end_marker := end_of (selected_range); direction := forward; endif; else message ("Use Select before using Substitute."); return; endif; else message ("Invalid range specification, "+range_parameter); return; endif; endif; endif; endif; start_column := substitute_parameter_4; if get_info(start_column, eve$kt_type) = string then if start_column = "" then start_column := 0; else translate (start_column, "1", "l"); start_column := int(start_column) - 1; endif; endif; end_column := substitute_parameter_5; if get_info(end_column, eve$kt_type) = string then if end_column = "" then end_column := eve$x_largest_width - 1; else translate (end_column, "1", "l"); end_column := int(end_column) - 1; endif; endif; lowercase_target := eve$x_edt_subs_target; if get_info (lowercase_target, "type") = string then change_case (lowercase_target, lower); endif; lowercase_replacement := eve$x_edt_subs_replacement; change_case (lowercase_replacement, lower); if (lowercase_target = eve$x_edt_subs_target) and (lowercase_replacement = eve$x_edt_subs_replacement) then how_exact := no_exact; uppercase_target := eve$x_edt_subs_target; if get_info (uppercase_target, "type") = string then change_case (uppercase_target, upper); endif; capital_target := eve$x_edt_subs_target; if get_info (capital_target, "type") = string then eve$capitalize_string (capital_target); endif; uppercase_replacement := eve$x_edt_subs_replacement; change_case (uppercase_replacement, upper); capital_replacement := eve$x_edt_subs_replacement; eve$capitalize_string (capital_replacement); else how_exact := exact; endif; set (screen_update, off); position (start_marker); loop replace_range := search (eve$x_edt_subs_target, direction, how_exact); exitif replace_range = 0; position (replace_range); if (start_column <= current_offset) and (current_offset <= end_column) then exitif mark (none) >= end_marker; this_occurrence := erase_character (length (replace_range)); if how_exact = exact then copy_text (eve$x_edt_subs_replacement); else ! Make sure non-alphabetic target is replaced by lowercas if this_occurrence = lowercase_target then copy_text (lowercase_replacement); else if this_occurrence = uppercase_target then copy_text (uppercase_replacement); else if this_occurrence = capital_target then copy_text (capital_replacement); else copy_text (lowercase_replacement); endif; endif; endif; endif; if direction = reverse then move_horizontal (- (length (eve$x_edt_subs_replacement)+1)); endif; occurrences := occurrences + 1; exitif once_only; else if direction = reverse then move_horizontal (-1); else move_horizontal (+1); endif; endif; endloop; if not once_only then position (this_position); endif; set (screen_update, on); message (fao ("Replaced !SL occurrence!%S", occurrences)); set (this_mode, this_buffer); endprocedure; ! ! ! ! ! ! procedure eve$edt_init_keypad ! procedure to define keypad and keyboard ! keys. This procedure not bound to a key. on_error endon_error; eve$x_edt_keys := create_key_map ("eve$edt_keys"); define_key ("eve_edt_help", pf2, " help", eve$x_edt_keys); define_key ("eve_help('commands')", key_name(pf2, shift_key), " help", eve$x_edt_keys); define_key ("eve_edt_find_next", pf3, " edt_find_next", eve$x_edt_keys); define_key ("eve_find ('')", key_name (pf3, shift_key), " find", eve$x_edt_keys); define_key ("eve_edt_erase_line", pf4, " edt_erase_line", eve$x_edt_keys); define_key ("eve_edt_restore_line", key_name (pf4, shift_key), " edt_restore_line", eve$x_edt_keys); ! define_key ("eve_edt_page", kp7, " edt_page", eve$x_edt_keys); define_key ("eve_do('')", key_name (kp7, shift_key), " do", eve$x_edt_keys); define_key ("eve_edt_screen", kp8, " edt_screen", eve$x_edt_keys); define_key ("eve_edt_fill", key_name (kp8, shift_key)," edt_fill", eve$x_edt_keys); define_key ("eve_edt_append", kp9, " edt_append", eve$x_edt_keys); define_key ("eve_edt_replace_range", key_name (kp9, shift_key), " edt_replace_range", eve$x_edt_keys); define_key ("eve_edt_erase_word", minus, " edt_erase_word", eve$x_edt_keys); define_key ("eve_edt_restore_word", key_name (minus, shift_key), " edt_restore_word", eve$x_edt_keys); ! define_key ("eve_forward", kp4, " forward", eve$x_edt_keys); define_key ("eve_bottom", key_name (kp4, shift_key), " bottom", eve$x_edt_keys); define_key ("eve_reverse", kp5, " reverse", eve$x_edt_keys); define_key ("eve_top", key_name (kp5, shift_key), " top", eve$x_edt_keys); define_key ("eve_remove", kp6, " remove", eve$x_edt_keys); define_key ("eve_insert_here", key_name (kp6, shift_key), " insert_here", eve$x_edt_keys); define_key ("eve_edt_erase_character", comma, " edt_erase_character", eve$x_edt_keys); define_key ("eve_edt_restore_character", key_name (comma, shift_key), " edt_restore_character", eve$x_edt_keys); ! define_key ("eve_move_by_word", kp1, " move_by_word", eve$x_edt_keys); define_key ("eve_edt_change_case", key_name (kp1, shift_key), " edt_change_case", eve$x_edt_keys); define_key ("eve_edt_end_of_line", kp2, " edt_end_of_line", eve$x_edt_keys); define_key ("eve_edt_erase_end_of_line", key_name (kp2, shift_key), " edt_erase_end_of_line", eve$x_edt_keys); define_key ("eve_edt_move_by_character" , kp3, " edt_move_by_character", eve$x_edt_keys); define_key ("eve_edt_special_insert", key_name (kp3, shift_key), " edt_special_insert", eve$x_edt_keys); ! define_key ("eve_edt_start_of_line", kp0, " edt_start_of_line", eve$x_edt_keys); define_key ("eve_edt_open_line", key_name (kp0, shift_key), " edt_open_line", eve$x_edt_keys); define_key ("eve_select", period, " select", eve$x_edt_keys); define_key ("eve_edt_reset", key_name (period, shift_key), " edt_reset", eve$x_edt_keys); define_key ("eve_return", enter, " return", eve$x_edt_keys); define_key ("eve_edt_substitute", key_name (enter, shift_key), " edt_substitute", eve$x_edt_keys); ! define_key ("eve_insert_mode", key_name ('I', shift_key), " insert_mode", eve$x_edt_keys); define_key ("eve_overstrike_mode", key_name ('O', shift_key), " overstrike_mode", eve$x_edt_keys); define_key ("eve_change_mode", key_name ('P', shift_key), " change_mode", eve$x_edt_keys); ! define_key("eve_shift_left(8)", key_name(right,shift_key)," edt_shift_right", eve$x_edt_keys); ! shift right define_key("eve_shift_right(8)", key_name(left,shift_key)," edt_shift_left", eve$x_edt_keys); ! shift left ! define_key("eve_previous_screen", key_name(up,shift_key), " previous_screen", eve$x_edt_keys); define_key("eve_next_screen", key_name(down,shift_key), " next_screen", eve$x_edt_keys); define_key("eve_define_key('')", ctrl_k_key, " define_key", eve$x_edt_keys); define_key("copy_text(ascii(12));", ctrl_l_key, "", eve$x_edt_keys); define_key("eve_edt_erase_previous_word", ctrl_j_key, " edt_erase_previous_word", eve$x_edt_keys); define_key("eve_edt_erase_start_of_line", ctrl_u_key, " edt_erase_start_of_line", eve$x_edt_keys); ! define_key("eve_edt_margin_compute", ctrl_a_key, " edt_margin_compute", eve$x_edt_keys); define_key("eve_edt_margin_decrement", ctrl_d_key, " edt_margin_decrement", eve$x_edt_keys); define_key("eve_edt_margin_increment", ctrl_e_key, " edt_margin_increment", eve$x_edt_keys); define_key("eve_edt_margin_compute", key_name('a',shift_key), " edt_margin_compute", eve$x_edt_keys); define_key("eve_edt_margin_decrement", key_name('d',shift_key), " edt_margin_decrement", eve$x_edt_keys); define_key("eve_edt_margin_increment", key_name('e',shift_key), " edt_margin_increment", eve$x_edt_keys); ! remove_key_map(eve$x_key_map_list, eve$x_edt_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt100_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt200_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_standard_keys, ALL); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_edt_keys); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_standard_keys); endprocedure ! ! ! Define numeric keypad layout for VT200 series keyboards ! We must replace the original eve$vt200_keys with a version of ! the procedure that removes the EDT key mapping from the map list. ! procedure eve$vt200_keys on_error endon_error; remove_key_map(eve$x_key_map_list, eve$x_edt_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt100_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt200_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_standard_keys, ALL); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_vt200_keys); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_standard_keys); eve$x_vt200_keypad := TRUE; endprocedure; ! ! Define numeric keyboard layout for VT100 series keyboards ! We must replace the original eve$vt100_keys with a version of ! the procedure that removes the EDT key mapping from the map list. ! procedure eve$vt100_keys on_error endon_error; remove_key_map(eve$x_key_map_list, eve$x_edt_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt100_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt200_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_standard_keys, ALL); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_vt100_keys); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_standard_keys); eve$x_vt200_keypad := FALSE; endprocedure; ! ! ! ! Define EVE_and_EDT 'EDT style' keyboard layout procedure eve$edt_keys on_error endon_error; remove_key_map(eve$x_key_map_list, eve$x_edt_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt100_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_vt200_keys, ALL); remove_key_map(eve$x_key_map_list, eve$x_standard_keys, ALL); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_edt_keys); add_key_map(eve$x_key_map_list, eve$kt_last, eve$x_standard_keys); endprocedure; ! ! ! procedure eve_default_keypad compile ("procedure eve$edt_want_default_keypad "+ !remember that we "return (1) "+ !do want the default "endprocedure"); !keypad - set (shift_key, key_name (pf1, shift_key)); ! get rid of shift key if get_info (screen, "vt200") then eve$vt200_keys; else eve$vt100_keys; endif; endprocedure ! ! ! procedure eve_edt_keypad compile ("procedure eve$edt_want_default_keypad "+ !remember that we "return (0) "+ !do not want the default "endprocedure"); !keypad - compile ("procedure eve$init_do_key endprocedure"); !disable checking for !a DO key. set (shift_key, pf1); ! set the GOLD key eve$edt_keys; endprocedure ! ! ! procedure eve$init_settings ! We must replace the original eve$init_settings from EVE (VMS V4.4) ! with an eve$init_settings that does not assume that the default keyboard ! configuration is a vt200. ! ! Define eve$x_edt_keys here since the string may be used by eve$vt100_keys ! and eve$vt200_keys before tpu$local_init has a chance to define the string. eve$x_edt_keys := "eve$edt_keys"; ! Edt numeric keypad ! ! Turn off message headers (facility, severity, id) set (message_flags, 1); ! Turn on bell for broadcast messages set (bell, broadcast, on); if eve$edt_want_default_keypad then set (shift_key, key_name (pf1, shift_key)); ! get rid of shift key else set (shift_key, pf1); ! set the GOLD key endif; ! Try to determine if terminal is VT100 or VT200 on VMS V3 and V4. ! If terminal is eight-bit, edit-mode, ansi crt, then assume it ! is a VT200 series terminal. The following determines whether there ! is a VT200 out there and if not sets the VT100 numeric keypad. if not get_info (screen, "vt200") then ! If he say VT200, believe him. if get_info (screen, "vk100") then ! Special case the GiGi if eve$edt_want_default_keypad then eve$vt100_keys; else eve$x_vt200_keypad := FALSE; endif; else if ((get_info (screen, "eightbit")) and ! How VT2xx's looked (get_info (screen, "ansi_crt")) and ! on VMS V3, just in (get_info (screen, "edit_mode"))) then ! case some-one is if eve$edt_want_default_keypad then eve$vt200_keys; else eve$x_vt200_keypad := TRUE; endif; else if eve$edt_want_default_keypad then eve$vt100_keys; else eve$x_vt200_keypad := FALSE; endif; endif; endif; else if eve$edt_want_default_keypad then eve$vt200_keys; else eve$x_vt200_keypad := TRUE; endif; endif; endprocedure ! ! ! procedure eve$edt_user_init !dummy procedure, user can replace it with his own init procedure to run !last of the init procedures. endprocedure ! ! procedure tpu$local_init ! local initialization eve$edt_init_variables; eve$edt_user_init; endprocedure ! ! ! Set up the EVE_and_EDT keypad, save the extended section file, and quit. compile ("procedure eve$edt_want_default_keypad "+ !remember that we "return (1) "+ !want the default "endprocedure"); !keypad - eve$edt_init_keypad; !init edt keypad compile ("procedure eve$edt_init_keypad endprocedure"); !don't need this once !key map is setup. save ("tpu$eveplus:eveandedt"); ! and save the extended section quit;