存储一个sexp评估,因此可以在别处调用(Emacs Lisp)

时间:2013-01-12 22:31:51

标签: emacs lisp eval

我在临时缓冲区中编程很多,而且我经常在某一点评估某个表达式,并且想在其他地方评估相同的表达式(无需为其编写函数)。

一个例子是当我想测试(looking-at "\\<")时,看看我是否在看一个单词的开头。使用eval-last-sexp时,它会评估(point)之前的内容。

所以,这意味着我可以测试:

(looking-at "\\<")<(point)>someword

但我无法在(point)之前测试表达式:

someword<(point)>(looking-at "\\<")

为了测试这个,我实际上做了类似的事情:

(defun foo ()
  (interactive)
  (when (looking-at "\\<") (message "t"))
)

然后在其他位置调用它(有时,当我测试很多时,我甚至会将它绑定到一个键)。

实际上并不难想出“(looking-at)如何表现”的答案,但我感兴趣的问题是,是否可以在某处存储the-last-user-called-sexp,以便它可以通过使用一些函数在缓冲区的其他地方调用:

(defun invoke-last-sexp (sexp)
 (interactive)
 (evaluate the last sexp) ; maybe even (call-interactively) is sometimes needed
)

2 个答案:

答案 0 :(得分:3)

我也希望能够快速评估表格,无论我在哪里 上午。为此,我有一个受到启发的宏 magnars'配置。

(defmacro create-simple-keybinding-command (name key)
  `(progn (defmacro ,name (&rest fns)
            (list 'global-set-key (kbd ,key)
                  `(lambda ()
                     (interactive)
                     ,@fns)))

          (defmacro ,(intern (concat (symbol-name name) "e")) (&rest fns)
            (list 'global-set-key (kbd ,key)
                  `(lambda ()
                     (interactive)
                     (message "%s"
                              (progn
                                ,@fns)))))))

例如,你评估

(create-simple-keybinding-command f9 "<f9>")

您有两个宏f9f9ef9ef9类似 它显示了迷你缓冲区的返回值。在你的情况下,你评估

(f9e (looking-at "\\<"))

现在每次按 f9 时都会评估表单。

您可能希望查看我的emacs配置here,其中我有几个宏或多或少做同样的事情。

答案 1 :(得分:3)

您可能希望使用绑定到M-:密钥的命令。