2015-03-22 10 views
11

This Stack Overflow answer nói với tôi rằng tôi có thể thiết lập kích thước phông chữ Emacs với set-face-attribute:Tại sao một số hàm Emacs không có sẵn thông qua `M-x`?

(set-face-attribute 'default nil :height 100) 

Các ý kiến ​​cho thấy bạn không thể chạy set-face-attribute với Mx:

M-x set-face-attribute [No match]

Thay vào đó, bạn phải chạy nó với M-::

Eval: (set-face-attribute 'default nil :height 100)

Tại sao một số lệnh, như set-face-attribute, không có sẵn thông qua M-x?

+0

Câu hỏi này được mở rộng từ câu hỏi của [DavidS] (http://stackoverflow.com/users/201891/davids) trong [nhận xét này] (http://stackoverflow.com/questions/294664/how-to -set-the-font-size-in-emacs # comment46074287_296316). –

Trả lời

21
  • M-x được ràng buộc với lệnh execute-extended-command, cho phép bạn gõ tên của một lệnh và chạy nó.
  • M-: được liên kết với lệnh eval-expression, cho phép bạn nhập biểu thức S tùy ý có chứa chức năng cuộc gọi và đánh giá nó.

Chức năng, mà bạn có thể gọi với M:, được sử dụng để thực hiện tính năng Emacs, tùy chỉnh (chẳng hạn như trong .emacs của bạn), và plug-in. Các đối số hàm thường được truyền bằng cách gọi hàm trong biểu thức S.

Mọi chức năng có thể cũng là lệnh nếu nó có dạng interactive trong định nghĩa của nó. Biểu mẫu interactive mô tả cách hàm sẽ nhận các đối số của nó khi được gọi là lệnh. Ví dụ: nếu hàm có (interactive "bGive me a buffer: ") trong định nghĩa của nó, thì hàm sẽ được gọi với M-x. Khi người dùng gọi hàm với M-x, Emacs sẽ nhắc người dùng cho tên đệm (vì b) và tên họ nhập sẽ được chuyển làm đối số cho hàm.

Điểm tạo ra một chức năng là một lệnh để làm cho việc gọi nó dễ dàng cho người dùng cuối, không chỉ cho các lập trình viên Emacs Lisp. Lệnh (chạy với M-x) được dễ dàng hơn để chạy một cách tương tác trong các cách sau:

  • Bạn không cần phải bao quanh tên lệnh với () để làm cho nó một S-biểu thức hợp lệ.
  • Đối số có thể được chuyển tự động (chẳng hạn như vị trí con trỏ) hoặc bạn có thể được nhắc cho chúng để bạn không phải nhớ đối số nào là cần thiết.
  • Khi được nhắc cho một đối số, bạn có thể tự động hoàn thành, bởi vì hình thức code characters của interactive (như b) chỉ định kiểu đầu vào mong đợi.

Lý do bạn không thể gọi hàm set-face-attribute với M-x là định nghĩa của nó không chứa một hình thức interactive, vv set-face-attribute không phải là một lệnh. Bạn phải gọi nó là một hàm đơn giản, trong biểu thức S. Bạn có thể làm điều đó từ minibuffer với M-: hoặc từ những nơi khác với bất kỳ số nào khác trong số ways of evaluating code.


Emacs Mini Manual → Concepts → Command có lời giải thích ngắn gọn, khác biệt giữa các chức năng và lệnh bình thường. Relationship between Emacs functions and commands giải thích một số chi tiết không có trong câu trả lời này.

+1

Sáng kiến ​​tốt để đặt nó vào một câu hỏi khác. Về mặt kỹ thuật, câu trả lời của bạn là tuyệt vời, nhưng, để hoàn thành, tôi sẽ thêm rằng từ điểm kinh nghiệm người dùng, nó là không khôn ngoan để lộ tất cả các chức năng như lệnh - điều này cắt không gian tên và làm cho việc hoàn thành tự động ít hữu ích hơn. Vì vậy, hầu hết các chức năng không có sẵn thông qua M-x (theo ý kiến ​​của tôi, vẫn còn quá nhiều lệnh cho một con người cần nhớ trong đó;)) – Vasiliy

Các vấn đề liên quan