我希望能够在 2 个位置(中间的字符串)之间存储文本,但我不知道在哪里方便地存储它,可能只是在本地,甚至是全局(let
或setq
)。答案可能就在那里,但我找不到。
例子:
我想将文本存储在符号中以便向后搜索。假设从(点)到第一个空白字符的区域。
我以前这样做的方法是使用 (kill-ring-save),但我知道这是一种不好的做法。
从(这里)(message "hello")
(点)
我会对执行此操作的更好技术以及存储某个字符串的最佳方法感兴趣(point)
。
常规简洁的答案是只使用let
. 与您似乎相信的相反,它不分配全局存储。事实上,它的作用恰恰相反。
(let ((myvalue "temporary string"))
(message myvalue) )
=> "temporary string"
myvalue
=> Lisp error: (void-variable myvalue)
您可以轻松地编写一个带有变量的函数,该变量的值仅在函数执行期间设置。interactive
表格可以让您轻松获取点和标记的值。
(defun mysearch (point mark)
(interactive "r")
(let ((str (buffer-substring-no-properties point mark))
(message "your search for %s can commence ..." str) ) )
一个常见的习惯用法是save-excursion
将点移动到另一个地方,然后抓住原始位置和最终位置之间的区域,然后用它做一些事情。当您退出 时save-excursion
,光标的位置(以及其他一些东西)将恢复到之前的位置。
(defun mysearch ()
(interactive)
(save-excursion
(let ((here (point)) str)
(forward-word -1)
(setq str (buffer-substring-no-properties (point) here))
(message "your search for %s can commence ..." str) ) ) )
也许您还想查看http://ergoemacs.org/emacs/elisp_idioms.html
如果您需要在函数调用之间保留值,那么常见的做法是defvar
使用@phils 建议的变量。几个具有共同前缀的变量听起来像是您应该为自己创建一个单独的模块。对于具有低命名空间占用的灵活解决方案,请创建您自己的解决方案obarray
(并获得某种大师地位)。另请参阅http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Symbols.html#Definition%20of%20mapatoms
如果您只需要一个临时本地范围,那么您肯定要使用let
.
否则,您通常会定义一个变量(在命名它时请记住,elisp 没有名称空间,因此最佳实践是在给定库中为所有符号名称使用可靠唯一的前缀作为实际可行)。
(defvar SYMBOL &optional INITVALUE DOCSTRING)
如果省略 INITVALUE 参数,则变量最初不会被绑定,但会确保您的变量在使用后将使用动态绑定。
然后你只是setq
需要的变量。
编辑:
要获得两点之间的缓冲区内容,请使用
(buffer-substring START END)
(buffer-substring-no-properties START END)
取决于您是否希望保留文本属性。