! ! ! ***** DELETE LINE ***** ! PROCEDURE fred$delete_line if CURRENT_OFFSET = 0 then fred$x_deleted_line := ERASE_LINE; else fred$x_deleted_line := ERASE_CHARACTER (LENGTH (CURRENT_LINE)); MOVE_HORIZONTAL (- CURRENT_OFFSET ); MOVE_VERTICAL(1); if MARK (none) <> END_OF (CURRENT_BUFFER) then APPEND_LINE; else MOVE_HORIZONTAL(-1); endif; endif; fred$x_delete_crlf := 1; fred$x_appended_line := 0; ENDPROCEDURE; ! ! ! ***** DELETE TO THE END OF THE LINE ***** ! !The below line works because the erase_character will stop at the end of line ! we will only pick up from the current point to the end of the line unless ! we are already on the end of line. In this case we are supposed to deleted ! the line terminator plus the entire next line. ! PROCEDURE fred$delete_to_eol !gold kp2 ( delete to end of line) if CURRENT_OFFSET = LENGTH (current_line) then MOVE_VERTICAL(1); if MARK (none) <> END_OF (CURRENT_BUFFER) then MOVE_HORIZONTAL (-CURRENT_OFFSET); fred$x_deleted_line := ERASE_LINE; fred$x_appended_line := 1; fred$x_delete_crlf := 0; else fred$x_appended_line := 0; fred$x_delete_crlf := 1; endif; MOVE_HORIZONTAL (-1); else fred$x_deleted_line := ERASE_CHARACTER (LENGTH (CURRENT_LINE)); fred$x_appended_line := 0; fred$x_delete_crlf := 0; endif; ENDPROCEDURE; ! ! ! ***** UNDELETE LINE ***** ! PROCEDURE fred$undelete_line LOCAL temp_length; if (fred$x_appended_line) then SPLIT_LINE; COPY_TEXT (fred$x_deleted_line); MOVE_HORIZONTAL (-(CURRENT_OFFSET + 1)); else temp_length := LENGTH (fred$x_deleted_line); if (fred$x_delete_crlf = 1) and (MARK (none) <> END_OF (CURRENT_BUFFER)) then SPLIT_LINE; MOVE_HORIZONTAL (-1); endif; COPY_TEXT (fred$x_deleted_line); MOVE_HORIZONTAL( - ( temp_length ) ); endif; ENDPROCEDURE; ! ! ! ***** ON END OF LINE ***** ! PROCEDURE fred$on_end_of_line ! Support routine for undelete if (CURRENT_CHARACTER = fred$x_empty) then fred$on_end_of_line := 1 else fred$on_end_of_line := 0 endif; ENDPROCEDURE; ! ! ! ***** NEXT LINE ***** ! PROCEDURE fred$next_line LOCAL o; 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; ! ! ! ***** MOVE THE NEXT END OF LINE ***** ! PROCEDURE fred$end_of_line if CURRENT_DIRECTION = forward then if MARK (none) <> END_OF (CURRENT_BUFFER) then if fred$on_end_of_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; ! ! ! ***** OPEN LINE ***** ! PROCEDURE fred$open_line SPLIT_LINE; MOVE_HORIZONTAL (-1); ENDPROCEDURE; ! ! Go to the start of the current line (silently). ! Display a message if already at the start of this line. PROCEDURE fred$start_of_line if GET_INFO (CURRENT_WINDOW, eve$kt_beyond_eol) then POSITION (SEARCH (LINE_BEGIN, reverse)); else if CURRENT_OFFSET = 0 then RETURN; else MOVE_HORIZONTAL (- CURRENT_OFFSET); endif; endif; ! In command buffer, don't back up beyond prompt if CURRENT_BUFFER = eve$command_buffer then if SUBSTR (CURRENT_LINE, 1, eve$x_command_prompt_length) = eve$x_command_prompt then MOVE_HORIZONTAL (eve$x_command_prompt_length); endif; endif; ENDPROCEDURE;