在哪里/如何存储文本,如果没有在kill-ring / registers [elisp,emacs]

时间:2013-01-20 09:57:07

标签: emacs elisp

我希望能够在2个位置(中间的字符串)之间存储文本,但我不知道在哪里方便地存储它,可能只是在本地,甚至是全局(let或{{ 1}})。答案可能就在那里,但我找不到它。

示例:

我想将文本存储在符号中以便向后搜索。让我们说从(点)到第一个空白字符的区域。

我之前的做法是使用(kill-ring-save),但我知道这是一种不好的做法。

从(这里)setq(点)

我会对这两种更好的技术感兴趣,以及存储字符串的最佳方法,该字符串在(message "hello")左右。

2 个答案:

答案 0 :(得分:2)

常规的简单回答是使用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

答案 1 :(得分:1)

如果您只需要临时本地范围,那么您肯定希望使用let

否则,您通常会定义一个变量(请记住,当您将其命名为elisp没有名称空间时,因此最佳做法是尽可能使用给定库中所有符号名称的唯一前缀)。

(defvar SYMBOL &optional INITVALUE DOCSTRING)

如果省略INITVALUE参数,该变量最初不会被绑定,但会确保您的变量在使用后将使用动态绑定。

然后根据需要只需setq变量。

修改
要获得两点之间的缓冲区内容,请使用

之一
  • (buffer-substring START END)
  • (buffer-substring-no-properties START END)

取决于您是否希望保留文本属性。