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