[net.sources] Gosling Emacs incremental search package

thomas (10/25/82)

inc-s.ml: Incremental searches
I think this doesn't use any locally defined functions.  If anybody
runs into undefined functions, please let me know and I'll post them.

I also have a fix to get-tty-character which prevents that annoying
"get-tty-character didn't return a value, setq expected it to" message.
I'll post it, too.

Also, if you notice the prompt disappearing if you sit and think for a while,
I have a fix for that (this only happens when you have a subprocess, e.g.
time, running).
=Spencer

----------------------------------------------------------------
(progn

; This code was written at CMU, on or about Sun Jan 25 07:41:13 1981
; by Doug Philips...
; This file attempts to define a reasonable incremental search-facility
; somewhat similar to the incremental search found in MIT Emacs...
; 
; Modified Wed Feb 24 00:07:26 1982 by Spencer W. Thomas at University of
; Utah to better model Twenex incremental search.  In particular, handling
; of failing searches was made compatible.
; 
; Modified Thu Sep 30 17:22:48 1982 by SWT
; Put work functions together into a single function, improved ^G handling.
; Hitting ^G during a failing search returns to the most recent succeeding
; search.  This is exactly what Twenex emacs does.  Fixed a bug which
; prevented the default search string from being rubbed-out.


(declare-global &Inc-search-failing)
(setq &Inc-search-failing "")

(defun 
    (inc-forward-top-level
	(inc-top-level (inc-forward-work-fun))
    )

    (inc-reverse-top-level
	(inc-top-level (inc-reverse-work-fun))
    )

    (inc-top-level string go-to len minibuf
	(setq go-to (dot))
	(setq string "")
	(setq len 0)
	(setq &Inc-search-failing "")
	(arg 1)
	(if (!= go-to (dot))
	    (progn
		  (goto-character go-to)
		  (if search-auto-top-of-window
		      (line-to-top-of-window))))
    )

    (inc-forward-work-fun
	(inc-work-fun "F" '^S' '^R'
	    (search-forward string) (search-reverse string)
	    (forward-add-char)
	    (inc-forward-work-fun) (inc-reverse-work-fun))
	    
    )

    (inc-reverse-work-fun
	(inc-work-fun "R" '^R' '^S'
	    (search-reverse string) (search-forward string)
	    (reverse-add-char)
	    (inc-reverse-work-fun) (inc-forward-work-fun))
    )

; Generalized incremental work function.  Args are:
; 1:	String for search type ("F" or "R")
; 2:	Char for this direction ('^S' or '^R')
; 3:	inverse of 2
; 4:	Search string ((search-forward string) or (search-reverse string))
; 5:	inverse of 4	
; 6:	Add-char function ((forward-add-char) or (reverse-add-char))
; 7:	Work function ((inc-forward-work-fun) or (inc-reverse-work-fun))
; 8:	inverse of 7

    (inc-work-fun next ok nextc failing 
	(if (!= &Inc-search-failing "") (send-string-to-terminal "\^G"))
	(setq ok 1)
	(while (= ok 1)
	       (setq next "")			      ; start with nothing
	       (while (= next "")		      ; loop till we get a
		      ; non-nil character
		      (message (concat &Inc-search-failing
				       "Incremental-" (arg 1)
				       "Search:" string))
		      (setq next (char-to-string (setq nextc
						       (get-tty-character))))
	       )
	       (if (= nextc '^[')			; wants to stay here
		   (progn (setq go-to (dot))	 	; save place
			  (setq ok -1)
			  (if (!= string "") (setq search-string string))
		   )
		   (= nextc '^G') (error-message "Aborted.")

		   (= nextc (arg 2)); search again for same string
		   (if (& (= string "") (= search-string ""))
		       (progn
			     (message "Nothing to search for")
			     (sit-for 2)
		       )
		       (progn first
			      (if (= string "")
				  (progn
					(setq first 1)
					(setq string search-string))
				  (setq first 0)
			      )
			      (save-excursion
				  (if (! (error-occured (arg 4)))
				      (progn
					    (setq failing &Inc-search-failing)
					    (setq &Inc-search-failing "")
					    (setq ok (arg 7))
					    (if (= ok 0) (setq ok 1))
					    (setq &Inc-search-failing failing)
				      )
				      (if (= &Inc-search-failing "")
					  (progn
						(setq &Inc-search-failing
						      "Failing ")
						(send-string-to-terminal
						    "\^G")
						(setq ok 1); assume ok
						(error-occured
						    (setq ok (arg 7)))
						(if (= ok 0) (setq ok 1))
						(setq &Inc-search-failing "")
					  )
					  (send-string-to-terminal "\^G")
				      )
				  )
				  (if first (setq string ""))
			      )
		       )
		   )

		   (= nextc (arg 3)); search in other dir for same string
		   (save-excursion
		       (setq failing &Inc-search-failing)
		       (if (!= string "")
			   (if (error-occured (arg 5))
			       (setq &Inc-search-failing "Failing ")
			       (setq &Inc-search-failing ""))
		       )
		       (setq ok (arg 8))
		       (setq &Inc-search-failing failing)
		       (if (= ok 0) (setq ok 1))
		   )

		   (| (= nextc '^H') (= nextc 127))	; backspace or delete
		   (setq ok 0)

		   (| (& (< nextc '^Q') (!= nextc '^I')
			 (!= nextc '^J') (!= nextc '^M'))
		      (& (> nextc '^Q') (< nextc ' '))
		   )
		   (progn
			 (setq ok -1)
			 (setq go-to (dot))
			 (if (!= string "") (setq search-string string))
			 (push-back-character nextc)
		   )

		   (save-excursion
		       (if (= nextc '^M')
			   (setq next (char-to-string (setq nextc '^J'))))
		       (if (= nextc '^Q')	      ; Control-Q
			   (progn (message (concat &Inc-search-failing
						   "Incremental-Q" (arg 1)
						   "Search:" string))
				  (setq next
					(char-to-string
					    (setq nextc (get-tty-character))))
			   )
		       )
		       (setq failing &Inc-search-failing)
		       (arg 6)
		       (setq &Inc-search-failing failing)
		   )
	       )
	)
	ok
    )

    (inc-recurse err
	(setq string (concat string next))
	(setq len (+ 1 len))
	(setq err (error-occured  (setq ok (arg 1))))
	(if (| (= ok 0) (= err 1))
	    (progn (setq len (- len 1))
		   (if (< len 1)
		       (progn (setq string "")
			      (setq len 0)
		       )
		       (setq string (substr string 1 len))
		   )
		   (if (= err 1)
		       (error-message "Aborted.")
		       (setq ok 1))
	    )
	)
    )

    (forward-add-char
	(if (c= (following-char) nextc)
	    (progn (forward-character)
		   (inc-recurse (inc-forward-work-fun))
	    )
	    (error-occured (search-forward (concat string next)))
	    (progn
		  (setq &Inc-search-failing "Failing ")
		  (if (error-occured (inc-recurse (inc-forward-work-fun)))
		      (if (= failing "")
			  (setq ok 1)
			  (error-message "Aborted."))
		  )
	    )
	    (progn
		  (setq &Inc-search-failing "")
		  (inc-recurse (inc-forward-work-fun))
	    )
	)
    )

    (reverse-add-char
	(if (looking-at (quote (concat string next)))
	    (inc-recurse (inc-reverse-work-fun))
	    (error-occured (search-reverse (concat string next)))
	    (progn
		  (setq &Inc-search-failing "Failing ")
		  (if (error-occured (inc-recurse (inc-reverse-work-fun)))
		      (if (= failing "")
			  (setq ok 1)
			  (error-message "Aborted."))
		  )
	    )
	    (progn
		  (setq &Inc-search-failing "")
		  (inc-recurse (inc-reverse-work-fun)))
	)
    )


)
(declare-global search-string search-auto-top-of-window)
(if (= search-auto-top-of-window "") (setq search-auto-top-of-window 0))
(bind-to-key "inc-forward-top-level" '')
(bind-to-key "inc-reverse-top-level" '')
"Incremental-search loaded!"
)
----------------------------------------------------------------
inc-rs.ml: Incremental regular expression searches
This requires inc-s.ml to be already loaded, since it uses functions
defined therein.
----------------------------------------------------------------
; Incremental regular expression searches
; Written Wed Feb 24 00:23:03 1982 by Spencer W. Thomas
; Based on Incremental search package by Doug Phillips of CMU

