2013-08-22 61 views
2

我是Emacs lisp编程新手。我对方案有一点经验,所以我理解一般的lisps的大概情况。但是,我只使用了方案的“纯功能”子集,不知道如何去做实际的工作。在emacs中评估Elisp

现在写信,我知道C-x C-e将评估由当前光标位置括号括起来的代码。

我希望从i = 1循环到10并打印i的值。这是如何完成的?我试过以下内容:

(defvar i 1) 
(while (< i 11) 
    (print "i: " i) 
    (setq i (+ i 1))) 

Emacs告诉我:invalid function 0

  1. 我该如何正确地做到这一点?
  2. 为什么emacs的告诉我invalid function 0

随意给我关于如何使用临时缓冲区提示(我只知道C-x C-e求值)在Emacs。感谢所有的帮助!

EDIT1:有人能告诉我如何使用while循环打印出i的连续值吗?

编辑2:当我评估代码时,它打开另一个微小的缓冲区,每次显示一个值为i。但是,它不是一个大缓冲区,只显示从13到19的值为i。当我尝试进入该缓冲区时,它立即关闭。我如何“滚动”通过这个微小的缓冲区?请注意,我使用emacs 24.3通过终端

编辑3:我发现微小的缓冲区是消息缓冲区。有没有更好的方法来查看我的elisp代码的输出? Messages缓冲区充满了评估emacs中的东西的其他垃圾。

+1

'C-h i g(eintr)RET'开头,一般是'C-h i g(elisp)'。 (在信息阅读器中用'h'来学习如何使用它。) – phils

回答

3

首先,从Options菜单中启用“错误输入调试器”,并将(setq debug-on-error t)(custom-set-variables '(debug-on-error t))添加到您的~/.emacs.el

然后你会得到C-X C-è一个*Backtrace*缓冲:

Debugger entered--Lisp error: (invalid-function 1) 
    1(10) 
    print("i: " 1) 
    (while (< i 11) (print "i: " i) (setq i (+ i 1))) 
    eval((while (< i 11) (print "i: " i) (setq i (+ i 1))) nil) 
    eval-last-sexp-1(nil) 
    eval-last-sexp(nil) 
    call-interactively(eval-last-sexp nil nil) 
    command-execute(eval-last-sexp) 

这表明错误来自print

C-H f列RET会告诉你为什么,但结果是,你要使用insert而不是print这里。

+0

我通过终端使用了emacs。如何启用“在errror上输入调试器”? – CodeKingPlusPlus

+0

@CodeKingPlusPlus:评估我的答案中的'setq'形式。 – sds

+0

我把'setq'放在我的'.emacs'文件中,并尝试在我的暂存缓冲区中评估'setq'。当我尝试评估代码时,它仍然给出相同的错误...但是,当我启动emacs时出现调试器,因为我加载了一些东西。所以有趣的是,它适用于这种情况... – CodeKingPlusPlus

1

您可以在*scratch*或任何其他相同模式或(我的首选项)模式下的emacs-lisp-mode缓冲区中评估Emacs-Lisp性别比例。

*scratch*你只需要在sexp后点击C-j(换行)来评估它。如您所说,在emacs-lisp-mode缓冲区中,您可以在sexp后使用C-x C-e。或者,您可以在选择一个或多个sexp后使用M-x evaluate-region。与往常一样,任何模式下的C-h m都会告诉您,并且通常会列出重要的键绑定。

您还可以使用C-h v SOME-VAR检查全局变量值。你可以使用M-:来评估minibuffer在运行中的任何sexp。例如:M-: (setq foo (+ 42 (length bar)))

WRT调试器:当引发错误

  • 正如@sds提到,debug-on-error让你在调试器。您也可以设置debug-on-quit,然后使用C-g输入调试器以退出(例如,在循环中)。

  • 如果您知道要调试的功能,可以使用M-x debug-on-entry

  • 使用d单步执行调试程序,或使用c跳到步骤的结尾。使用q退出调试器。

  • 您还可以在源代码中插入调用函数debug作为调试器入口点:(debug)

在调试器中的回溯总是更多的信息,如果您加载相关的源文件例如,foo.el,字节编译的文件,而不是,例如,foo.elc。因此,在使用M-x debug-on-entry之前,请使用C-h f来确定在哪个文件中定义了函数,然后使用M-x load-file /path/to/the/file.el加载该文件。

除了debug之外,还有另一个调试器 - 在Elisp手册中查找edebug。有些人更喜欢edebug;我更喜欢debug

3

正如一个附加说明,因为您提到知道一些方案 - 如果您喜欢在典型方案环境中使用的交互式REPL,您可能会喜欢ielm - 我认为它可能代表交互式Emacs Lisp模式。不确定。无论如何,M-x ielm RET将打开一个emacs lisp REPL。有时它确实很有用 - 例如,当你想要检查一个变量的内容中有很多数据时,ielm会打印出所有的东西。 Ielm内置于我的Emacs中。不知道它何时被添加到标准发行版中,但源代码中最早的版权说明了1994年,所以它可能在您的Emacs中。

+1

实际上是Emacs Lisp模式。 – lunaryorn

+0

非常有帮助!但我仍然无法打印'i' – CodeKingPlusPlus

+0

的连续值结帐我最近的编辑... – CodeKingPlusPlus