$ 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
写到 stderr
,read-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.
查看IELM的wiki, 这里的 “i”, 为什么是’inferior` 而不是’interactive". 用inferior是lower layer底层的含义还是真"下等的" , 自我解嘲?
too long to read:
inferior means the subprocess that is running from Emacs
2 个赞
cireu
9
这样想起来运行ielm的时候emacs也会强行开一个子进程(自带的hexl
)就是为了满足comint-mode。。