`(Fset SYMBOL KEYMAP)` làm gì?


7

Tôi đã đọc qua tệp nguồn phóng và họ làm như sau:

(defvar projectile-command-map
  (let ((map (make-sparse-keymap)))
    ; define-keys
    map)
  "Keymap for Projectile commands after `projectile-keymap-prefix'.")
(fset 'projectile-command-map projectile-command-map)

tại sao họ lại làm việc này? Là nó cho khả năng tương thích ngược?


1
Tôi biết rất nhiều về cách hoạt động của keymap, nhưng tôi không thể nói cho bạn biết tại sao họ làm điều này. Bạn có thể muốn hỏi họ.
Stefan

Câu trả lời:


9

fsetđặt định nghĩa hàm của ký hiệu .

Ở đây, projectile-command-mapđược sử dụng như một lệnh tiền tố . Lệnh tiền tố là một ký hiệu có định nghĩa hàm là sơ đồ phím.

Định nghĩa của khóa tiền tố thường là sơ đồ phím được sử dụng để tìm kiếm sự kiện sau. Định nghĩa cũng có thể là ký hiệu Lisp có định nghĩa hàm là sơ đồ chính sau đây; hiệu ứng là như nhau, nhưng nó cung cấp một tên lệnh cho khóa tiền tố có thể được sử dụng làm mô tả về khóa tiền tố dùng để làm gì.

Điều này cũng có thể được thực hiện với define-prefix-command.

Có gì một chút bối rối ở đây là các biểu tượng tương tự , projectile-command-map, đang được sử dụng cho hai mục đích:

  • Như một sơ đồ
  • Là một lệnh tiền tố

Một ví dụ khác có thể rõ ràng hơn:

(fset 'help-command help-map)

Ở đây, help-commandrõ ràng là một lệnh tiền tố, trong khi help-maplà một sơ đồ phím.


Xem thêm C-h f defalias(tương tự fset). Xem (elisp) Khóa tiền tố để biết thông tin về các lệnh tiền tố.
vẽ

Điều hơi khó hiểu ở đây là cùng một biểu tượng đang được sử dụng cho hai mục đích: sơ đồ khóa tiền tố và lệnh tiền tố . Sẽ rõ ràng hơn nếu chúng là hai biểu tượng khác nhau, như với help-commandhelp-map .
Tianxiang Xiong

Có thể là như vậy, nhưng đó là cách phổ biến nhất để làm điều đó (một sáo ngữ) - sử dụng cùng một biểu tượng. ( grepCho fsettrong nguồn Lisp, sau đó M-x flush offsetvà tìm kiếm map.)
Drew

1
Nó phổ biến và tôi nói cách được đề xuất để tránh xác định các ký hiệu bổ sung, nhưng nó gây nhầm lẫn cho những người không hiểu rõ về cách hoạt động của keymap. Tôi chỉ đưa ra nhận xét để rõ ràng hơn cho OP.
Tianxiang Xiong

Vâng, tôi hiểu lý do tại sao bạn đưa ra nhận xét, và tôi đồng ý nó có thể gây nhầm lẫn. Tôi không nghĩ lý do là để tránh các biểu tượng phụ. Lý do là để có cùng một biểu tượng tận hưởng cả hai hành vi. Đó là một sáo ngữ lập trình, nhưng mối quan hệ giữa hai người (dù có cùng tên hay không) được ghi lại như vậy. Nó là một lệnh , vì vậy nó có thể được liên kết với một khóa. Nhưng nó cũng là một biến , vì vậy nó có thể hoạt động như một sơ đồ chính. Đây là Lisp-2. ;-)
vẽ
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.