Mỗi lệnh là một chức năng, nhưng không phải mọi chức năng cũng là một lệnh. 1
Một lệnh bao gồm một cuộc gọi đến interactive
; đây là lý do tại sao các lệnh thường được gọi là "các chức năng tương tác". Các lệnh có thể được gọi thông qua M-x name-of-command
RETvà chúng cũng có thể được liên kết với một chuỗi khóa. Các hàm thông thường không bao gồm lệnh gọi interactive
, không thể được gọi bằng cách sử dụng M-xvà bạn không thể liên kết chúng với một chuỗi khóa. Để chạy một hàm không tương tác, bạn có thể nhấn M-:( eval-expression
), nhập tên của hàm theo sau là các giá trị cho bất kỳ đối số nào nó cần được đặt trong ngoặc đơn và nhấn RET:
M-: (name-of-function arg1 arg2 arg3)
RET
Nếu chức năng không được phép hoạt động trên bộ đệm hiện tại, bạn cũng có thể nhập
(name-of-function arg1 arg2 arg3)
trong *scratch*
bộ đệm và nhấn C-x C-e( eval-last-sexp
) với điểm được định vị sau dấu ngoặc đơn đóng.
Để cung cấp một hàm bar
có sẵn dưới dạng một lệnh, bạn có thể gói nó trong một hàm tương tác tùy chỉnh ( foo
) như sau:
(defun foo ()
(interactive)
(bar))
Tất nhiên, nếu bar
mất một hoặc nhiều đối số, bạn sẽ phải cung cấp chúng để thực hiện foo
công việc chính xác.
Nếu bạn thấy mọi người sử dụng thuật ngữ "chức năng" và "lệnh" có thể hoán đổi cho nhau, điều này có thể cho thấy (tùy thuộc vào ngữ cảnh) rằng họ không nhận thức được sự khác biệt giữa các khái niệm cơ bản.
1 Lưu ý rằng tôi đang nói về defun
s ở đây. Như @Stefan chỉ ra trong các bình luận, macro bàn phím là một trường hợp đặc biệt: Chúng có thể được coi là các lệnh , nhưng chúng không phải là chức năng.
C-h i
, chọn hướng dẫn Elisp ,i command
- đặt bạn ngay vào nútWhat is a function?
, điều này làm cho tất cả các tinh thể này rõ ràng. Giúp người dùng tìm hiểu để hỏi Emacs. (Chỉ một ý kiến.)