Emacs Lisp REPL

$ emacs --batch --eval '(while t (message "%s" (eval (read (read-string "> ")))))'
> emacs-version
25.1.1
> (+ 1 2)
3
> (mapcar #'1+ (list 1 2 3))
(2 3 4)
>

Emacs batch 模式的时候,message 写到 stderrread-string 读取 stdin,因此可以在 Shell 中做个 Emacs Lisp REPL。

4 个赞

这还有个:M-x ielm IELM: Inferior Emacs Lisp Mode

为啥要写到stderr? 用princ写到stdout不好吗?

message 默认会加一个换行。重点不是 stdout v.s. stderr,我没想一定要写到后者,当然 stdout 更恰当。

有意思,把这个解释器再弄到 emacs 中,才是名符其实的 eshell – elisp shell.

这里有个支持 Readline 的:

查看IELM的wiki, 这里的 “i”, 为什么是’inferior` 而不是’interactive". 用inferior是lower layer底层的含义还是真"下等的" , 自我解嘲?

too long to read:

inferior means the subprocess that is running from Emacs

2 个赞

这样想起来运行ielm的时候emacs也会强行开一个子进程(自带的hexl)就是为了满足comint-mode。。