Emacs 24.4의 새로운 조언 시스템의 실질적 이점


53

Emacs 24.4는 ​​새로운 조언 시스템과 함께 제공됩니다. NEWS파일은 말한다 :

** 새로운 패키지 nadvice.el는 가벼운 조언 기능을 제공합니다. 다음과 같이 계층화됩니다.

*** add-function/ remove-function, 프로세스 필터 또는 <foo>-function후크 와 같은 모든 기능을 수행하는 장소에서 코드를 추가 / 제거하는 데 사용할 수 있습니다 .

*** advice-add/ advice-remove명명 된 함수에 대한 조언을 추가 / 제거하는 것과 비슷 defadvice합니다.

Q : 이 새로운 패키지의 실질적인 이점과 의미는 무엇입니까?

특히 다음 사항을 다루는 답변에 관심이 있습니다.

  • 애드온 패키지를 작성하는 대신 Emacs를 사용자 정의하기 위해 조언 만 사용하는 경우 새 시스템으로 전환해야합니까? 어느 시점에서 기존 시스템을 대체합니까?

  • 달성 할 수없는 새로운 시스템으로 정확히 무엇을 할 수 defadvice있습니까?

  • "기능을 수행하는 장소에 코드를 추가 / 제거"할 수 있다는 것이 어떤 의미입니까?

답변:


57

