Lợi ích thiết thực của hệ thống tư vấn mới trong Emacs 24.4


53

Emacs 24.4 đi kèm với một hệ thống tư vấn mới. Các NEWStập tin nói:

** Gói mới nadvice.elcung cấp các cơ sở tư vấn trọng lượng nhẹ hơn. Nó được xếp lớp là:

*** add-function/ remove-function, có thể được sử dụng để thêm / xóa mã trên bất kỳ vị trí mang chức năng nào, chẳng hạn như bộ lọc quy trình hoặc <foo>-functionmóc.

*** advice-add/ advice-removeđể thêm / xóa một lời khuyên về một chức năng được đặt tên, giống như defadvicekhông.

Q: những lợi ích thiết thực và ý nghĩa của gói mới này là gì?

Tôi đặc biệt quan tâm đến câu trả lời giải quyết các điểm sau:

  • Nếu tôi chỉ sử dụng lời khuyên để tùy chỉnh Emacs (trái ngược với việc viết các gói bổ trợ), tôi có cần chuyển sang hệ thống mới không? Nó sẽ thay thế hệ thống cũ tại một số điểm?

  • Có gì chính xác tôi có thể làm gì với hệ thống mới mà tôi không thể thực hiện với defadvice?

  • Tầm quan trọng của việc có thể "thêm / xóa mã trên bất kỳ nơi mang chức năng nào" là gì?

Câu trả lời:


57

