¿Cómo invocar un intérprete elisp interactivo en Emacs?
-
02-07-2019 - |
Pregunta
Ahora mismo escribo expresiones en el búfer * scratch *
y las pruebo evaluando con C-x C-e . Realmente agradecería tener un intérprete interactivo como SLIME o irb, en el que podría probar las expresiones de Emacs Lisp.
Solución
Es fácil evaluar las expresiones Lisp en el Modo Inferior Emacs-Lisp:
M-x ielm
Puede leer más sobre esta función en Emacs sección del manual sobre " Interacción Lisp "
Otros consejos
Eshell es otra opción para un Elisp interactivo. Interprete.
M-x eshell
No solo es un shell de comandos como bash (o cmd.exe si está en Windows) sino que también puede escribir y ejecutar código Elisp de forma interactiva.
~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2
Su mejor apuesta es el búfer * scratch *
. Puede hacerlo más como un REPL activando primero el depurador:
M-x set-variable debug-on-error t
Luego use C-j
en lugar de C-x C-e
, que insertará el resultado de evaluar la expresión en el búfer en la línea después de la expresión. En lugar de cosas como el historial de comandos, * * *
, etc., solo tienes que moverte alrededor del búfer * scratch *
y editar.
Si quieres que cosas como * * *
funcionen, más como un REPL habitual, prueba ielm
.
M-x ielm
En el búfer * scratch *
, simplemente escribe C-j para evaluar la expresión antes del punto.
Bueno, si está realmente interesado en un REPL literal para emacs, es posible escribir uno usando el modo de lote de emacs:
(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)
Puede llamar a esto desde la línea de comandos o, como parece querer, desde un búfer de emacs que ejecuta un shell:
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$
Para ejecutar solo una expresión elisp, puedes usar M-: shortcut y ingresar la expresión en mini-buffer. Para otros casos, puede utilizar scratch buffer