Đối số tiền tố thô là gì? (viết hoa P trong tương tác)


9

Và chúng có thể được sử dụng để làm gì?

(interactive "p")mất một đối số số từ universal argumentbê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:


11

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:

"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-uhoặ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à nilso 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-valuelợ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-1hoặc C-1.


9

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-argvà sau đó C-u M-x my/fn-with-raw-argđể xem sự khác biệt vì C-uvượ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à nilhoặ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à 1hay 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.

Cảm ơn. Tôi nhận được rằng đôi khi nó tốt hơn để có được nilhơn 1, nhưng không bao giờ rằng có một bọc intđược ưu tiên hơn so với không có vỏ bọc int. (Không thể upvote cho đến khi tôi nhận được 15 điểm, btw).
24HrRevengeTherapist 10/07/2015

@ 24HrRevengeTherapist: chỉ cần bình chọn ya ', đưa bạn vượt qua ngưỡng 15 điểm kỳ diệu. Đi ra ngoài và thực hiện một số bỏ phiếu lên các mặt hàng giúp bạn!
Dan

Nó không phải là về bọc vs ints chưa mở. Nó hoàn toàn không phải về ints. Và +1 cho @kaushalmodi để nhấn mạnh rằng bạn có thể biết liệu người dùng chỉ sử dụng tiền tố arg hay không bằng cách sử dụng arg thô (bằng cách kiểm tra xem giá trị có nilhay không).
vẽ

7

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-argumentdigit-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-uvớ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--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-uC-4khá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.

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.