Как вызвать интерактивный интерпретатор elisp в Emacs?
-
02-07-2019 - |
Вопрос
Сейчас я пишу выражения в *scratch*
буфер и протестируйте их, оценивая с помощью С-х C-e.Я был бы очень признателен за наличие интерактивного интерпретатора, такого как SLIME или irb, в котором я мог бы тестировать выражения Emacs Lisp.
Решение
Вычислить выражения Lisp в низшем режиме Emacs-Lisp легко:
M-x ielm
Подробнее об этой функции вы можете прочитать в Раздел руководства Emacs «Взаимодействие с Lisp»
Другие советы
Эшелл — еще один вариант интерактивного интерпретатора Elisp.
M-x eshell
Это не только командная оболочка, такая как bash (или cmd.exe в Windows), но вы также можете в интерактивном режиме писать и выполнять код 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
в *scratch*
буфер, просто введите C-j, чтобы вычислить выражение перед точкой.
Что ж, если вас действительно интересует буквальный REPL для emacs, его можно написать, используя режим -batch 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)
Вы можете вызвать это из командной строки или, как вам кажется, из буфера 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$
Чтобы запустить только одно выражение elisp, вы можете использовать M-:ярлык и введите выражение в мини-буфер.В других случаях вы можете использовать царапать буфер