(sh-search-word): Rewritten for

speed.
This commit is contained in:
Gerd Moellmann 2000-09-19 15:36:55 +00:00
parent 001f93f3eb
commit f7e7d5a26b

View file

@ -3305,44 +3305,92 @@ Argument ARG if non-nil disables this test."
(goto-char next-change)))
))
;; (defun sh-search-word (word &optional limit)
;; "Search forward for regexp WORD occurring as a word not in string nor comment.
;; If found, returns non nil with the match available in \(match-string 2\).
;; Yes 2, not 1, since we build a regexp to guard against false matches
;; such as matching \"a-case\" when we are searching for \"case\".
;; If not found, it returns nil.
;; The search maybe limited by optional argument LIMIT."
;; (interactive "sSearch for: ")
;; (let ((found nil)
;; ;; Cannot use \\b here since it matches "-" and "_"
;; (regexp (sh-mkword-regexp word))
;; start state where)
;; (setq start (point))
;; (while (and (setq start (point))
;; (not found)
;; (re-search-forward regexp limit t))
;; ;; Found str; check it is not in a comment or string.
;; (setq state
;; ;; Stop on comment:
;; (parse-partial-sexp start (point) nil nil nil 'syntax_table))
;; (if (setq where (nth 8 state))
;; ;; in comment or string
;; (if (= where -1)
;; (setq found (point))
;; (if (eq (char-after where) ?#)
;; (end-of-line)
;; (goto-char where)
;; (unless (sh-safe-forward-sexp)
;; ;; If the above fails we must either give up or
;; ;; move forward and try again.
;; (forward-line 1))
;; ))
;; ;; not in comment or string, so accept it
;; (setq found (point))
;; ))
;; found
;; ))
(defun sh-search-word (word &optional limit)
"Search forward for regexp WORD occurring as a word not in string nor comment.
If found, returns non nil with the match available in \(match-string 2\).
Yes 2, not 1, since we build a regexp to guard against false matches
such as matching \"a-case\" when we are searching for \"case\".
If found, returns non-nil, with the match available in \(match-string 2\).
Yes, that is 2, not 1.
If not found, it returns nil.
The search maybe limited by optional argument LIMIT."
The search may be limited by optional argument LIMIT."
(interactive "sSearch for: ")
(let ((found nil)
;; Cannot use \\b here since it matches "-" and "_"
(regexp (sh-mkword-regexp word))
start state where)
start state where match)
(setq start (point))
(while (and (setq start (point))
(not found)
(re-search-forward regexp limit t))
;; Found str; check it is not in a comment or string.
(setq state
;; Stop on comment:
(parse-partial-sexp start (point) nil nil nil 'syntax_table))
(if (setq where (nth 8 state))
;; in comment or string
(if (= where -1)
(setq found (point))
(if (eq (char-after where) ?#)
(end-of-line)
(goto-char where)
(unless (sh-safe-forward-sexp)
;; If the above fails we must either give up or
;; move forward and try again.
(forward-line 1))
))
;; not in comment or string, so accept it
(setq found (point))
))
(debug)
(while (and (not found)
(re-search-forward word limit t))
(setq match (match-data))
;; Found the word as a string; check it occurs as a word.
(when (and (or (= (match-beginning 0) (point-min))
(save-excursion
(goto-char (1- (match-beginning 0)))
(looking-at "[^-a-z0-9_]")))
(or (= (point) (point-max))
(looking-at "[^-a-z0-9_]")))
;; Check it is not in a comment or string.
(setq state
;; Stop on comment:
(parse-partial-sexp start (point) nil nil nil 'syntax_table))
(if (setq where (nth 8 state))
;; in comment or string
(if (= where -1)
(setq found (point))
(if (eq (char-after where) ?#)
(end-of-line)
(goto-char where)
(unless (sh-safe-forward-sexp)
;; If the above fails we must either give up or
;; move forward and try again.
(forward-line 1))))
;; not in comment or string, so accept it
(setq found (point)))
(setq start (point))))
(when found
(set-match-data match)
(goto-char (1- (match-beginning 0)))
(looking-at (sh-mkword-regexp word))
(goto-char found))
found
))
(defun sh-scan-case ()
"Scan a case statement for right parens belonging to case alternatives.
Mark each as having syntax `sh-special-syntax'.