2013-08-22 2 views
2

나는 Emacs lisp에서 프로그래밍에 한 시간 빠릅니다. 나는 스킴에 대한 약간의 경험을 가지고 있으므로 일반적으로 리스프의 큰 그림을 이해합니다. 그러나 필자는 "순수한 기능적"부분 집합만을 사용하여 실제 작업을 수행하는 방법을 모릅니다.Emacs에서 Elisp 평가하기

지금 씁니다. C-x C-e은 괄호로 묶인 코드를 현재 커서 위치로 평가합니다.

i = 1에서 10까지 반복하고 i의 값을 출력하고 싶습니다. 어떻게 이뤄지나요?

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

이맥스는 저에게 말한다 : invalid function 0 나는 다음을 시도했다.

  1. 어떻게 올바르게 수행 할 수 있습니까?
  2. 이유는 이맥스에서 (내가 아는 모든 C-x C-e 평가하여입니다) 나에게 스크래치 버퍼를 사용하는 방법에 대한 팁을 제공 자유롭게 나에게 invalid function 0

을 말하는 이맥스입니다. 모든 도움에 감사드립니다!

EDIT1 : while 루프를 사용하여 i의 순차 값을 출력하는 방법을 알려주시겠습니까?

EDIT2 : 코드를 평가할 때 각 값이 한 번에 하나씩 i 인 다른 작은 버퍼가 열립니다. 그러나 큰 버퍼가 아니며 값은 i에서 13부터 19까지만 나타납니다. 버퍼에 들어가려고하면 바로 닫힙니다. 작은 버퍼를 "스크롤"하는 방법은 무엇입니까? 터미널을 통해 emacs 24.3을 사용합니다.

EDIT3 : 작은 버퍼가 메시지 버퍼라는 것을 알았습니다. elisp 코드의 출력을 보는 더 좋은 방법이 있습니까? Messages 버퍼는 emacs에서 평가하는 다른 정크로 가득 차 있습니다.

+1

'C-h i (eintr) RET'으로 시작하고,'C-h i g (elisp)'일반적으로. (그리고 그것을 사용하는 방법을 배우는 정보 리더의'h') – phils

답변

3

우선 Options 메뉴에서 "디버거를 잘못 입력하십시오"를 활성화하고 ~/.emacs.el(setq debug-on-error t) 또는 (custom-set-variables '(debug-on-error t))을 추가하십시오.

그런 다음 당신은 C-X의 C-E*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는 당신을 말할 것이다, 그러나 결말은 여기 대신 printinsert을 사용할 것입니다.

+0

터미널을 통해 이맥스를 사용했습니다. "errror에 디버거 입력"을 어떻게 활성화합니까? – CodeKingPlusPlus

+0

@ CodeKingPlusPlus : 답안에서'setq' 양식을 평가하십시오. – sds

+0

'setq'를 제'.emacs' 파일에 넣고 내 스크래치 버퍼에서'setq'를 평가하려고했습니다. 코드를 평가하려고해도 여전히 동일한 오류가 발생합니다 ... 그러나로드 할 때 뭔가로 인해 이맥스를 시작할 때 디버거가 나타납니다. 그래서 그것은 그 사건에 대해 작동하는 것이 흥미 롭습니다. – CodeKingPlusPlus

1

*scratch* 또는 다른 모드에서 같은 모드 또는 (선호) 모드 emacs-lisp-mode에서 Emacs-Lisp 섹터를 평가할 수 있습니다.

*scratch*에서 평가하려면 성별 검사 후 C-j (개행) 만 누르면됩니다. emacs-lisp-mode 버퍼에서, 말했듯이 섹스 후에는 C-x C-e을 사용할 수 있습니다. 또는 하나 이상의 암수를 선택한 후 M-x evaluate-region을 사용할 수 있습니다.항상 그렇듯이 어떤 모드에서든 C-h m은 그 사실을 알려주고 중요한 키 바인딩을 나열합니다.

C-h v SOME-VAR을 사용하여 전역 변수 값을 확인할 수도 있습니다. 그리고 M-:을 사용하여 미니 버퍼에서 즉시 섹스를 평가할 수 있습니다. 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을 좋아할 것입니다. 대화식 이맥스 Lisp 모드의 약자라고 생각합니다. 확실하지 않다. 어쨌든, M-x ielm RET은 emacs lisp REPL을 열 것이다. 때로는 실제로 유용합니다. 예를 들어 변수의 내용이 많은 변수를 검사하려면 ielm이 전체를 인쇄합니다. Ielm은 Emacs에 내장되어 있습니다. 표준 배포판에 추가 된시기는 확실하지 않지만 출처의 가장 오래된 저작권은 1994 년이라고되어 ​​있으므로 Emacs에있을 것입니다.

+1

실제로 열등한 Emacs Lisp 모드. – lunaryorn

+0

매우 유용합니다! 하지만 여전히 'i'의 순차 값을 인쇄 할 수 없습니다 – CodeKingPlusPlus

+0

Checkout my latest edit ... – CodeKingPlusPlus