Làm cách nào tôi có thể sửa đổi một macro tôi gọi thường xuyên?


7

Tôi sử dụng use-packageđể tổ chức của tôi init.el. Tôi nhận thấy rằng tất cả các tuyên bố của tôi sử dụng :ensure t. Một tuyên bố ví dụ là:

(use-package auto-complete
  :ensure t
  :diminish auto-complete-mode
  :init (global-auto-complete-mode t))

Vì tất cả các use-packagekhai báo của tôi đều sử dụng :ensure t, có cách nào để sửa đổi use-packageđể bao gồm hoàn toàn :ensure tmà không sửa đổi trực tiếp use-pack.el không? Lý tưởng nhất là tôi không muốn sử dụng một chức năng có tên khác.

Tôi có một chút quen thuộc advice-add, nhưng ấn tượng của tôi là cái này được sử dụng để thêm một hook hoặc môi trường vào một hàm, không phải để sửa đổi hàm hoặc macro.


2
Lời khuyên sẽ không giúp ích ở đây, như bạn đã lưu ý: use-packagethực sự là một macro Lisp. Bạn có thể có thể tạo my-use-packagemacro của riêng bạn mở rộng use-packagevới cài đặt mặc định mà bạn thích.
glucas

Macro cũng có thể được khuyên. Trường hợp đóng cửa.
Politza

@politza Đúng - không chắc tôi đang nghĩ gì. :-) Bạn có thể cung cấp một ví dụ về cách nó có thể hoạt động trong trường hợp này? Tôi cho rằng bạn có thể sử dụng :filter-argslời khuyên để thêm từ khóa như thế :ensure tnào?
glucas

Tôi cũng không biết điều đó, trước khi tôi đọc trang thông tin về nadvice.el.
Politza

Tôi hiểu giải pháp ở đây hoạt động nhưng tôi nghĩ điều tương tự cần làm là viết một hàm bao bọc cho gói sử dụng và thay vào đó chỉ sử dụng trình bao bọc đó. Nó rõ ràng hơn nhiều và có vẻ như tất cả các mã liên quan đều nằm dưới sự kiểm soát của bạn.
Joseph Garvin

Câu trả lời:


6

Dựa trên nhận xét của @ politza rằng (tất nhiên!) Lời khuyên hoạt động với macro, tôi đã tìm thấy thứ gì đó có vẻ hiệu quả.

(defun use-package-always-ensure (form)
  (append form '(:ensure t)))

(advice-add #'use-package :filter-args #'use-package-always-ensure)

Lưu ý ví dụ này là sử dụng các chức năng tư vấn Emacs 24.4. Tôi đã không tìm ra những gì tương đương sẽ là cho các phiên bản cũ của Emacs.


Tôi không thực sự chắc chắn việc sử dụng lời khuyên này ảnh hưởng đến hành vi của các tệp biên dịch byte sử dụng macro được tư vấn như thế nào ... Có ai có thể nhận xét về điều đó không?
glucas

1
Macro được đánh giá trong quá trình biên dịch, do đó lời khuyên phải có sẵn tại thời điểm biên dịch, bằng cách sử dụng requiremột tính năng cung cấp lời khuyên hoặc với eval-when-compile.

5

Các phiên bản mới hơn của use-packagecó những điều sau đây để cho phép hành vi này cho tất cả các gói:

(setq use-package-always-ensure t) 

Chỉ trong trường hợp bất cứ ai khác có cùng một câu hỏi.

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.