我希望能够在2个位置之间存储文本(之间的字符串),但我不知道在哪里方便地存储它,也许只是本地,甚至全局(let
或setq
)。答案可能就在那里,但我找不到。
的例子:
我想在符号中存储文本,以便向后搜索它。假设从(点)到第一个空白字符的区域。
我以前这样做的方法是使用(kill-ring-save),但我知道这是一个不好的做法。
From (here) (message "hello")
(point)
我对这两种更好的技术都很感兴趣,以及存储字符串的最佳方法,这是(point)
周围的东西。
一般的简单答案是只使用let
。与您所认为的相反,它并不分配全局存储。事实上,它的作用正好相反。
(let ((myvalue "temporary string"))
(message myvalue) )
=> "temporary string"
myvalue
=> Lisp error: (void-variable myvalue)
你可以很容易地用一个变量来编写一个函数,这个变量的值只在函数执行期间设置。interactive
表单允许您轻松获取point和mark的值。
(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)
取决于是否希望保留文本属性