Emacs 定义函数的局部变量

Emacs 定义函数的局部变量,emacs,let,cursor-position,Emacs,Let,Cursor Position,我正在(愉快地)学习Emacs Lisp编程的介绍,并解决了第一个问题。它说 编写一个搜索字符串的交互式函数。如果 搜索查找字符串,在其后面保留点并显示消息 上面写着“找到了!” 我的解决办法是 (定义测试搜索(字符串) “在文档中搜索字符串。 显示消息“已找到!”或“未找到…” (交互式“sEnter搜索词:”) (省去远足 (缓冲区的开始) (找到setq(搜索前向字符串nil t nil))) (如有发现) (项目 (找到goto字符) (消息“找到!”) (消息“未找到…”) 如何使f

我正在(愉快地)学习Emacs Lisp编程的介绍,并解决了第一个问题。它说

编写一个搜索字符串的交互式函数。如果 搜索查找字符串,在其后面保留点并显示消息 上面写着“找到了!”

我的解决办法是

(定义测试搜索(字符串)
“在文档中搜索字符串。
显示消息“已找到!”或“未找到…”
(交互式“sEnter搜索词:”)
(省去远足
(缓冲区的开始)
(找到setq(搜索前向字符串nil t nil)))
(如有发现)
(项目
(找到goto字符)
(消息“找到!”)
(消息“未找到…”)

如何使
found
成为函数的本地项?我知道
let
语句定义了一个局部变量。但是,我只想在找到
字符串时移动该点。我不清楚如何在本地定义
found
,但如果找不到
字符串,则不能将点设置为缓冲区的
开头。对于这种情况,
let
是正确的命令吗?

如一些评论所述,
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..."))))

编辑:由于“comment”修改了代码。

您确实应该对临时作用域变量使用
let
(这些变量是
let
表单作用域的局部变量,但不是函数的局部变量,除非正在使用词法绑定,并且该变量没有以其他方式标记为动态变量)。例如:
(let((找到)(保存偏移(转到字符(point min)(搜索前向字符串nil t nil))(如果找到…)
或者,您可以在成功搜索后离开point,但在搜索失败后恢复原始位置。请注意,在编写elisp时应使用
(goto char(point min))
而不是
(缓冲区的开头)
。谢谢@phils;)