[英]Where/How to store text, if not in kill-ring/registers [elisp, emacs]
我希望能够在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
(并实现某种guru状态)。 另见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)
取决于您是否希望保留文本属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.