Hệ thống tư vấn mới có những ưu điểm sau:

  • add-function: Đây là chức năng hoàn toàn mới mà đơn giản không phải là một phần của defadvice. Nó là một loại lai giữa add-hookdefadvice. Trong tương lai, mong đợi nhiều foo-functionbiến số hơn (được sửa đổi thông qua add-function) và ít hơn foo-functions(được sửa đổi thông qua add-hook). Chức năng này là động lực chính để thực hiện hệ thống tư vấn mới, được kích hoạt bởi một báo cáo lỗi hỏi cách "chia sẻ" bộ lọc quy trình giữa các gói khác nhau.

  • Đơn giản thực hiện: một khi add-functionđã được thực hiện, chỉ mất 8KB để thực hiện advice-addchức năng mang lại khá nhiều chức năng của 100KB lời khuyên.

  • Thiết kế đơn giản: defadvice có nhiều khái niệm khác nhau thường khó hiểu chính xác và / hoặc hiếm khi được sử dụng. Ví dụ, sự khác biệt giữa lời khuyên "kích hoạt" và "kích hoạt". Hoặc ý nghĩa của "trước" và / hoặc "biên dịch". Ngoài ra còn có các yêu cầu trong việc xử lý ad-do-it, chẳng hạn như thực tế là nó trông giống như một tham chiếu biến thay vì một cuộc gọi, hoặc thực tế là bạn cần phải trả lời (setq ad-return-value ...)rõ ràng thay vì chỉ trả về giá trị.

  • Defadvice bị các vấn đề khác nhau trong quá trình mở rộng và biên dịch macro: phần thân của một lời khuyên không được hiển thị dưới dạng "mã" (mà trình biên dịch và trình khai thác vĩ mô nhìn thấy) mà là "dữ liệu" mà sau này được kết hợp để tạo thành một biểu thức. Vì vậy, việc mở rộng vĩ mô xảy ra muộn (có thể gây ra sự ngạc nhiên nếu bạn sử dụng những thứ như (eval-when-compile (require 'foo))) và phạm vi từ vựng khó bảo tồn chính xác.

Đối với việc bạn cần phải chuyển sang hệ thống mới: Tôi có ý định thoát khỏi defadvice cũ tại một số điểm trong tương lai, nhưng tôi nghĩ rằng trong tương lai này là tương đối xa (và đầu tiên nó sẽ phải di chuyển đến lisp/obsolete, sau đó tới GNU ELPA).


1
Các kế hoạch có tồn tại để thêm vào nadvice.el chức năng sửa đổi đối số tương tự được cung cấp bởi hệ thống tư vấn cũ không?
Aaron Miller

Không, điều đó khá vô nghĩa trong bối cảnh của nadvice.el nơi các chức năng tư vấn là các chức năng bình thường cũ đơn giản. Nhưng bạn có thể sử dụng :aroundlời khuyên ( :filter-argshoặc :filter-resultlời khuyên) để có được hiệu quả tương tự.
Stefan

2
Tôi không thể, mặc dù. Giả sử tôi muốn tư vấn một hàm gồm hai đối số, chỉ thay thế đối số thứ hai, để hàm được khuyên sẽ vẫn nhắc theo hình thức tương tác của nó cho đối số thứ nhất. Lời khuyên mới dường như cung cấp một vài cách khác nhau để thay thế hình thức tương tác của một chức năng được tư vấn, nhưng tôi không thấy bất cứ điều gì mang lại nhiều sắc thái hơn thế.
Aaron Miller

@AaronMiller: Vui lòng đặt câu hỏi SX riêng, để có thể thảo luận mà không có giới hạn nhân tạo của nhận xét SX.
Stefan

Xong, tại emacs.stackexchange.com/q/19233/2162 . Tôi đánh giá cao sự theo dõi của bạn. (Tôi cũng tò mò muốn xem báo cáo lỗi mà bạn đề cập trong câu trả lời của mình, nhưng không thể tìm thấy nó qua Google hoặc tìm kiếm danh sách lưu trữ danh sách gửi thư. Bạn có phiền khi liên kết nó không?)
Aaron Miller

9

Một trong những lợi ích rõ ràng của lời khuyên là các chức năng bình thường là bạn có thể truy cập một định nghĩa với find-function.

Hiện tại, khi xem trợ giúp cho chức năng được tư vấn (kiểu mới), nó cung cấp một liên kết đến trợ giúp cho chức năng tư vấn và từ đó có liên kết đến nguồn (như thường lệ để trợ giúp chức năng).

Hệ thống cũ cung cấp dòng tư vấn doc chuỗi, nhưng không có cách nào để xem mã (tôi thường dùng đến rgrep).

(Cá nhân tôi muốn thấy một sự pha trộn của các phương pháp cũ và mới để hiển thị trợ giúp, vì tôi thích có chuỗi tài liệu nội tuyến, nhưng tôi chắc chắn rằng điều đó có thể xảy ra.


2
Có, thật tệ khi hệ thống tư vấn mới không cho phép bạn thêm vào chuỗi tài liệu hiện có như defadvicehiện tại. Xem báo cáo lỗi Emacs này . Đây là thiếu sót.
vẽ

8

Từ tiêu đề tệp:

;;; 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.

Khi tôi đọc nó, mục tiêu chính là đơn giản hơn hệ thống tư vấn cũ, không có nhiều khả năng hơn. Đọc tài liệu, có vẻ như nó advice-addchứa một tập hợp con của defadvicechức năng, trong khi add-functionchứa một số chức năng hay để tư vấn cho các chức năng phi truyền thống như bộ lọc quy trình (có thể có thể với defadvice, nhưng tôi không chắc làm thế nào).

Theo tôi biết, defadvicekhông chính thức bị từ chối vì vậy bạn nên tiếp tục sử dụng nó ngay bây giờ (và nếu bạn là tác giả gói, bạn có thể muốn tiếp tục sử dụng cho đến khi 24.4 được áp dụng rộng rãi hơn). Tuy nhiên, có vẻ như các tác giả của Emacs muốn chuyển hoàn toàn sang hệ thống mới, vì vậy có lẽ nên chuyển từ từ.



Đúng. Cái mới thì khác, không hơn. Và vâng, có rất nhiều sử dụng defadvicengoài đó (và sẽ tiếp tục).
vẽ

0

Một điều tôi chưa từng thấy được đề cập ở đây - mặc dù trong một số cách, đó là do cách tiếp cận đơn giản hơn (mô đun tốt hơn và "keo") của hệ thống tư vấn "mới", đã được đề cập trong các câu trả lời khác - là: nó dễ dàng hơn nhiều để thêm, kết hợp, loại bỏ, sắp xếp lại , vv lời khuyên nadvice.

Thậm chí có thể thực hiện một cách tương tác, năng động, mặc dù nadvice cần một chút trợ giúp để tạo điều kiện thuận lợi cho việc này. Tôi không nhận thức được cách sử dụng khác của nadvice theo cách này (thành phần tương tác của lời khuyên), nhưng có ít nhất một ứng dụng như vậy. Tôi sử dụng nó trong Isearch + , để cho phép bạn thêm và xóa các kết hợp của các biến vị ngữ bộ lọc Isearch tùy ý (bộ lọc) trong khi tìm kiếm.

IOW, giống như khi bạn thay đổi mẫu tìm kiếm của mình dần dần, vì vậy bạn có thể tinh chỉnh tìm kiếm của mình một cách nhanh chóng bằng nhiều bộ lọc.

Lọc Isearch được thực hiện bằng cách sử dụng biến isearch-filter-predicate, hiện đã có sẵn khá lâu. Tuy nhiên, bộ lọc Isearch không được xác định thường xuyên. Chúng thường tĩnh và được xác định trước cho một bối cảnh nhất định (ví dụ Wdired). Người dùng không dễ dàng xác định và sử dụng chúng, ít nhất là tương tác.

Chỉ có một thay đổi, isearch-filter-predicatenên thay đổi lọc thực sự có nghĩa là thay đổi các thuộc tính lọc duy nhất, mà số tiền để sáng tác các chức năng, kết hợp vị, để thu hẹp, mở rộng, hoặc thay đổi tìm kiếm.

Nhưng đó chính xác là những gì nadvice giỏi. Tóm lại, nadvice rất tiện lợi cho việc kết hợp các chức năng mà nó có thể giúp bạn dễ dàng tinh chỉnh tương tác lọc tìm kiếm. (Xem Lọc động tìm kiếm để biết thêm về điều này.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.