Một cái móc là gì?


8

Chỉ cần làm rõ ... Ví dụ, trong tài liệu này :

Một hook là một biến Lisp chứa một danh sách các hàm, sẽ được gọi trong một số trường hợp được xác định rõ. (Điều này được gọi là chạy hook.) Các hàm riêng lẻ trong danh sách được gọi là các hàm hook của hook. Ví dụ, hook kill-emacs-hookchạy ngay trước khi thoát Emacs ...

Tôi nghĩ rằng nó nói rằng có một biến (ký hiệu) được đặt tên kill-emacs-hookđại diện cho một danh sách một tập hợp các "hàm hook" sẽ chạy khi kill-emacs-hookđược đánh giá, do đó thực hiện các chức năng đó. Chính xác? Sau đó

(add-hook 'text-mode-hook 'auto-fill-mode)

đang thêm auto-fill-modevào danh sách đó được xác định bằng text-mode-hooknhững gì đã có. Tốt Bây giờ này

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

nơi mà dường như chúng ta đang tạo ra hoặc thay đổi text-mode-hook. Bây giờ tôi đang bối rối về bản chất của móc và mối quan hệ của họ với defcustom. Lựa chọn hợp lý của tôi là mã này đang tạo ra một biến text-mode-hookcó "loại" (không biết ý nghĩa của các loại trong elisp) hook. Đây có phải, thực sự, được cho là sáng tạo ban đầu của hook text-mode-hook? Nếu vậy, có gì với "tùy chọn?" Là những chức năng móc được cho là, hoặc cái gì khác?


1
Từ liên kết của bạn: «Từ khóa tùy chọn: chỉ định danh sách giá trị được đề xuất cho biến. Thông thường ,: tùy chọn áp dụng cho một cái móc. Danh sách chỉ là một gợi ý; nó không độc quyền; một người đặt biến có thể đặt nó thành các giá trị khác; danh sách hiển thị theo sau: từ khóa tùy chọn nhằm cung cấp các lựa chọn thuận tiện cho người dùng. »
Sidhekin

Câu trả lời:


6

Sự hiểu biết của bạn về khái niệm Emacs Lisp về hook là hoàn toàn chính xác. Thật vậy, các hook hook bình thường của Viking chỉ là danh sách các hàm (mọi hàm không có đối số, nếu không, nó thường không được gọi là hook hook hay hay hook hook bình thường trong Emacs Lisp).

Hầu hết các biến này có tên kết thúc bằng -hook. Họ là những cái móc bình thường, chạy bằng phương tiện run-hooks. Giá trị của hook như vậy là một danh sách các hàm; các hàm được gọi không có đối số và các giá trị của chúng hoàn toàn bị bỏ qua. Cách được đề xuất để đặt một chức năng mới trên một cái móc như vậy là gọi add-hook.

Các biến có tên kết thúc -functionsthường là các hook bất thường (một số mã cũ cũng có thể sử dụng -hookshậu tố không dùng nữa ); giá trị của chúng là danh sách các hàm, nhưng các hàm này được gọi theo một cách đặc biệt (chúng được truyền đối số hoặc giá trị trả về của chúng được sử dụng). Các biến có tên kết thúc -functioncó các hàm đơn là giá trị của chúng.

Giao diện tùy biến là một điều khác biệt. Tất cả sự khác biệt giữa defvardefcustomlà cái sau cho phép người dùng chỉnh sửa biến thông qua giao diện tùy chỉnh của Wap. Giao diện này có thể tạo điều kiện chỉnh sửa của một số loại dữ liệu, vì vậy ví dụ nếu bạn đang nói rằng :typecủa text-mode-hookhook, sau đó tuỳ biến giao diện làm cho chắc chắn rằng text-mode-hookluôn luôn là một danh sách các chức năng. Hơn nữa, bạn có thể chỉ định tùy chọn nào được khuyến nghị với :optionsđối số.

Vì vậy, sự hiểu biết của bạn là chính xác và defcustomcác tùy chọn của nó chỉ là một cách để hướng dẫn Emacs, vì vậy nó có thể hỗ trợ người dùng tốt hơn khi anh ấy / cô ấy sử dụng giao diện tùy chỉnh của Arnold.


Nhưng ví dụ defcustomnày không tuyệt vời vì text-mode-hookđã tồn tại; Nó đã được bao gồm rồi. Đúng? Bây giờ, nếu tôi viết chế độ của riêng mình và sau đó muốn tùy chỉnh, tôi sẽ làm điều này. Sự nhầm lẫn của tôi là ví dụ này thực sự tạo ra text-mode-hook, không thay đổi nó. Đó có phải là một sự hiểu biết chính xác? Và nếu điều này thực sự tạo ra một cái mới text-mode-hook, thì việc :optionscung cấp hai chức năng đó là các tùy chọn để thực hiện một add-hookdanh sách, phải không?
147 giờ tối

@ 147pm, ví dụ này chỉ cho bạn thấy một số phần mã hiện tại của Emacs xác định biến tùy chỉnh đại diện cho hook như thế nào. Tóm lại defcustomchỉ cần định nghĩa các biến mới. Trong ví dụ cụ thể text-mode-hooknày được tạo và giá trị ban đầu của nó là nil. Giao diện tùy biến cũng được thông báo rằng các giá trị được đề xuất phải có trong danh sách này là turn-on-auto-fillflyspell-mode. Tuy nhiên, bạn có thể đặt text-mode-hookthành bất cứ thứ gì bạn thích theo chương trình, đó là biến bình thường. Bạn có thể sử dụng add-hookvới bất kỳ chức năng khác quá.
Mark Karpov

@ 147, nói cách khác, tất cả các đối số từ khóa chỉ là gợi ý cho hệ thống tùy chỉnh, chúng không tạo ra bất kỳ sự khác biệt nào bên ngoài nó. Không có gợi ý rằng số tiền mã (defvar text-mode-hook nil).
Mark Karpov

Nhưng đây có phải là defcustomcách hook ban đầu được tạo ra? Đó là những gì nó trông giống như. Nói cách khác, ví dụ này được lấy từ sâu trong ruột của mã Emacs ở đâu đó.
147 giờ tối

@ 147pm, đúng, đúng.
Đánh dấu Karpov
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.