Comment appeler un interprète elisp interactif dans Emacs?
-
02-07-2019 - |
Question
À l'heure actuelle, j'écris des expressions dans la mémoire tampon * Scratch *
et je les teste en les évaluant avec C-x C-e . J'apprécierais vraiment d'avoir un interprète interactif comme SLIME ou irb, dans lequel je pourrais tester les expressions Lisp d'Emacs.
La solution
Il est facile d'évaluer les expressions Lisp en mode Infer Emacs-Lisp:
M-x ielm
Pour en savoir plus sur cette fonctionnalité, consultez le Emacs. section du manuel sur "Lisp Interaction"
Autres conseils
Eshell est une autre option pour un Elisp interactif. interprète.
M-x eshell
Non seulement c'est un shell de commande comme bash (ou cmd.exe sous Windows), mais vous pouvez aussi écrire et exécuter de manière interactive du code Elisp.
~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2
Votre meilleur pari est le tampon * scratch *
. Vous pouvez le rendre plus comme un REPL en activant d’abord le débogueur:
M-x set-variable debug-on-error t
Ensuite, utilisez C-j
au lieu de C-x C-e
, qui insérera le résultat de l'évaluation de l'expression dans le tampon, à la suite de l'expression. Au lieu d'éléments tels que l'historique des commandes, * * *
, etc., il vous suffit de vous déplacer dans le tampon * scratch *
et de l'éditer.
Si vous voulez que des choses comme * * *
fonctionnent, comme un REPL habituel, essayez ielm
.
M-x ielm
Dans le tampon * scratch *
, tapez simplement C-j pour évaluer l'expression avant le point.
Eh bien, si vous êtes vraiment intéressé par un REPL littéral pour emacs, vous pouvez en écrire un en utilisant le mode -batch 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)
Vous pouvez appeler cela depuis la ligne de commande ou, comme vous semblez le vouloir, depuis un tampon emacs exécutant 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$
Pour n'exécuter qu'une seule expression elisp, vous pouvez utiliser le raccourci M-: et entrer l'expression dans un mini-tampon. Dans les autres cas, vous pouvez utiliser le scratch tampon
.