【问题标题】:evaluate simple elisp buffer in emacs without ielm mode在没有 ielm 模式的情况下评估 emacs 中的简单 elisp 缓冲区
【发布时间】:2016-03-28 04:03:43
【问题描述】:

我有一个简单的 elisp 脚本,如下所示,我想使用 emacs 运行它。

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

(add-numbers 2 3)

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

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

我在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

【问题讨论】:

    标签: emacs lisp elisp


    【解决方案1】:

    我建议你尝试C-h k C-x C-e 到 rtfm。

    由于您的光标(“点”,在 emacs 术语中)就在符号 a 之后,所以最后一个表达式是 a

    由于变量a 未绑定,因此尝试对其求值会产生消息error: (void-variable a)

    如果你真的想使用C-x C-e,你应该在结束defun调用的括号后单击并输入C-x C-e,然后将点移到第二个表达式后面并再次输入C-x C-e

    如果您想“执行脚本”(在 emacs 术语中,我们会说“评估缓冲区”),您应该输入 M-x eval-buffer RETMenu > 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。您应该在 minibuffer result of (add-numbers 2 3) is 5 中收到消息。

    如果您在缓冲区中放置了多个message,则可以使用快捷方式C-h e(或M-x view-echo-area-messages RET)查看所有这些。

    【讨论】:

    • 太棒了。我通过C-x C-e 让它工作了两次,一次是在函数中,一次是在调用时。但对M-x eval-buffer 感兴趣。但它什么也没做。
    • 当您执行M-x eval-buffer RET 时,它不会什么都不做!它评估缓冲区的全部内容。在您的情况下,它定义了函数add-numbers。您可以使用全新的 emacs 验证此断言,在其中尝试 M-: (add-numbers 1 2) RET => 您将收到错误 (void-function add-numbers)。也许您将不得不退出调试器(使用字母q)。然后你去你的缓冲区做M-x eval-buffer RET然后再试一次M-: (add-numbers 1 2) RET。这一次,你会在 minibuffer 中得到结果3,这就是eval-buffer 定义了函数的证明!
    【解决方案2】:

    你想要eval-defun,通常是C-M-x。尽管有它的名字,但它所做的是寻找当前的顶级表单并对其进行评估。 'Current' 以某种方式定义,因此它可以满足您的期望。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 2017-04-13
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多