2

I am an hour new into programming in Emacs lisp. I have a little experience with scheme so I understand the big picture of lisps in general. However, I have only used the "pure functional" subset of scheme and do not know how to do practical tasks.

Write now, I know that C-x C-e will evaluate the code enclosed by the parentheses' by the current cursor position.

I wish to loop from i = 1 to 10 and print the values of i out. How is this done? I tried the following:

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

Emacs tells me: invalid function 0.

  1. How do I do this correctly?
  2. Why is emacs telling me invalid function 0

Feel free to give me tips about how to use the scratch buffer (all I know is C-x C-e evaluates) in emacs. Thanks for all the help!

EDIT1: Could someone tell me how to print out sequential values of i using a while loop?

EDIT2: When I evaluate the code, it opens up another tiny buffer showing each value of i one at a time. However, it is not a large buffer and only shows values of i from 13 to 19. When I try to get into that buffer, it closes immediately. How do I "scroll" through that tiny buffer? Note that I use emacs 24.3 through the terminal

EDIT3: I figured out that the tiny buffer is the Messages buffer. Is there a better way to view the output of my elisp code? The Messages buffer is full of other junk from evaluating things in emacs.

4

3 に答える 3

3

追加のメモとして、いくつかのスキームを知っていると述べたので-典型的なスキーム環境で使用できるインタラクティブなREPLが好きなら、ielmが好きかもしれません-おそらくインタラクティブEmacs Lispモードを表していると思います。わからない。とにかく、M-x ielm RETemacs Lisp REPL を開きます。実際に役立つ場合もあります。たとえば、大量のデータが含まれる変数の内容を調べたい場合、ielm はすべてを出力します。Ielm は私の Emacs に組み込まれています。それがいつ標準ディストリビューションに追加されたのかは定かではありませんが、ソースの最初の著作権は 1994 年と書かれているので、おそらくあなたの Emacs にあるでしょう。

于 2013-08-23T05:59:46.827 に答える
3

何よりもまず、Optionsメニューから「エラー時にデバッガーに入る」を有効にして(setq debug-on-error t)、.(custom-set-variables '(debug-on-error t))~/.emacs.el

次に、次の*Backtrace*バッファを取得しC-x C-eます。

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 print RET理由はわかりますが、結果はここではinsertなく使用したいということですprint

于 2013-08-22T22:20:53.200 に答える
1

Emacs-Lisp の sexps は*scratch*、同じモードまたは (私の好みでは) mode の他のバッファー内またはバッファー内で評価できますemacs-lisp-mode

それを評価するには、sexp の後に (改行) を*scratch*ヒットするだけで済みます。あなたが言ったようにC-j、バッファーでは、sexp の後に使用できます。または、1 つ以上の性別を選択してから使用することもできます。いつものように、どのモードでもそれについて説明し、通常は重要なキーバインディングをリストします。emacs-lisp-modeC-x C-eM-x evaluate-regionC-h m

を使用してグローバル変数の値を確認することもできますC-h v SOME-VAR。また、 を使用して、ミニバッファーからオンザフライで任意の SEXP を評価できますM-:。例えば:M-: (setq foo (+ 42 (length bar)))

デバッガーの書き込み:

  • @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-- edebugElisp のマニュアルを参照してください。好む人もいedebugます。私は好きdebugです。

于 2013-08-22T23:06:35.923 に答える