Đặt lại biến tùy chỉnh về giá trị mặc định theo chương trình


25

H: Sử dụng Elisp, làm cách nào tôi có thể đặt lại một biến về giá trị mặc định của nó mà không biết giá trị đó là gì?

Tôi đã cố gắng tìm ra cách thực hiện điều này bằng cách hiển thị giao diện Tùy chỉnh cho một biến tôi đặt thành giá trị không mặc định trong tệp init của mình và nhấn C-h ktheo sau là nhấp vào nút "Hoàn nguyên ...". Điều đó mang đến tài liệu cho widget-button-click, mà rõ ràng là không giúp được gì nhiều. (Tương tự, C-h k RETvới điểm trên nút hiển thị trợ giúp Custom-newline, đó cũng không phải là điều tôi đang tìm kiếm.)


3
Liên quan, đối với các vars không tùy chỉnh: emacs.stackexchange.com/q/10800/50
Malabarba

Câu trả lời:


23

C-hig (elisp) Variable Definitions

Trong nội bộ, defcustomsử dụng thuộc tính ký hiệu standard-valueđể ghi biểu thức cho giá trị tiêu chuẩn, saved-valueđể ghi lại giá trị được lưu bởi người dùng với bộ đệm tùy chỉnh và customized-valueghi lại giá trị do người dùng đặt với bộ đệm tùy chỉnh, nhưng không được lưu. Xem thuộc tính biểu tượng . Các thuộc tính này là các danh sách, cartrong đó là một biểu thức đánh giá giá trị.

Vì thế:

(setq foo (eval (car (get 'foo 'standard-value))))

Lưu ý rằng điều này chỉ áp dụng cho defcustomcác biến (tức là "tùy chọn người dùng"). Emacs không lưu giá trị ban đầu của một defvarbiến ở bất cứ đâu.


3
Trên thực tế, bạn cần phải đánh giá vale trong plist. Ví dụ của bạn nên được thay đổi thành: (setq foo (eval (car (get 'foo 'standard-value))))Biểu mẫu giá trị mặc định được tạo bởi defcustomlà một biểu mẫu có funcall và bao đóng (điều này chỉ có thể xảy ra khi bật liên kết từ vựng)
Elias Mårtenson

Bạn có thể muốn sử dụng setq-defaulthơn là setqtrong trường hợp này.
sanityinc

11

Một cách khác, có lẽ là sạch hơn, để đặt lại giá trị của một biến:

custom-reevaluate-settinglà một hàm Lisp được biên dịch trong custom.el.

(custom-reevaluate-setting SYMBOL)

Đặt lại giá trị của SYMBOLbằng cách đánh giá lại giá trị đã lưu hoặc giá trị tiêu chuẩn của nó. Sử dụng :setchức năng để làm như vậy. Điều này hữu ích cho các tùy chọn tùy chỉnh được xác định trước khi giá trị tiêu chuẩn của chúng thực sự có thể được tính toán. Ví dụ: các biến bị đổ có mặc định phụ thuộc vào thông tin thời gian chạy.

Ví dụ:

(custom-reevaluate-setting 'emms-player-next-function)

sẽ thay thế giá trị trước đó bằng ký hiệu đó standard-value.

CHỈNH SỬA

Đọc bình luận @phils dưới đây để biết chi tiết rất quan trọng về chức năng này.


5
Lưu ý " giá trị đã lưu hoặc tiêu chuẩn". Theo thứ tự ưu tiên đó. Nếu người dùng đã tùy chỉnh và lưu một giá trị cho biến, hàm này sẽ đặt lại giá trị đó cho biến đó saved-valuechứ không phải giá trị của nó standard-value.
phils
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.