새로운 조언 시스템에는 다음과 같은 장점이 있습니다.

  • add-function: 이것은 단순히 defadvice의 일부가 아닌 새로운 기능입니다. add-hook와 사이의 일종의 하이브리드 defadvice입니다. 앞으로 더 많은 foo-function변수 (을 통해 수정 됨 add-function)와 더 적은 foo-functions(을 통해 수정 됨 add-hook)을 기대하십시오. 이 기능은 서로 다른 패키지간에 프로세스 필터를 "공유"하는 방법을 묻는 버그 보고서에 의해 트리거 된 새로운 조언 시스템을 구현하는 주요 동기였습니다.

  • 구현의 단순성 : 일단 add-function구현되면 advice-add100KB의 advice.el의 거의 모든 기능을 제공 하는 기능 을 구현하는 데 8KB 만 소요됩니다 .

  • 설계 단순성 : 대변에는 일반적으로 정확하게 이해하기 어렵고 거의 사용되지 않는 다양한 개념이 있습니다. 예를 들어 "활성화"와 "활성화"조언의 차이점. 또는 "사전"및 / 또는 "컴파일 된"의 의미. 또한 ad-do-it호출이 아닌 변수 참조처럼 보이거나 (setq ad-return-value ...)단순히 값을 반환하기보다는 명시 적으로 지정 해야한다는 등의 문제가 있습니다 .

  • Defadvice는 macroexpansion 및 컴파일과 관련된 다양한 문제를 겪고 있습니다. 권고의 본문은 "코드"(컴파일러와 매크로 확장기에서 볼 수 있음)로 표시되지 않지만 나중에 "데이터"로 표시되어 나중에 식을 구성합니다. 따라서 macroexpansion은 늦게 발생하며 (이러한 것을 사용하면 놀라움을 유발할 수 있음 (eval-when-compile (require 'foo))) 어휘 범위는 올바르게 보존하기가 어렵습니다.

당신이 새로운 시스템으로 전환 할 필요가 있는지에 관해서는 : 나는 미래의 어떤 시점에서 이전 defadvice 제거하려는, 그러나 나는이 미래가 상대적으로 먼 생각 (그리고 처음으로 이동해야합니다 lisp/obsolete이후 다음, GNU ELPA로).


1
구식 조언 시스템에서 제공하는 것과 동일한 인수 수정 기능을 nadvice.el에 추가 할 계획이 있습니까?
Aaron Miller

아닙니다. 어드바이스 함수가 ​​평범한 오래된 일반 함수 인 nadvice.el의 맥락에서는 거의 의미가 없습니다. 그러나 :around조언 ( :filter-args또는 :filter-result조언)을 사용하여 동일한 효과를 얻을 수 있습니다.
Stefan

2
그래도 난 못해 두 번째 인수 만 대체하여 두 가지 인수의 함수를 조언하고 싶습니다. 따라서 권고 된 함수는 첫 번째 인수의 대화 형 양식에 따라 계속 프롬프트됩니다. 새로운 조언은 조언 된 기능의 대화 형 양식 을 대체 하는 몇 가지 다른 방법을 제공하는 것으로 보이지만 그보다 더 미묘한 차이는 없습니다.
Aaron Miller

@AaronMiller : 별도의 SX 질문으로 작성하여 SX 의견의 인위적인 제한없이 논의 할 수 있습니다.
Stefan

emacs.stackexchange.com/q/19233/2162 에서 완료 하십시오 . 추적 해 주셔서 감사합니다. (또한 답변에 언급 한 버그 보고서가 궁금하지만 Google 또는 메일 링리스트 아카이브 검색을 통해 찾을 수 없었습니다. 링크 하시겠습니까?)
Aaron Miller

9

일반적인 기능에 대한 조언의 분명한 이점 중 하나는로 정의를 방문 할 수 있다는 것입니다 find-function.

현재 (새로운 스타일의) 조언 기능에 대한 도움말을 볼 때 조언 기능에 대한 도움말에 대한 링크와 소스에서 기능에 대한 링크 (일반적으로 기능 도움말에 대한)를 제공합니다.

이전 시스템은 docstring 인라인 조언을 제공했지만 코드를 볼 수있는 방법이 없었습니다 (보통 나는 의지했습니다 rgrep).

(개인적으로 인라인 docstring을 사용하는 것을 좋아하여 도움말을 표시하는 기존의 새로운 접근 방식과 새로운 접근 방식이 혼합되어 있기를 원하지만 그 가능성은 확실합니다.)


2
그렇습니다. 새로운 조언 시스템으로 기존 문서 문자열에 추가하는 것을 허용하지 않는 것은 너무 나쁩니다 defadvice. 이멕스 버그 리포트를 참조하십시오 . 단점입니다.
Drew

8

파일 헤더에서 :

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

내가 읽을 때, 주요 목표는 더 많은 기능을 갖지 않고 기존의 조언 시스템보다 단순해야한다는 것입니다. 문서를 읽으면 의 기능 중 일부 가 advice-add포함되어있는 것 같지만 프로세스 필터와 같은 비 전통적인 기능을 조언하기위한 훌륭한 기능 이 포함되어있는 것 같습니다 (아마도 가능 하지만 확실하지 않습니다).defadviceadd-functiondefadvice

내가 아는 한 defadvice공식적으로 더 이상 사용되지 않으므로 지금은 계속 사용하십시오 (패키지 작성자 인 경우 24.4가 더 널리 채택 될 때까지 계속 사용하고 싶습니다). 그러나 Emacs 제작자가 새로운 시스템으로 완전히 마이그레이션하기를 원하는 것처럼 들리므로 천천히 전환하는 것이 좋습니다.


5
다음을 참조하십시오 : 이전 defadvice를 사용한 코드 적응
glucas

예. 새로운 것은 더 이상 다르지 않습니다. 그리고 그렇습니다. 많은 사용이 defadvice있습니다 (그리고 계속 될 것입니다).
Drew

0

어떤 방법이 간단한 방법은 "새로운"통보 시스템의 (더 나은 모듈화와 "풀")로 인해 불구하고 - 나는 여기에 언급 보지 못한 한 가지 있다 다른 답변에서 언급 된 -이 있습니다 : nadvice 조언 을 추가, 결합, 제거, 재정렬 하는 것이 훨씬 쉽습니다 .

nadvice가이를 촉진하기 위해 약간의 도움이 필요하지만 대화식으로, 동적으로 그렇게 할 수도 있습니다. 나는 이런 식으로 nadvice의 다른 사용법을 알지 못하지만 (대화식 조언 구성) 적어도 하나의 응용 프로그램이 있습니다. 검색하는 동안 임의의 Isearch 필터 조건 자 (필터)의 조합을 추가하고 제거 할 수 있도록 Isearch + 에서이를 사용합니다 .

검색 패턴을 증 분식으로 변경하는 것처럼 여러 필터를 사용하여 검색을 세분화 할 수 있습니다.

검색 필터링은 isearch-filter-predicate꽤 오랫동안 사용 가능한 variable을 사용하여 수행됩니다 . 그러나 Isearch 필터는 자주 정의되지 않습니다. 그것들은 일반적으로 주어진 컨텍스트에 대해 정적이며 미리 정의되어 있습니다 (예 : Wdired). 사용자가 최소한 대화식으로 정의하고 사용하는 것은 쉽지 않습니다.

변수 가 하나isearch-filter-predicate이므로 필터링을 변경 하면 실제로 단일 필터 조건자를 변경 하여 함수 구성, 조건 자 결합, 검색 범위를 좁히거나 확장하거나 달리 수정할 수 있습니다.

그러나 이것이 바로 nadvice가 잘하는 것입니다. 요약하면, nadvice는 기능을 결합하는 데 편리하므로 검색 필터링 을 대화식으로 쉽게 구체화 할 수 있습니다 . 이에 대한 자세한 내용은 동적 Isearch 필터링 을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.