123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- %
- % QUERY-REPLACE.SL - Query/Replace command for EMODE
- %
- % Author: Alan Snyder
- % Hewlett-Packard/CRC
- % Date: 6 July 1982
- %
- % This file implements a query-replace command.
- % Modifications by William Galway:
- % "defun" -> "de" so TAGS can find things.
- % "setq" -> "setf"
- % This file requires COMMON, RING-BUFFER, BUFFER-POSITION.
- (fluid '(CurrentLineIndex point CurrentWindowDescriptor Prompt_Window
- last_search_string))
- (de query-replace-command ()
- (let* ((ask t)
- ch pattern replacement
- (pausing nil)
- (pause-message "Command?")
- (normal-message "Replace?")
- (help-message
- "Replace? SPACE:yes RUBOUT:no ESC:exit .:yes&exit ,:yes&show !:do all ^:back")
- (pause-help-message
- "Command? SPACE:go on ESC:exit !:do all ^:back")
- (message normal-message)
- (ring-buffer (ring-buffer-create 16))
- )
- % Get string to replace. Default is last search string (but don't
- % bother to update the default search string. (??))
- (setf pattern
- (prompt_for_string
- "Query Replace (string to replace): "
- last_search_string
- ))
- % Clear out the "default search string" message.
- (show_message "")
- (setf replacement
- (prompt_for_string "Replace string with: " NIL))
- (write-prompt "")
- (while (or pausing (buffer_search pattern 1))
- (if ask
- (progn (if (not pausing)
- (ring-buffer-push ring-buffer (buffer-get-position)))
- (show_message message)
- (setf ch (GetNextCommandCharacter))
- (show_message ""))
- (setf ch (char space)))
- (if pausing
- (selectq ch
- ((#.(char space) #.(char rubout) #/,) (setf pausing nil))
- (#/! (setf ask nil) (setf pausing nil))
- ((#.(char escape) #/.) (exit))
- (#.(char ff) (FullRefresh))
- (#/^ (ring-buffer-pop ring-buffer)
- (buffer-set-position (ring-buffer-top ring-buffer)))
- (#/? (setf message pause-help-message) (next))
- (t (ding))
- )
- (selectq ch
- (#.(char space) (do-string-replacement pattern replacement))
- (#/, (do-string-replacement pattern replacement)
- (setf pausing t))
- (#.(char rubout) (advance-over-string pattern))
- (#/! (do-string-replacement pattern replacement)
- (setf ask nil))
- (#/. (do-string-replacement pattern replacement)
- (exit))
- (#/? (setf message help-message) (next))
- (#.(char escape) (exit))
- (#.(char ff) (FullRefresh))
- (#/^ (ring-buffer-pop ring-buffer)
- (buffer-set-position (ring-buffer-top ring-buffer))
- (setf pausing t))
- (t (ding))
- )
- )
- (setf message (if pausing pause-message normal-message))
- )
- % Show we're done in the prompt window (to avoid "harming" message in
- % the message window).
- (write-prompt "Query Replace Done.")
- ))
- (de do-string-replacement (pattern replacement)
- % Both PATTERN and REPLACEMENT must be single line strings.
- % PATTERN is assumed to be in the current buffer beginning at POINT.
- % It is deleted and replaced with REPLACEMENT.
- % POINT is left pointing just past the inserted text.
- (let ((pattern-length (add1 (size pattern))))
- (delete_or_copy T CurrentLineIndex point
- CurrentLineIndex (+ point pattern-length))
- (insert_string replacement)
- ))
- (de advance-over-string (pattern)
- % PATTERN must be a single line string.
- % PATTERN is assumed to be in the current buffer beginning at POINT.
- % POINT is advanced past PATTERN.
- (let ((pattern-length (add1 (size pattern))))
- (setf point (+ point pattern-length))
- ))
- % "Write a string" into the prompt window (but don't select the prompt
- % window).
- (de write-prompt (string)
- (let ((old-window CurrentWindowDescriptor))
- % Show the string and select the window.
- (show_prompt string)
- % Back to original window.
- (SelectWindow old-window)))
|