如何在Emacs中调用交互式elisp解释器?

41

目前我在*scratch*缓冲区中编写表达式,并通过使用C-x C-e对其进行评估来测试它们。我希望拥有一个像SLIME或irb这样的交互式解释器,可以在其中测试Emacs Lisp表达式。

6个回答

68

21

Eshell是另一种可用于交互式Elisp解释器的选择。

M-x eshell

它不仅是类似于bash(或Windows上的cmd.exe)的命令行 shell,而且还可以交互式地编写和执行Elisp代码。

~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2

2
好的,这很有趣,混合能力...我一定要多试试。虽然这不是问题的直接答案,但我很高兴这个答案在这里!$ echo (buffer-name) | sed -e 's/\*/X/g'会得到XeshellX等结果。 - lindes

8

你最好的选择是使用*scratch*缓冲区。你可以通过先启动调试器使其更像REPL:

M-x set-variable debug-on-error t

然后使用C-j替代C-x C-e,这将会把表达式的计算结果插入到表达式下一行的缓冲区中。与命令历史记录等不同,你只需在*scratch*缓冲区中移动并编辑即可。如果想要像通常的REPL一样使用* * *之类的东西,请尝试使用ielm
M-x ielm

2

要运行一个elisp表达式,你可以使用M-:快捷键并在迷你缓冲区中输入表达式。对于其他情况,你可以使用scratch缓冲区。


M-:运行eval-expression命令(即shift-alt-<冒号键>) - AAAfarmclub

1
*scratch*缓冲区中,只需键入C-j即可评估点前的表达式。

1

如果你真的对Emacs的文字REPL感兴趣,那么可以使用Emacs的-batch模式编写一个。

(require 'cl)

(defun read-expression ()
  (condition-case
      err
      (read-string "> ")
    (error
     (message "Error reading '%s'" form)
     (message (format "%s" err)))))

(defun read-expression-from-string (str)
  (condition-case
      err
      (read-from-string str)
    (error
     (message "Error parsing '%s'" str)
     (message (format "%s" err))
     nil)))

(defun repl ()
  (loop for expr = (read-string "> ") then (read-expression)
        do
        (let ((form (car (read-expression-from-string expr))))
          (condition-case
              err
              (message " => %s" (eval form))
            (error
             (message "Error evaluating '%s'" form)
             (message (format "%s" err)))))))

(repl)

你可以从命令行调用它,或者从运行shell的emacs缓冲区中调用,正如你想要的那样:
kburton@hypothesis:~/projects/elisp$ emacs -batch -l test.el
Loading 00debian-vars...
> (defvar x '(lambda (y) (* y 100)))
 => x
> (funcall x 0.25)
 => 25.0
> 
kburton@hypothesis:~/projects/elisp$

这看起来比它应该的要复杂 - 运行一个 shell,它在批处理模式下运行另一个 emacs,然后在主 emacs 运行时内部运行 REPL。无论如何,它解决了我的问题,所以感谢您的帮助! - Michał Kwiatkowski
此 REPL 实现不处理多行输入。如果您未在单行中结束表达式,则会出现以下错误:解析错误 '(whatever' (end-of-file repl.el)有没有简单的方法来解决这个问题? - Michał Kwiatkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接