Commit f7e7d5a2 authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(sh-search-word): Rewritten for

speed.
parent 001f93f3
......@@ -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'.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment