Và chúng có thể được sử dụng để làm gì?
(interactive "p")
mất một đối số số từ universal argument
bên phải? Và đối số phổ quát chỉ là một trong hai cách, vậy vốn (interactive "P")
làm gì?
Và chúng có thể được sử dụng để làm gì?
(interactive "p")
mất một đối số số từ universal argument
bên phải? Và đối số phổ quát chỉ là một trong hai cách, vậy vốn (interactive "P")
làm gì?
Câu trả lời:
Khó có thể tin rằng mọi người đã mô tả điều này ở đây mà không cung cấp cho bạn các liên kết đến các mô tả riêng của Emacs về điều này:
Trong hướng dẫn sử dụng Emacs, đối số nút .
Trong hướng dẫn Elisp, đối số lệnh tiền tố nút .
"Hỏi Emacs!":, C-h i
Chọn một hướng dẫn ,i prefix argument RET
.
Tóm lại, mặc dù điều này được nói đủ tốt bởi các câu trả lời khác ở đây, và được mô tả chi tiết trong hướng dẫn:
Các "thô" tiền tố arg cung cấp giá trị Lisp các loại khác nhau, và đặc biệt là nó phân biệt có hay không người dùng thực sự sử dụng một đối số tiền tố (dưới mọi hình thức).
Sử dụng nó, một chương trình có thể phân biệt cho dù người dùng sử dụng một trong những { -
, M--
, C--
} hoặc một trong { M-- 1
, C-- 1
, C-u -1
} (cả hai đều có cùng một giá trị tiền tố bằng số -1
), và phân biệt cho dù s? Ông sử dụng C-u C-u
hoặc một trong { M-16
, C-16
, C-u 16
} (cả hai đều có giá trị số 16) - trong số rất nhiều sự phân biệt khác.
Nhưng sự khác biệt quan trọng nhất là nil
so với non- nil
: nhiều lệnh hoạt động khác nhau tùy thuộc vào việc người dùng có sử dụng tiền tố arg hay không.
Các "số" tiền tố arg thực sự chỉ là giá trị mà chức năng prefix-numeric-value
lợi nhuận khi áp dụng cho các arg tiền tố thô. IOW, tốt nhất nên nghĩ là ánh xạ từ tương tác người dùng thô thực tế đến một số nguyên.
Nó không thể cho bạn biết liệu người dùng thực sự sử dụng một đối số tiền tố, bởi vì mặc định là không có đối số tiền tố bản đồ đến số nguyên 1, cũng như không sử dụng C-u 1
, M-1
hoặc C-1
.
Khi tiền tố thô Mã tương tác "P"
được sử dụng, đối số được truyền vào vì nó "p"
chuyển đổi đối số thành số.
Sau khi đánh giá elisp dưới đây, hãy thử C-u M-x my/fn-with-num-arg
và sau đó C-u M-x my/fn-with-raw-arg
để xem sự khác biệt vì C-u
vượt qua một đối số danh sách (4)
.
(defun my/debug-fn (arg)
(let ((msg))
(if (numberp arg)
(setq msg (format "Argument is number %s. " (pp arg)))
(setq msg "Argument is not a number. "))
(if (listp arg)
(setq msg (concat msg (format "Arg is %s." (pp arg))))
(setq msg (concat msg "Argument is not a list.")))
(message msg)))
(defun my/fn-with-num-arg (arg)
(interactive "p")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-num-arg :
;; Argument is number 4. Argument is not a list.
(defun my/fn-with-raw-arg (arg)
(interactive "P")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is (4)
;; .
Ngoài ra, đối số mặc định cho 1
đối số số ( "p"
) nhưng mặc định là nil
hoặc ()
cho đối số thô ( "P"
).
Vài xu của tôi: Đôi khi, yếu tố quyết định nên sử dụng "p"
hay "P"
là bạn muốn đối số mặc định là 1
hay nil
.
;; Result of M-x my/fn-with-num-arg :
;; Argument is number 1. Argument is not a list.
;; Result of M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is nil.
nil
hay không).
Chỉ cần thêm một chút chi tiết vào câu trả lời của @ kaushalmodi's (và trường hợp kiểm tra hữu ích):
Đối số thô cho phép bạn phân biệt giữa các đối số được cung cấp với universal-argument
và digit-argument
.
Với một tiền tố số arg, không có cách nào để phân biệt đối số phổ quát C-u
với một tiền tố arg là 4 (tức là C-4
). Với lập luận liệu đây là những khác nhau: (4)
vs 4
.
Áp dụng tương tự với negative-argument
. Là một đối số thô, bạn có thể phân biệt giữa C--
và C-- 1
: đầu tiên sẽ cung cấp cho bạn -
trong khi thứ hai -1
. Khi được chuyển đổi thành một đối số số, cả hai sẽ được -1
.
Vì vậy, lợi ích của việc sử dụng một đối số thô là nó cung cấp cho bạn nhiều giá trị có thể hơn. Bạn có thể viết các lệnh hành xử khác nhau tùy thuộc vào cách xác định đối số.
Ví dụ, hãy xem chuỗi doc cho yank
. Lệnh này xử lý C-u
và C-4
khác nhau:
Chỉ với Cu là đối số, đặt điểm ở đầu và đánh dấu ở cuối. Với đối số N, tái xác nhận lần giết thứ N gần đây nhất.
nil
hơn1
, nhưng không bao giờ rằng có một bọcint
được ưu tiên hơn so với không có vỏ bọcint
. (Không thể upvote cho đến khi tôi nhận được 15 điểm, btw).