目前我在*scratch*
缓冲区中编写表达式,并通过使用C-x C-e对其进行评估来测试它们。我希望拥有一个像SLIME或irb这样的交互式解释器,可以在其中测试Emacs Lisp表达式。
目前我在*scratch*
缓冲区中编写表达式,并通过使用C-x C-e对其进行评估来测试它们。我希望拥有一个像SLIME或irb这样的交互式解释器,可以在其中测试Emacs Lisp表达式。
Eshell是另一种可用于交互式Elisp解释器的选择。
M-x eshell
它不仅是类似于bash(或Windows上的cmd.exe)的命令行 shell,而且还可以交互式地编写和执行Elisp代码。
~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2
你最好的选择是使用*scratch*
缓冲区。你可以通过先启动调试器使其更像REPL:
M-x set-variable debug-on-error t
C-j
替代C-x C-e
,这将会把表达式的计算结果插入到表达式下一行的缓冲区中。与命令历史记录等不同,你只需在*scratch*
缓冲区中移动并编辑即可。如果想要像通常的REPL一样使用* * *
之类的东西,请尝试使用ielm
。M-x ielm
要运行一个elisp表达式,你可以使用M-:快捷键并在迷你缓冲区中输入表达式。对于其他情况,你可以使用scratch缓冲区。
*scratch*
缓冲区中,只需键入C-j即可评估点前的表达式。如果你真的对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)
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$
解析错误 '(whatever'
(end-of-file repl.el)
有没有简单的方法来解决这个问题? - Michał Kwiatkowski
$ echo (buffer-name) | sed -e 's/\*/X/g'
会得到XeshellX
等结果。 - lindes