在没有ielm模式的emacs中评估简单的elisp缓冲区

时间:2016-03-28 04:03:43

标签: emacs lisp elisp

我有一个简单的elisp脚本,我想用emacs运行。

(defun add-numbers (a b)
  (+ a b))

(add-numbers 2 3)

或者,我可以转到ielm模式并定义一次该函数,然后从ELSIP控制台调用。

我需要一种简单执行脚本的方法。我觉得有一些关键可以让它执行,很可能是c-x c-e但不能使它工作。

enter image description here

我在C-x C-e上遇到以下错误,但它似乎是一种奇怪的调试器模式。

Debugger entered--Lisp error: (void-variable a)
  eval(a nil)
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

有用的参考资料

EvaluatingExpressions

3 个答案:

答案 0 :(得分:3)

我建议您尝试Color到rtfm。

由于您的光标(emacs术语中的“点”)位于符号C-h k C-x C-e之后,因此最后一个表达式为a

由于变量a未绑定,尝试对其进行评估会生成消息a

如果你真的想使用error: (void-variable a),你应该在括号后点击C-x C-e调用并点击defun,然后在第二个表达式之后移动点并再次输入{ {1}}。

如果你想“执行脚本”(在emacs术语中,我们会说“评估缓冲区”),你应该输入C-x C-eC-x C-e

在这种情况下,缓冲区中包含的所有表达式都会被计算,但是没有可见的输出:在你的情况下,解释器将评估M-x eval-buffer RET,它将定义函数Menu > Evaluate buffer(没有输出)。然后解释器将评估计算并返回(defun add-numbers (a b) (+ a b))的表达式add-numbers,但这不会产生任何输出。

尝试输入您的文件

(add-numbers 2 3)
再次

5。您应该在迷你缓冲区(message "result of %s is %d" '(add-numbers 2 3) (add-numbers 2 3)) 中收到消息。

如果您在缓冲区中放置了多个M-x eval-buffer RET,则可以使用快捷方式result of (add-numbers 2 3) is 5(或message)查看所有C-h e

答案 1 :(得分:1)

您需要eval-defun,通常为C-M-x。尽管它的名字,它的作用是寻找当前的顶级形式并对其进行评估。 '电流'是以某种方式定义的,因此它符合您的期望。

答案 2 :(得分:0)

您可以在功能代码中的某处使用C-M-x和指针(光标),或者您可以使用C-x C-e,但指针位于函数末尾。

这意味着,将指针放在函数定义的最后一个右括号后面,然后按C-x C-e,然后将指针移动到函数调用的末尾,再次按下C-x C-e。