Lỗi "Đối số kiểu sai: commandp" khi liên kết lambda với một khóa


87

Tôi nhận được thông báo "Đối số kiểu sai: commandp, (lambda nil (dòng chuyển tiếp 5))" ở đây.

(global-set-key [?\M-n] (lambda () (forward-line 5)))

Lỗi là gì? Tôi khá chắc rằng nó đơn giản và tôi đang thiếu một cái gì đó rõ ràng.


Bạn đang thiếu một dấu ngoặc đơn đóng. Có thể không có trong mã của bạn mặc dù, chỉ trong câu hỏi.
Helder S Ribeiro

Một lưu ý phụ: khi bạn trích dẫn hàm ẩn danh như vậy, nó sẽ không được biên dịch. Tôi tưởng tượng nó không có vấn đề gì lớn trong trường hợp của bạn.
Phil Jackson

Câu trả lời:


129

global-set-keymong đợi một lệnh tương tác. (lambda () (interactive) (forward-line 5))phải làm việc.

Nhân tiện, C-h f commandplà một điểm khởi đầu khá tốt cho những lỗi như vậy.


Tôi nghĩ rằng không có mặt nào giảm. Từ tài liệu: >> "Cuộc gọi" đến "tương tác" thực sự là một khai báo hơn là một hàm; nó cho biết 'cuộc gọi tương tác' cách đọc các đối số để chuyển đến hàm. Khi thực sự được gọi, 'tương tác' chỉ trả về nil.
Dangelov

Vì vậy, theo (commandp)tài liệu, các hàm lambda với lệnh gọi cấp cao nhất để (interactive)hoạt động, nhưng làm thế nào tôi có thể xác định một hàm với (defun)đó sẽ hoạt động?
peterhil

35

Biểu mẫu chính xác phải là:

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))

Vấn đề là bạn đã quên đặt (interactive)(như brendan đã đề cập).

Nhân tiện, bạn sẽ nhận thấy rằng tôi đã sử dụng (kbd)hàm để chỉ định ràng buộc khóa. Chức năng đó vô cùng hữu ích vì bạn có thể đặt các key-binding gần như theo nghĩa đen.


2

Tôi cũng đã gặp lỗi này trên một máy mới, nơi tôi đang sử dụng .emacstệp thông thường của mình nhưng chưa cài đặt các gói của mình và lệnh được thực thi nằm trong một trong các gói đó. (Bởi vì một lệnh không thể được thực thi chắc chắn không tương tác!)

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.