! ! This set of procedures allows you to define a way to "toggle" between two ! different positions (different buffers, etc.). For example, ! DEFINE_KEY ('lsi_last_mark ("REVERSE")', KEY_NAME ("`", SHIFT_KEY)); ! DEFINE_KEY ('lsi_set_oldmark ("REVERSE")', KEY_NAME ('~', SHIFT_KEY)); ! defines GOLD-~ to set the mark at the current position and GOLD-` to set the ! mark and jump to the old mark. ! If the marks are set in different windows, then the window containing the mark ! is used as the current window. ! Note that the video attribute keyword parameter is passed as a string (that's ! the way it is for LSEDIT, so it's maintained for compatibility). ! PROCEDURE lsi_xlate_attr (attr_str) LOCAL video_index; ! video_index := INDEX ("BOLDBLINKREVERSEUNDERLINE", attr_str); CASE video_index FROM 1 TO 16 [1] : RETURN (BOLD); [5] : RETURN (BLINK); [10] : RETURN (REVERSE); [16] : RETURN (UNDERLINE); [INRANGE] : RETURN (NONE); [OUTRANGE] : RETURN (NONE) ENDCASE ENDPROCEDURE PROCEDURE lsi_last_mark (mark_attr_str) LOCAL mark_attr, new_mark; mark_attr := lsi_xlate_attr (mark_attr_str); new_mark := MARK (mark_attr); IF GET_INFO (lsi_oldmark, 'type') = MARKER THEN lsi_goto_mark (lsi_oldmark); ELSE MESSAGE ('No previous mark defined.') ENDIF; lsi_oldmark := new_mark ENDPROCEDURE PROCEDURE lsi_find_window (buffer_ptr) LOCAL window_ptr; window_ptr := GET_INFO (WINDOWS, 'first'); LOOP EXITIF window_ptr = 0; EXITIF (window_ptr <> CURRENT_WINDOW) AND (GET_INFO (window_ptr, 'buffer') = buffer_ptr); window_ptr := GET_INFO (WINDOWS, 'next') ENDLOOP; IF window_ptr <> 0 THEN lsi_find_window := window_ptr ELSE lsi_find_window := CURRENT_WINDOW ENDIF ENDPROCEDURE ! lsi_find_window PROCEDURE lsi_goto_mark (mark_id) LOCAL mark_buf, mark_window; IF GET_INFO (mark_id, 'type') <> MARKER THEN MESSAGE ('GOTO MARK must use a mark.'); ELSE MESSAGE ('Going to mark.'); mark_buf := GET_INFO (mark_id, 'buffer'); mark_window := lsi_find_window (mark_buf); POSITION (mark_id); POSITION (mark_window); LSE$SET_STATUS_LINE (CURRENT_WINDOW) ENDIF ENDPROCEDURE ! lse_goto_mark PROCEDURE lsi_set_oldmark (mark_attr_str) LOCAL mark_attr; mark_attr := lsi_xlate_attr (mark_attr_str); lsi_oldmark := MARK (mark_attr); MESSAGE ('Mark set.'); ENDPROCEDURE