(progn

; This code was written at CMU, on or about Sun Jan 25 07:41:13 1981
; by Doug Philips...
; This file attempts to define a reasonable incremental search-facility
; somewhat similar to the incremental search found in MIT Emacs...
; 
; Modified Wed Feb 24 00:07:26 1982 by Spencer W. Thomas at University of
; Utah to better model Twenex incremental search.  In particular, handling
; of failing searches was made compatible.
; 
; Modified Thu Sep 30 17:48:49 1982 by SWT
; Converted to use new generic incremental search functions.
; Fixed "first time fail" bug.

(declare-global &Inc-search-failing)
(setq &Inc-search-failing "")

(defun 
    (inc-re-forward-top-level string go-to len
	(inc-top-level (inc-re-forward-work-fun))
    )
    
    (inc-re-reverse-top-level string len go-to
	(inc-top-level (inc-re-reverse-work-fun))
    )

    (inc-re-forward-work-fun next ok nextc failing
	(inc-work-fun "RE-F" '^S' '^R'
	    (re-search-forward string) (re-search-reverse string)
	    (re-forward-add-char)
	    (inc-re-forward-work-fun) (inc-re-reverse-work-fun))
    )

    (re-forward-add-char error
	(| (!= string "") (looking-at "\\="))
	(region-around-match 0)
	(if (! (setq error (error-occured (looking-at (concat string next)))))
	    (exchange-dot-and-mark))
	(if (& (! error)
	       (error-occured (re-search-forward (concat string next))))
	    (progn
		  (setq &Inc-search-failing "Failing ")
		  (exchange-dot-and-mark)
		  (if (error-occured (inc-recurse (inc-re-forward-work-fun)))
		      (if (= failing "")
			  (setq ok 1)
			  (error-message "Aborted."))
		  )
	    )
	    (progn
		  (setq &Inc-search-failing "")
		  (inc-recurse (inc-re-forward-work-fun))
	    )
	)
    )

    (inc-re-reverse-work-fun
	(inc-work-fun "RE-R" '^R' '^S'
	    (re-search-reverse string) (re-search-forward string)
	    (re-reverse-add-char)
	    (inc-re-reverse-work-fun) (inc-re-forward-work-fun))
    )

    (re-reverse-add-char 
	(if (| (error-occured (looking-at (concat string next)))
	       (looking-at (concat string next)))
	    (inc-recurse (inc-re-reverse-work-fun))
	    (error-occured (re-search-reverse (concat string next)))
	    (progn
		  (setq &Inc-search-failing "Failing ")
		  (if (error-occured (inc-recurse (inc-re-reverse-work-fun)))
		      (if (= failing "")
			  (setq ok 1)
			  (error-message "Aborted."))
		  )
	    )
	    (progn
		  (setq &Inc-search-failing "")
		  (inc-recurse (inc-re-reverse-work-fun)))
	)
    )
)
(declare-global search-string search-auto-top-of-window)
(if (= search-auto-top-of-window "") (setq search-auto-top-of-window 0))
(bind-to-key "inc-re-forward-top-level" "\^[\^S")
(bind-to-key "inc-re-reverse-top-level" "\^[\^R")
"Incremental-search loaded!"
)