2016-07-21 2 views
3

Emacs 모드를 사용하여 일부 파일에 주석을 추가합니다 (실제 모드는 중요하지 않음). 라이브러리로 제공되며 컴파일 된 lisp 코드가 있습니다 (물론). 그것의 단일 함수를 오버라이드하여 그 동작을 수정하고 싶습니다. 내 이맥스 세션을 위해서. 지금은 라이브러리의 소스 파일에서 함수를 복사하여 붙여 넣은 다음 조금 수정하고 eval-last-sexp을 누르십시오. 여태까지는 그런대로 잘됐다. 그러나 나는 일관성없는 결과를 얻는다 : 이멕스가 .elc 파일의 함수가 소스에서 오는 함수와 어떻게 섞여 있는지를 잘 모르겠다. 때로는 내 자신의 버전의 기능이 실행되고 때로는 원래 버전이 표시되기도합니다. 매우 혼란스럽고 귀찮습니다.Emacs 라이브러리에서 단일 함수 재정의

어떻게하면 이멕스 라이브러리에서 lisp 함수를 일관되게 바꿀 수 있습니까? 읽기 전용 인 라이브러리의 소스 파일을 수정하지 않고도 어떻게해야합니까?

(advice-add 'name-of-func-to-override :override 
      (lambda() (message "does this instead now"))) 

함수 이름 name-of-func-to-override과 버전으로 lambda 교체 :이 같은

답변

1

뭔가 트릭을 할해야합니다.

나는 add-function (및 advice-add) 문서를 보면 :override이 실제로 원하는 것은 아닐 수도 있습니다.

+1

'add-function'과 다른 것들은 Emacs 24.4에서만 추가되었다는 점에주의해야합니다 (Emacs를 업데이트해야합니다). –

1

문제에 대한 가장 일반적인 설명은 다른 라이브러리가로드되기 전에 eval-last-sexp 가끔 복사하는 것입니다. 마지막 하나가 승리합니다!

@Jack에서 제안한대로 advice-add을 사용하는 것이 좋은 해결책입니다. 왜냐하면 해당 재정의는 함수가 정의되기 전에 적용될 수 있고 함수의 정상적인 정의에서 살아남을 수 있기 때문입니다.

많은 경우에 어떤 기능도 재정의 할 필요가 없습니다. 아마도 자신의 이름으로 함수를 정의한 다음 키맵을 변경하여 라이브러리의 함수 대신 함수를 실행하는 것만으로도 충분할 것입니다.