2017-04-04 84 views
2

我工作(快樂)工作通過介紹Emacs Lisp編程並已解決了第一個8.7 Searching Exercise。它指出,定義變量本地功能

編寫一個搜索字符串的交互功能。如果 搜索找到該字符串,則在該字符後面留下點,並顯示一條消息 ,其中顯示「找到!」。

我的解決辦法是

(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..."))) 

我如何found是本地的功能?我知道let語句定義了一個局部變量。但是,如果找到string,我只想移動點。我不清楚如何在本地定義found,但如果未找到string,則沒有將該點設置爲beginning-of-bufferlet是否適合這種情況?

+1

對於臨時範圍變量(它是「let」形式的範圍本地,而不是本地的*函數),你應該確實使用'let',除非正在使用詞法綁定,變量是否則標記爲動態)。 – phils

+1

例如:'(let((found(save-excursion(goto-char(point-min))(search-forward string nil t nil))))(if found ...))' – phils

+1

或者,您可以離開成功搜索後單獨指向,但在失敗後恢復原始位置。 – phils

回答

0

正如一些評論指出,let是你要在這裏幹什麼用的,雖然會定義一個局部變量的功能,但它自己的範圍。

您的代碼就變成了:

(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...")))) 

編輯:代碼修改感謝phils「評論。

+0

請注意,在編寫elisp時,應該使用'(goto-char(point-min))'而不是'(緩衝區開始)'。 – phils

+0

謝謝@phils;) – Ealhad