I am working (joyfully) through the Introduction to Emacs Lisp Programming and have solved the first 8.7 Searching Exercise. It states,
Write an interactive function that searches for a string. If the search finds the string, leave point after it and display a message that says “Found!”.
My solution is
(defun test-search (string)
"Searches for STRING in document.
Displays message 'Found!' or 'Not found...'"
(interactive "sEnter search word: ")
(save-excursion
(beginning-of-buffer)
(setq found (search-forward string nil t nil)))
(if found
(progn
(goto-char found)
(message "Found!"))
(message "Not found...")))
How do I make found
be local to the function? I know that a let
statement defines a local variable. However, I only want to move point if the string
is found. It's not clear to me how to define found
locally, yet not have the point be set to the beginning-of-buffer
if the string
isn't found. Is let
the proper command for this situation?
As stated in some comments, let
is what you want to use here, although it will not define a variable local to the function, but a scope of its own.
Your code becomes:
(defun test-search (string)
"Searches for STRING in document.
Displays message 'Found!' or 'Not found...'"
(interactive "sEnter search word: ")
(let ((found (save-excursion
(goto-char (point-min))
(search-forward string nil t nil))))
(if found
(progn
(goto-char found)
(message "Found!"))
(message "Not found..."))))
Edit: code modified thanks to phils'comment.