2008-09-28 47 views

回答

53

可以很容易地評估劣質Lisp語言表達的Emacs Lisp的模式:

M-x ielm 

你可以閱讀更多有關此功能在Emacs manual section on "Lisp Interaction"

+1

正是我?尋找,非常感謝! – 2008-09-29 00:27:10

1

*scratch*緩衝區中,只需鍵入C-j來計算點前的表達式。

0

好吧,如果你在一個文字REPL爲Emacs真正感興趣的,可以使用emacs的-batch方式來寫一個:

(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) 

您可以從命令行調用此方法,或者,你似乎想從運行shell Emacs的緩衝區內:

[email protected]:~/projects/elisp$ emacs -batch -l test.el 
Loading 00debian-vars... 
> (defvar x '(lambda (y) (* y 100))) 
=> x 
> (funcall x 0.25) 
=> 25.0 
> 
[email protected]:~/projects/elisp$ 
+0

這看起來比它應該更復雜 - 運行一個shell,它運行另一個emacs以批處理模式運行REPL,所有這些都在主emacs運行時內部。無論如何,它解決了我的問題,所以感謝您的幫助! – 2008-09-28 04:57:29

+0

此REPL實現不處理多行輸入。如果你沒有在一個行結束表達它給: 錯誤分析「(無論」 (檔案結尾repl.el) 有一種簡單的方法來解決這個問題 – 2008-09-28 05:14:02

8

你最好的賭注是*scratch*緩衝區。你可以把它更像是通過調試器第一次打開一個REPL:

M-x set-variable debug-on-error t 

然後用C-j代替C-x C-e,這將插入計算表達式插入表達後的行緩衝的結果。而不是諸如命令歷史記錄,* * *等等,您只需移動*scratch*緩衝區並進行編輯。

如果你想讓* * *這樣的東西起作用,更像是一個普通的REPL,試試ielm

M-x ielm 
1

要運行只是一個elisp的表達,你可以使用M-:快捷方式並在迷你緩衝區中輸入表達式。對於其他情況,您可以使用劃傷緩衝區

14

Eshell是另一種交互式Elisp解釋器的選項。

M-x eshell 

它不僅是一個命令行shell諸如bash(或cmd.exe,如果在Windows上),但你也可以交互地編寫和執行elisp的代碼。

~ $ ls 
foo.txt 
bar.txt 
~ $ (+ 1 1) 
2 
相關問題