2010-03-13 6 views
16

필자는 이름이 거의 같지 않은 몇 가지 기능을 작성했습니다. 예를 들어elisp 매크로 함수를 작성 하시겠습니까?

; x is name, such as function/paragraph/line/etc. 
(defun my-x-function 
(interactive) 
(mark-x) (do-more-stuff) (modify-x)) 

은 자동으로 함수, 단락 등 함수를 생성하는 데 사용합니까? 이것이 매크로가하는 느낌인데, 어떻게 사용하는지 모르겠습니다. 당신은 어쩌면 작은 예

감사

답변

21

네 좋은 것/도움이 매크로가 할 정확히입니다. 당신은 이맥스에 *scratch* 버퍼에이 매크로를 복사하여 평가 한 다음 이렇게 작동하는지 확인할 수 있습니다

(defmacro make-my-function (name) 
    (list 'defun (intern (format "my-%s-function" name))() 
     (list 'interactive) 
     (list (intern (format "mark-%s" name))) 
     (list 'do-more-stuff) 
     (list (intern (format "modify-%s" name))))) 

:

(make-my-function x) ; type control-J here 
my-x-function ; <-- Emacs's output 
(symbol-function 'my-x-function) ; type control-J here 
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output 
여기에 사용자가 지정한 패턴에 따라 기능을 기반으로 간단한 매크로입니다

보다 일반적으로 매크로를 작성하는 데 backquote 기능을 사용하지만 모든 매크로는 위의 예와 동일한 방식으로 작동합니다.

+4

+1 역 인용 시설. 매크로의 가독성이 향상됩니다. –

3

매크로는 그렇게 할 수 있지만 이맥스가 유사한 작업을 수행 할 수있는 많은 템플릿 모듈이 있습니다. 빠른 코드 생성 작업을 수행하기 위해 yasnippet.el이라는 것을 사용합니다. 예를 들어 C 소스 파일에서 for<TAB>을 입력하면 for 루프 템플리트를 얻습니다. 변수 이름, 한계 및 내부 루프 내용을 설정하여 템플릿을 채울 수 있습니다.

은 다음과 같습니다 : 당신은 당신이 좋아하는 무엇이든을위한 템플릿을 설정할 수 있습니다

alt text http://i39.tinypic.com/o8tbmq.jpg

. 함수 정의, if 문, switch 문, 뭐든간에. 다양한 모드에 대해 서로 다른 템플릿을 설정하십시오. C의 for 루프에 대한 템플릿은 C#의 for 루프 템플릿과 다릅니다. 매우 편리합니다.

+0

yasnippet은 훌륭하지만 반드시 동일한 것은 아닙니다. emacs는 코드 트리를 변경하는 타이핑이나 * lisp 매크로 *를 복제하는 * 키보드 매크로 *를 가지고 있기 때문에 매크로가 모호합니다. yasnippet은 추상화 할 수없는 일련의 상용구를 입력해야하는 경우에 더 유용합니다 (Lisp보다 C/C++의 경우 더욱 그렇습니다). – Skrylar

관련 문제