! EVE$EDT.TPU 31-DEC-1992 10:17 Page 1 module eve$edt ident "V03-004" ! ! COPYRIGHT © 1987,1992 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. ! !++ ! FACILITY: ! DECTPU - Text Processing Utility ! EVE - Extensible Versatile Editor ! ! ABSTRACT: ! This is the source program for the EVE EDT keypad. ! ! ENVIRONMENT: ! OpenVMS VAX, OpenVMS AXP, RISC/ULTRIX ! !Author: ! ! CREATION DATE: 10-Oct-1986 ! ! MODIFIED BY: ! !-- ! EVE$EDT.TPU Page 2 !++ ! Table of Contents ! ! EVE$EDT.TPU ! 31-DEC-1992 10:17 ! ! Procedure name Page Description ! -------------- ---- ------------ ! ! eve_set_keypad_edt 3 Define EDT emulation keypad keys ! eve$set_edt_keypad 3 Set EDT emulation keypad keys ! eve_set_keypad_noedt 4 Turn off edt emulation keypad ! eve$set_keypad_noedt1 4 Turn off edt keypad ! eve$set_noedt_keypad 5 Set keypad noedt subprocedure ! eve$edt_delete_start_word 6 Delete word (reverse) ! eve$edt_backspace 7 Backspace ! eve$edt_delete_line 8 Delete line ! eve$edt_append 9 Append ! eve$$edt_append_paste 10 Append/paste subprocedure ! eve$edt_delete_word 11 Delete word ! eve$edt_delete_char 12 Delete character ! eve$edt_eol 13 Move to end of line ! eve$edt_char 14 Character ! eve$edt_line 15 Line ! eve$edt_replace 16 Replace ! eve$edt_chngcase 17 EDT style change case ! eve$edt_delete_eol 18 Delete to end of line ! eve$edt_specins 19 SpecIns ! eve$edt_open_line 20 Open line ! eve$edt_substitute 21 Substitute ! eve$edt_sect 22 Section ! eve$edt_section 23 Scroll screen ! eve$edt_fndnxt 24 Find next ! eve$edt_repeat 25 Repeat for EDT and WPS !-- ! EVE$EDT.TPU Page 3 ! Procedure to turn on the EVE EDT keypad ! procedure eve_set_keypad_edt ! Define EDT emulation keypad keys eve$set_edt_keypad; eve$message (EVE$_EDTON); return (TRUE); endprocedure; ! eve_set_keypad_edt procedure eve$set_edt_keypad ! Set EDT emulation keypad keys eve$set_keypad (eve$x_edt_keys, PF1); ! PF1 = GOLD key endprocedure; ! eve$set_edt_keypad ! EVE$EDT.TPU Page 4 procedure eve_set_keypad_noedt ! Turn off edt emulation keypad return (eve$set_keypad_noedt1); endprocedure; ! eve_set_keypad_noedt procedure eve$set_keypad_noedt1 ! Turn off edt keypad (; define_do_flag) ! Turn off the EDT keypad ! Parameter ! define_do_flag = 0 if ok to do only code past call to eve$set_noedt_keypad ! = 1 if ok to call eve$set_noedt_keypad and all code past it ! = 2 or "" or tpu$k_unspecified if ok to do all code local the_keypad, pointer, doit, status; on_error [OTHERWISE]: endon_error; if (define_do_flag = tpu$k_unspecified) or (define_do_flag = "") then doit := 2; else doit := define_do_flag; endif; if doit = 2 then the_keypad := eve$current_keypad; else the_keypad := eve$x_edt_keys; ! widget callback after changing keypad endif; if the_keypad = eve$x_edt_keys then if doit <> 0 then status := eve$set_noedt_keypad (define_do_flag); if status <> eve$k_success then return (status); endif; endif; eve$message (EVE$_EDTOFF); return (TRUE); else ! Assume EVE keypads are of the form EVE$xxx_KEYS. if index (substr (the_keypad, 1, 4), "EVE$") <> 0 then the_keypad := substr (the_keypad, 5, length (the_keypad)); pointer := index (the_keypad, "_KEYS"); if (pointer <> 0) and (pointer <> 1) then the_keypad := substr (the_keypad, 1, pointer - 1); endif; endif; eve$message (EVE$_EDTNOTNO, 0, the_keypad); return (FALSE); ! no learn_abort here endif; endprocedure; ! eve$set_keypad_noedt1 ! EVE$EDT.TPU Page 5 procedure eve$set_noedt_keypad ! Set keypad noedt subprocedure (; define_do_flag) ! Parameter ! define_do_flag = 0 if ok to do only code past call to eve$vt100_keys ! = 1 if ok to call eve$vt100_keys and all code past it ! = 2 or "" or tpu$k_unspecified if ok to do all code local status, doit; on_error [TPU$_CONTROLC]: eve$set_noedt_keypad; eve$learn_abort; abort; [OTHERWISE]: endon_error; if (define_do_flag = tpu$k_unspecified) or (define_do_flag = "") then doit := 2; else doit := define_do_flag; endif; if doit = 2 then eve$set_keypad_gold_off (eve$x_edt_keys); endif; if eve$on_a_pre_lk201 then ! 1 for EDT keypad in eve$init_do_key if doit <> 0 then status := eve$vt100_keys (1, define_do_flag); if status <> eve$k_success then return (status); endif; endif; else eve$numeric_keys; endif; return (TRUE); endprocedure; ! eve$set_noedt_keypad ! EVE$EDT.TPU Page 6 procedure eve$edt_delete_start_word ! Delete word (reverse) !+ ! EDT -- Delete to beginning of word !- on_error [OTHERWISE]: endon_error; return (eve$delete_start_word); endprocedure; ! eve$edt_delete_start_word ! EVE$EDT.TPU Page 7 procedure eve$edt_backspace ! Backspace !+ ! EDT -- Backspace ! Set cursor to beginning of line !- on_error [OTHERWISE]: endon_error; if not eve$declare_intention (eve$k_action_up_left) then return (FALSE); endif; if not (get_info (current_buffer, "bound")) then position (LINE_BEGIN); else if current_offset = 0 then move_vertical (-1); ! Output error message if @ bob endif; position (LINE_BEGIN); ! Make sure we are at 0 endif; return (TRUE); endprocedure; ! eve$edt_backspace ! EVE$EDT.TPU Page 8 procedure eve$edt_delete_line ! Delete line !+ ! EDT -- Delete Line !- local start_mark, line_range, in_prompting_window, saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_erase_to_right) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); if eve$eol_nopad_delete then return (TRUE); endif; if not get_info (current_window, "beyond_eob") then if not (get_info (current_window, "before_bol") or get_info (current_window, "middle_of_tab")) then position (TEXT); ! snap to text endif; else position (TEXT); ! snap to text saved_mark := mark (FREE_CURSOR); endif; if mark (NONE) = end_of (current_buffer) then move_vertical (1); ! force an error message endif; if eve$in_prompting_window then in_prompting_window := TRUE; endif; if in_prompting_window then if current_character = "" then eve$x_restore_line := 0; return (TRUE); endif; endif; start_mark := mark (NONE); move_horizontal (length (current_line) - current_offset); if in_prompting_window then move_horizontal (-1); ! avoid linebreak endif; line_range := create_range (start_mark, mark (NONE), NONE); eve$x_erased_line_forward := TRUE; eve$x_restore_line := eve$erase_text (line_range, eve$x_line_buffer, not in_prompting_window); if eve$x_restore_line = 0 then eve$learn_abort; return (FALSE); endif; if length (eve$x_restore_line) = 0 then position (saved_mark); endif; return (TRUE); endprocedure; ! eve$edt_delete_line ! EVE$EDT.TPU Page 9 procedure eve$edt_append ! Append !+ ! EDT -- Append ! Append the select region to the insert here buffer. ! Slightly modified from eve_remove. !- local saved_mark, ! Saved mark remove_range, ! Range being removed old_range, ! Range that was in the clipboard string_range, ! String range (remove_range + old_range) temp_range, ! Combined ranges a_box, ! Boolean, true if box selection remove_status; ! The remove's status on_error [TPU$_CLIPBOARDNODATA]: eve$message (EVE$_NOINSUSESEL); eve$$release_scratch_buffer; eve$$restore_position (saved_mark); eve$learn_abort; return (FALSE); [TPU$_CLIPBOARDLOCKED]: eve$message (EVE$_CLIPBDREADLOCK); eve$$release_scratch_buffer; eve$$restore_position (saved_mark); eve$learn_abort; return (FALSE); [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$$release_scratch_buffer; eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); eve$$release_scratch_buffer; eve$learn_abort; endon_error; if not eve$declare_intention (eve$k_action_cut) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); remove_range := eve$selection (TRUE,,, eve$x_select_remove_flag,, TRUE); if remove_range <> 0 then a_box := get_info (remove_range, "type") = ARRAY; remove_status := eve$test_if_modifiable (get_info (saved_mark, "buffer")); %if eve$x_option_decwindows %then if eve$x_decwindows_active then if eve$$x_state_array {eve$$k_clipboard} then if not eve$$reserve_scratch_buffer then eve$message (EVE$_ILLSCRATCHRES); return (FALSE); endif; erase (eve$$x_scratch_buffer); position (eve$$x_scratch_buffer); read_clipboard; ! read what is currently in clipboard position (end_of (eve$$x_scratch_buffer)); if a_box then ! A box selection. First goes to eob of paste_buffer so the ! box will be put below the original contents. Leaves cursor at ! start of box. position (remove_range {1}); eve$$box_cut (remove_range, eve$$x_scratch_buffer, remove_status, ! copy/move FALSE); ! no messages position (eve$$x_scratch_buffer); else ! a standard selection, append to end of text in clipboard move_horizontal (-1); copy_text (remove_range); endif; temp_range := create_range (BUFFER_BEGIN, BUFFER_END); write_clipboard ("", temp_range); eve$$release_scratch_buffer; if remove_status then if not a_box then ! erase only if standard selection erase (remove_range); endif; eve$message (EVE$_REMCLIPBOARD); endif; remove_status := TRUE; else ! no clipboard remove_status := eve$$edt_append_paste (remove_range, remove_status); endif; else ! decwindows not active remove_status := eve$$edt_append_paste (remove_range, remove_status); endif; %else ! no decwindows remove_status := eve$$edt_append_paste (remove_range, remove_status); %endif if not a_box ! restore position only if not box selection then ! (box cuts leave cursor at upper-left of box) position (saved_mark); endif; remove_range := 0; return (remove_status); endif; eve$learn_abort; return (FALSE); endprocedure; ! eve$edt_append ! EVE$EDT.TPU Page 10 procedure eve$$edt_append_paste ! Append/paste subprocedure (remove_range, ! range to append remove_flag) ! boolean, true to erase text local saved_mark, ! Marker for current cursor position a_box; ! True if remove_range is box selection array on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); eve$learn_abort; endon_error; saved_mark := mark (NONE); a_box := get_info (remove_range, "type") = ARRAY; position (end_of (paste_buffer)); if mark (NONE) <> beginning_of (paste_buffer) then move_horizontal (-1); if not get_info (mark (NONE), "unmodifiable_records") then erase (create_range (mark (NONE), end_of (paste_buffer), NONE)); else move_horizontal (1); endif; endif; if not a_box then ! a standard selection if remove_flag then move_text (remove_range); eve$message (EVE$_REMCOMPLAPP); else copy_text (remove_range); endif; else ! A box selection. First goes to eob of paste_buffer so the ! box will be put below the original contents. Leaves cursor at ! start of box. position (remove_range {1}); eve$$box_cut (remove_range, paste_buffer, remove_flag, ! copy/move FALSE); ! no messages saved_mark := mark (NONE); ! keep this position position (paste_buffer); if remove_flag then eve$message (EVE$_REMCOMPLAPP); endif; endif; if mark (NONE) = end_of (paste_buffer) then split_line; endif; position (saved_mark); return (TRUE); endprocedure; ! eve$$edt_append_paste ! EVE$EDT.TPU Page 11 procedure eve$edt_delete_word ! Delete word !+ ! EDT -- Delete to end of word !- on_error [OTHERWISE]: endon_error; return (eve$delete_word); endprocedure; ! eve$edt_delete_word ! EVE$EDT.TPU Page 12 procedure eve$edt_delete_char ! Delete character !+ ! EDT -- Delete character !- local delete_eol, char_range, saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_erase_to_right) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); if eve$eol_nopad_delete then return (TRUE); endif; if not get_info (current_window, "beyond_eob") then if not (get_info (current_window, "before_bol") or get_info (current_window, "middle_of_tab")) then position (TEXT); ! snap to text endif; else position (TEXT); ! snap to text saved_mark := mark (FREE_CURSOR); endif; if mark (NONE) = end_of (current_buffer) then move_vertical (1); ! force an error message endif; if current_character = "" then if eve$in_prompting_window then eve$x_restore_char := 0; return (TRUE); else delete_eol := TRUE; endif; else delete_eol := FALSE; endif; char_range := create_range (mark (NONE), mark (NONE), NONE); eve$x_erased_char_forward := TRUE; eve$x_restore_char := eve$erase_text (char_range, eve$x_char_buffer, delete_eol); if eve$x_restore_char = 0 then eve$learn_abort; return (FALSE); endif; if (get_info (current_buffer, "mode") = OVERSTRIKE) then if not delete_eol then eve$insert_text (" "); endif; endif; if length (eve$x_restore_char) = 0 then position (saved_mark); endif; return (TRUE); endprocedure; ! eve$edt_delete_char ! EVE$EDT.TPU Page 13 procedure eve$edt_eol ! Move to end of line !+ ! EDT -- Move to the next End of Line !- local saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_short_move) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); ! for errors position (TEXT); ! snap cursor to text if (current_window = eve$prompt_window) and (mark (NONE) <> end_of (current_buffer)) then if (length (current_line) = eve$x_prompt_length) then return (TRUE); endif; endif; if current_direction = FORWARD then if mark (NONE) <> end_of (current_buffer) then if eve$on_end_of_line then move_horizontal (1); endif; position (LINE_END); else move_vertical (1); ! force an error msg at EOB endif; else if mark (NONE) = beginning_of (current_buffer) then position (saved_mark); move_vertical (-1); ! for error message endif; position (LINE_BEGIN); move_horizontal (-1); endif; return (TRUE); endprocedure; ! eve$edt_eol ! EVE$EDT.TPU Page 14 procedure eve$edt_char ! Character !+ ! EDT -- Move one character in current direction !- local saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_short_move) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); ! for errors if not get_info (current_window, "bound") then if get_info (current_window, "beyond_eob") then position (TEXT); ! snap to text return (TRUE); else if get_info (current_window, "before_bol") then position (TEXT); ! snap to text at left margin if current_direction = REVERSE then move_horizontal (-1); ! force error if at BOB endif; return (TRUE); else if get_info (current_window, "middle_of_tab") then position (TEXT); ! snap to text (left of tab) if current_direction = FORWARD then move_horizontal (1); ! move right over tab endif; return (TRUE); else ! beyond_eol position (TEXT); ! snap to text at EOL endif; endif; endif; endif; if current_direction = FORWARD then move_horizontal (1); else move_horizontal (-1); endif; return (TRUE); endprocedure; ! eve$edt_char ! EVE$EDT.TPU Page 15 procedure eve$edt_line ! Line !+ ! EDT -- Line !- local saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_short_move) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); ! for errors position (TEXT); ! snap cursor to text if current_window = eve$prompt_window then return (TRUE); endif; ! get to start of next/prev line if current_direction = FORWARD then position (LINE_END); move_horizontal (1); else if current_offset = 0 then move_horizontal (-1); else if (current_window = eve$command_window) and (current_offset = eve$x_command_prompt_length) then position (LINE_BEGIN); move_horizontal (-1); endif; endif; position (LINE_BEGIN); endif; ! NOTE: in REVERSE at the end of the prompt in the command window, the ! following 4 lines of code are negated by the command post filter ! which always moves to the end of a new line in the command window. if current_window = eve$command_window then move_horizontal (eve$x_command_prompt_length); endif; return (TRUE); endprocedure; ! eve$edt_line ! EVE$EDT.TPU Page 16 procedure eve$edt_replace ! Replace !+ ! EDT -- Replace (replaces text in the font of the 1st character in ! find string or select range) !- local replace_range, saved_box_flag, saved_mark; on_error [TPU$_CONTROLC]: eve$$release_scratch_buffer; eve$x_box_select_flag := saved_box_flag; eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$release_scratch_buffer; eve$x_box_select_flag := saved_box_flag; eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_modify) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); saved_box_flag := eve$x_box_select_flag; position (TEXT); ! Check to see if we are on the find string or select range. ! If so make it the select. replace_range := eve$selection (TRUE,,, eve$x_select_remove_flag,, TRUE); if replace_range <> 0 then if get_info (replace_range, "type") = ARRAY then ! either a box selection or a standard/find/mouse selection in ! box select mode if not eve$$reserve_scratch_buffer then eve$message (EVE$_ILLSCRATCHRES); return (FALSE); endif; erase (eve$$x_scratch_buffer); position (replace_range {1}); eve$$box_cut (replace_range, eve$$x_scratch_buffer, TRUE, ! delete the box FALSE); ! no messages eve$$release_scratch_buffer; eve$x_box_select_flag := TRUE; else ! standard selection erase (replace_range); endif; if eve_insert_here then eve$clear_message; endif; eve$x_box_select_flag := saved_box_flag; return (TRUE); ! 1 for eve$edt_substitute else position (saved_mark); eve$learn_abort; return (FALSE); ! 0 for eve$edt_substitute endif; endprocedure; ! eve$edt_replace ! EVE$EDT.TPU Page 17 procedure eve$edt_chngcase ! EDT style change case !+ ! EDT -- Change case !- ! Modified to allow cursor to move either forward or reverse direction after ! changing case. local saved_mark, target, a_range, the_index; ! check for active select on_error [OTHERWISE]: endon_error; if not eve$declare_intention (eve$k_action_change_case) then return (FALSE); endif; target := eve$selection (FALSE,,, eve$x_select_remove_flag,, TRUE); if target <> 0 then if get_info (target, "type") = ARRAY then ! a box selection the_index := 1; loop a_range := target {the_index}; exitif a_range = tpu$k_unspecified; change_case (a_range, INVERT); the_index := the_index + 1; endloop; eve$clear_message; return (TRUE); endif; ! a standard selection change_case (target, INVERT); eve$clear_message; return (TRUE); endif; saved_mark := mark (NONE); if saved_mark = end_of (current_buffer) then if current_direction = FORWARD then position (saved_mark); eve$learn_abort; return (FALSE); endif; else ! change case of current character (if non-null) if (current_character <> "") then change_case (create_range (mark (NONE), mark (NONE), NONE), INVERT); endif; endif; if current_direction = FORWARD then move_horizontal (1); return (TRUE); else if saved_mark <> beginning_of (current_buffer) then move_horizontal (-1); return (TRUE); else position (saved_mark); eve$learn_abort; return (FALSE); endif; endif; endprocedure; ! eve$edt_chngcase ! EVE$EDT.TPU Page 18 procedure eve$edt_delete_eol ! Delete to end of line !+ ! EDT -- Delete to the end of the line !- local start_mark, saved_mark, line_range; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; if not eve$declare_intention (eve$k_action_erase_to_right) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); if eve$eol_nopad_delete then return (TRUE); endif; if not get_info (current_window, "beyond_eob") then if not (get_info (current_window, "before_bol") or get_info (current_window, "middle_of_tab")) then position (TEXT); ! snap to text endif; else position (TEXT); ! snap to text saved_mark := mark (FREE_CURSOR); endif; if mark (NONE) = end_of (current_buffer) then move_vertical (1); ! force error message endif; start_mark := mark (NONE); if current_character = "" then if eve$in_prompting_window then eve$x_restore_line := 0; return (TRUE); else move_horizontal (1); endif; endif; if mark (NONE) <> end_of (current_buffer) then move_horizontal (length (current_line) - current_offset); endif; move_horizontal (-1); line_range := create_range (start_mark, mark (NONE), NONE); eve$x_erased_line_forward := TRUE; eve$x_restore_line := eve$erase_text (line_range, eve$x_line_buffer, FALSE); if length (eve$x_restore_line) = 0 then position (saved_mark); endif; return (TRUE); endprocedure; ! eve$edt_delete_eol ! EVE$EDT.TPU Page 19 procedure eve$edt_specins ! SpecIns !+ ! EDT -- SpecIns ! ! Pressing GOLD (i.e., the shift_key) followed by a digit will call ! eve$edt_repeat to read keys until a non-digit is pressed. ! EVE$REPEAT is then called to execute the key which calls this procedure ! if GOLD/KP3 (SPECINS). EVE$EDT_REPEAT handles GOLD/0 GOLD/SPECINS to ! insert the null character. !- local ix, number; on_error [OTHERWISE]: endon_error; if not eve$declare_intention (eve$k_action_add_text) then return (FALSE); endif; if eve$x_repeat_count = 0 then eve$init_repeat; endif; ix := get_info (eve$x_repeat_count, "last"); if ix <> tpu$k_unspecified then number := eve$x_repeat_count {ix}; eve$x_repeat_count {ix} := 1; ! This stops eve$repeat endif; copy_text (ascii (number)); return (TRUE); endprocedure; ! eve$edt_specins ! EVE$EDT.TPU Page 20 procedure eve$edt_open_line ! Open line !+ ! EDT -- Open line !- on_error [OTHERWISE]: endon_error; if not eve$declare_intention (eve$k_action_split_line) then return (FALSE); endif; split_line; move_horizontal (-1); return (TRUE); endprocedure; ! eve$edt_open_line ! EVE$EDT.TPU Page 21 procedure eve$edt_substitute ! Substitute !+ ! EDT -- Substitute !- local saved_mark, right_mark, left_mark; if not eve$declare_intention (eve$k_action_modify) then return (FALSE); endif; saved_mark := mark (FREE_CURSOR); position (TEXT); ! snap to text if eve$x_old_find_direction = REVERSE then if mark (NONE) <> beginning_of (current_buffer) then move_horizontal (-1); left_mark := mark (NONE); endif; else if mark (NONE) <> end_of (current_buffer) then move_horizontal (1); right_mark := mark (NONE); endif; endif; position (saved_mark); if eve$edt_replace then update (current_window); ! to remove found_range if eve$x_old_find_direction = REVERSE then if left_mark <> 0 ! insure we move past current replacement then ! in case replacing same text position (left_mark); move_horizontal (1); ! position to start of text replaced else position (beginning_of (current_buffer)); endif; else if right_mark <> 0 ! insure we move past current replacement then ! in case replacing same text position (right_mark); move_horizontal (-1); ! position to end of text replaced else position (end_of (current_buffer)); endif; endif; return (eve$edt_fndnxt); else return (FALSE); ! eve$edt_replace already did eve$learn_abort endif; endprocedure; ! eve$edt_substitute ! EVE$EDT.TPU Page 22 procedure eve$edt_sect ! Section !+ ! EDT -- Section !- local status, saved_position, the_buffer, the_direction; ! Direction in which to scroll on_error [OTHERWISE]: eve$$restore_position (saved_position); ! command window endon_error; if current_window = eve$prompt_window then return (TRUE); endif; if not eve$declare_intention (eve$k_action_move_by_screen) then return (FALSE); endif; saved_position := mark (FREE_CURSOR); if current_window = eve$command_window then the_buffer := get_info (eve$$x_pre_command_window, "buffer"); the_direction := get_info (the_buffer, "direction"); else the_direction := current_direction; endif; status := eve$edt_section (the_direction); if the_buffer <> 0 ! in command window then position (the_buffer); ! pre-command window position (LINE_BEGIN); position (saved_position); ! command window else position (LINE_BEGIN); endif; return (status); endprocedure; ! eve$edt_sect ! EVE$EDT.TPU Page 23 procedure eve$edt_section ! Scroll screen (direction_to_go) !+ ! EDT Section Key Emulation, use scroll regions set by SET SCROLL MARGINS cmd. !- local how_much_scroll, ! How many lines to scroll visible_length, ! Length of text in window scroll_window, ! Window to be scrolled this_row, saved_window, saved_window_mark, saved_mark, this_column; on_error [TPU$_CONTROLC]: eve$$restore_position (scroll_window); if (get_info (saved_mark, "type") = MARKER) and (not eve$x_bound_cursor) then ! restore the cursor position when free cursoring position (LINE_BEGIN); ! snap cursor to column 1 if mark (NONE) = end_of (current_buffer) then cursor_horizontal (get_info (saved_mark, "offset_column") - 1); else cursor_horizontal (get_info (saved_mark, "offset_column") - get_info (mark (FREE_CURSOR), "offset_column")); endif; endif; if saved_window <> scroll_window then eve$$restore_position (saved_window, saved_window_mark); endif; eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (scroll_window); if (get_info (saved_mark, "type") = MARKER) and (not eve$x_bound_cursor) then ! restore the cursor position when free cursoring position (LINE_BEGIN); ! snap cursor to column 1 if mark (NONE) = end_of (current_buffer) then cursor_horizontal (get_info (saved_mark, "offset_column") - 1); else cursor_horizontal (get_info (saved_mark, "offset_column") - get_info (mark (FREE_CURSOR), "offset_column")); endif; endif; if saved_window <> scroll_window then eve$$restore_position (saved_window, saved_window_mark); endif; endon_error; saved_window := current_window; saved_window_mark := mark (FREE_CURSOR); if saved_window = eve$command_window then ! scroll the choice window if it's mapped if eve$$x_state_array {eve$$k_ambiguous_parse} then if direction_to_go = FORWARD ! Insure the choices buffer scrolls with then ! each next/prev screen key press. return (eve$move_by_screen (1)); else return (eve$move_by_screen (-1)); endif; else ! else scroll text window (not command window) scroll_window := eve$$x_pre_command_window; endif; position (scroll_window); else scroll_window := saved_window; endif; saved_mark := mark (FREE_CURSOR); this_column := get_info (saved_mark, "offset_column"); position (LINE_BEGIN); ! snap cursor to column 1 visible_length := (get_info (scroll_window, "visible_length") - (get_info (scroll_window, "status_line") <> "")); ! the default scroll_percent = 75% how_much_scroll := (visible_length * eve$x_scroll_percent) / 100; if how_much_scroll = 0 then how_much_scroll := 1; endif; if eve$x_units = COORDINATES then how_much_scroll := how_much_scroll * get_info (CHARACTERS, "height"); endif; if direction_to_go = REVERSE then how_much_scroll := -how_much_scroll; endif; this_row := get_info (scroll_window, "current_row"); if this_row = 0 then ! update will put it in row 1 later this_row := get_info (scroll_window, "visible_top"); endif; move_vertical (how_much_scroll); ! "SCROLL" if not eve$x_bound_cursor then ! restore the cursor position when free cursoring if mark (NONE) = end_of (current_buffer) then cursor_horizontal (this_column - 1); else cursor_horizontal (this_column - get_info (mark (FREE_CURSOR), "offset_column")); endif; endif; if saved_window <> scroll_window then eve$$restore_position (saved_window, saved_window_mark); endif; return (TRUE); endprocedure; ! eve$edt_section ! EVE$EDT.TPU Page 24 procedure eve$edt_fndnxt ! Find next ! FNDNXT - find next. If no FIND has completed yet, go to end of line. local no_find_yet; ! Set if nothing to find again if not eve$find_next (no_find_yet) then if no_find_yet then return (eve$edt_eol); ! Go to EOL if no find string ever entered. else eve$learn_abort; return (FALSE); endif; endif; return (TRUE); endprocedure; ! eve$edt_fndnxt ! EVE$EDT.TPU Page 25 procedure eve$edt_repeat ! Repeat for EDT and WPS (digit_value) local char_count, the_number, the_key, the_char, facility, legend, topic; on_error [TPU$_CONTROLC]: if get_info (eve$prompt_window, "buffer") <> 0 then unmap (eve$prompt_window); endif; eve$learn_abort; abort; [TPU$_READABORTED]: if get_info (eve$prompt_window, "buffer") <> 0 then unmap (eve$prompt_window); endif; eve$message (EVE$_READABORTED); return (FALSE); [OTHERWISE]: if get_info (eve$prompt_window, "buffer") <> 0 then unmap (eve$prompt_window); endif; endon_error; if not eve$declare_intention (eve$k_action_repeat) then return (FALSE); endif; the_number := digit_value; map (eve$prompt_window, eve$prompt_buffer); position (eve$prompt_buffer); loop erase (eve$prompt_buffer); copy_text (str (the_number)); char_count := char_count + 1; update (eve$prompt_window); the_key := read_key; if eve$is_mouse (the_key) then eve$message (EVE$_NOMOUSEINPROMPT); else eve$clear_message; the_char := eve$alphabetic (the_key); eve$$parse_comment (the_key, "", facility, legend, topic); if eve$test_synonym ("delete", topic) then the_number := the_number / 10; if (char_count > 0) then char_count := char_count - 1; endif; else exitif the_char = ""; exitif index ("0123456789", the_char) = 0; the_number := (the_number * 10) + int (the_char); if (the_number < 0) or (the_number > 32767) then eve$message (EVE$_NUMTOOBIG); the_number := 0; char_count := 0; endif; endif; endif; endloop; unmap (eve$prompt_window); if the_number = 0 then ! insert null here, can't repeat a zero count if eve$test_synonym ("specins", eve$$lookup_comment (the_key, "")) then copy_text (ascii (0)); return (TRUE); endif; endif; return (eve$repeat (the_number, the_key)); endprocedure; ! eve$edt_repeat ! EVE$EDT.TPU Page 26 ! Module initialization code eve$x_edt_keys := "EVE$EDT_KEYS"; ! key_map string variable if get_info (eve$x_scroll_percent, "type") = UNSPECIFIED then eve$x_scroll_percent := 75; endif; eve$free_cursor; ! declare the keypad help library if eve$x_ultrix_active then eve$declare_help_library ("KEYPAD", "/usr/lib/tpu/eve_keyhelp.hlbu", "", EVE$_INVOKEKEYHELP); else eve$declare_help_library ("KEYPAD", "eve$keyhelp", "", EVE$_INVOKEKEYHELP); endif; endmodule; ! EVE$EDT.TPU Page 27 ! ! EVE$BUILD time executable code ! eve$x_edt_keys := create_key_map ('EVE$EDT_KEYS'); add_key_map (eve$x_keypad_list, "last", eve$x_edt_keys); define_key (eve$$kt_return + "eve_help ('keypad')", PF2, "help (help keypad)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_fndnxt", PF3, "KEYPAD FndNxt", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_line", PF4, "KEYPAD delete_line (Del_L)", eve$x_edt_keys); define_key (eve$$kt_return + "eve_move_by_page", KP7, "move_by_page", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_sect", KP8, "KEYPAD sect", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_append", KP9, "KEYPAD append", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_word", MINUS, "KEYPAD delete_word (Del_W)", eve$x_edt_keys); define_key (eve$$kt_return + "eve_forward", KP4, "forward", eve$x_edt_keys); define_key (eve$$kt_return + "eve_reverse", KP5, "reverse", eve$x_edt_keys); define_key (eve$$kt_return + "eve_remove", KP6, "remove", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_char", COMMA, "KEYPAD delete_character (Del_C)", eve$x_edt_keys); define_key (eve$$kt_return + "eve_move_by_word", KP1, "move_by_word (Word)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_eol", KP2, "KEYPAD EOL", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_char", KP3, "KEYPAD Character (Char)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_line", KP0, "KEYPAD EDT_Line", eve$x_edt_keys); define_key (eve$$kt_return + "eve_select", PERIOD, "Select", eve$x_edt_keys); define_key (eve$$kt_return + "eve_return", ENTER, " return", eve$x_edt_keys); define_key (eve$$kt_return + "eve_help ('keys')", key_name (PF2, SHIFT_KEY), "help (help keys)", eve$x_edt_keys); define_key (eve$$kt_return + "eve_find('')", key_name (PF3, SHIFT_KEY), "Find", eve$x_edt_keys); define_key (eve$$kt_return + "eve_restore_line", key_name (PF4, SHIFT_KEY), " restore_line", eve$x_edt_keys); define_key (eve$$kt_return + "eve_do('')", key_name (KP7, SHIFT_KEY), "do", eve$x_edt_keys); eve$$add_do_key (key_name (KP7, SHIFT_KEY), eve$x_edt_keys); define_key (eve$$kt_return + "eve_fill", key_name (KP8, SHIFT_KEY), "fill", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_replace", key_name (KP9, SHIFT_KEY), "KEYPAD EDT_replace", eve$x_edt_keys); define_key (eve$$kt_return + "eve_restore_word", key_name (MINUS, SHIFT_KEY), " restore_word", eve$x_edt_keys); define_key (eve$$kt_return + "eve_bottom", key_name (KP4, SHIFT_KEY), "Bottom", eve$x_edt_keys); define_key (eve$$kt_return + "eve_top", key_name (KP5, SHIFT_KEY), "Top", eve$x_edt_keys); define_key (eve$$kt_return + "eve_insert_here", key_name (KP6, SHIFT_KEY), "insert_here", eve$x_edt_keys); define_key (eve$$kt_return + "eve_restore_character", key_name (COMMA, SHIFT_KEY), " restore_char", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_chngcase", key_name (KP1, SHIFT_KEY), "KEYPAD ChngCase", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_eol", key_name (KP2, SHIFT_KEY), "KEYPAD Del_EOL", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_specins", key_name (KP3, SHIFT_KEY), "KEYPAD SpecIns", eve$x_edt_keys); ! default action if user pressed GOLD/KP3 ! without having already pressed GOLD/number define_key (eve$$kt_return + "eve$edt_open_line", key_name (KP0, SHIFT_KEY), "KEYPAD Open_Line", eve$x_edt_keys); define_key (eve$$kt_return + "eve_reset", key_name (PERIOD, SHIFT_KEY), "reset", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_substitute", key_name (ENTER, SHIFT_KEY), "KEYPAD Subs", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(0)", key_name ("0", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(1)", key_name ("1", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(2)", key_name ("2", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(3)", key_name ("3", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(4)", key_name ("4", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(5)", key_name ("5", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(6)", key_name ("6", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(7)", key_name ("7", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(8)", key_name ("8", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_repeat(9)", key_name ("9", SHIFT_KEY), "KEYPAD repeat", eve$x_edt_keys); ! Editing Keypad keys for EDT define_key (eve$$kt_return + "eve$edt_section(forward)", E6, "keypad next_screen", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_section(reverse)", E5, "keypad previous_screen", eve$x_edt_keys); ! Control and main keyarray keys defined for EDT define_key (eve$$kt_return + "eve$edt_delete_start_word", CTRL_J_KEY, "KEYPAD delete_previous_word", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_start_word", F13, "KEYPAD delete_previous_word", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_delete_start_word", LF_KEY, "KEYPAD delete_previous_word", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_backspace", CTRL_H_KEY, "KEYPAD BACKSPACE (start_of_line)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_backspace", BS_KEY, "KEYPAD BACKSPACE (start_of_line)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$edt_backspace", F12, "KEYPAD BACKSPACE (start_of_line)", eve$x_edt_keys); define_key (eve$$kt_return + "eve$delete_start_line", CTRL_U_KEY, "KEYPAD delete_start_line", eve$x_edt_keys); define_key (eve$$kt_return + "eve_learn", CTRL_K_KEY, "learn", eve$x_edt_keys); eve$$require ("eve$core"); ! Build dependencies eve$$require ("eve$file"); eve$$require ("eve$format"); eve$$require ("eve$extend"); eve$$require ("eve$edit"); eve$$require ("eve$advanced"); eve$$require ("eve$help");