อาร์กิวเมนต์คำนำหน้าดิบคืออะไร (เมืองหลวง P ในการโต้ตอบ)


9

และพวกเขาจะใช้อะไรได้บ้าง?

(interactive "p")ใช้อาร์กิวเมนต์ที่เป็นตัวเลขจากuniversal argumentด้านขวาหรือไม่ และข้อโต้แย้งสากลเป็นเพียงวิธีใดวิธีหนึ่งทุน(interactive "P")ทำอะไรได้บ้าง

คำตอบ:


11

ยากที่จะเชื่อว่าผู้คนอธิบายสิ่งนี้ที่นี่โดยไม่ได้ให้ลิงก์ไปยังคำอธิบายของ Emacs ในเรื่องนี้:

  • ใน Emacs คู่มือโหนดข้อโต้แย้ง

  • ในคู่มือ Elisp โหนดอาร์กิวเมนต์คำนำหน้าคำสั่ง

"ถาม Emacs!": C-h iเลือกคู่มือ,i prefix argument RET.

สรุปแม้ว่านี่จะพูดได้ดีพอโดยคำตอบอื่น ๆ ที่นี่และอธิบายไว้ในรายละเอียดในคู่มือ:

  • ส่วนนำหน้า"raw" arg ให้ค่า Lisp ของชนิดต่าง ๆ และโดยเฉพาะอย่างยิ่งจะแยกความแตกต่างว่าผู้ใช้ใช้อาร์กิวเมนต์ของคำนำหน้าหรือไม่

    ใช้มันโปรแกรมที่สามารถแยกแยะว่าผู้ใช้หนึ่ง { -, M--, C--} หรือหนึ่ง { M-- 1, C-- 1, C-u -1} (ซึ่งทั้งสองมีเหมือนกันค่าคำนำหน้าตัวเลข-1) และแยกความแตกต่างไม่ว่าจะเป็นหรือไม่? เขาใช้C-u C-uหรือหนึ่งใน { M-16, C-16, C-u 16} (ซึ่งทั้งคู่มีค่าตัวเลข 16) - ท่ามกลางความแตกต่างอื่น ๆ มากมาย

    แต่ความแตกต่างที่สำคัญที่สุดคือnilเทียบกับไม่ใช่nil: คำสั่งจำนวนมากทำหน้าที่แตกต่างกันไปขึ้นอยู่กับว่าผู้ใช้ใช้คำนำหน้า arg หรือไม่

  • "ตัวเลข"คำนำหน้าหาเรื่องเป็นจริงเพียงค่าที่ฟังก์ชั่นprefix-numeric-valueผลตอบแทนเมื่อนำไปใช้กับคำนำหน้าหาเรื่องดิบ IOW มันเป็นความคิดที่ดีที่สุดในการทำแผนที่จากการโต้ตอบกับผู้ใช้จริงกับจำนวนเต็ม

    มันไม่สามารถบอกคุณได้ว่าผู้ใช้จริงอาร์กิวเมนต์คำนำหน้าเพราะเริ่มต้นของการโต้แย้งคำนำหน้าไม่มีแผนที่จะจำนวนเต็ม 1 เช่นเดียวกับที่จะใช้C-u 1, หรือM-1C-1


9

เมื่อใช้รหัส นำหน้าแบบดิบ"P"จะมีการส่งผ่านอาร์กิวเมนต์เนื่องจากเป็นในขณะที่"p"แปลงหาเรื่องให้เป็นตัวเลข

หลังจากการประเมินด้านล่าง Elisp ลองC-u M-x my/fn-with-num-argแล้วC-u M-x my/fn-with-raw-argจะเห็นความแตกต่างเพราะผ่านอาร์กิวเมนต์รายการC-u(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)
;; .

นอกจากนี้อาร์กิวเมนต์เริ่มต้น1สำหรับอาร์กิวเมนต์ตัวเลข ( "p") แต่ค่าเริ่มต้นเป็นnilหรือ()อาร์กิวเมนต์ดิบ ( "P")

ไม่กี่เซ็นต์ของฉัน: ในบางครั้งปัจจัยในการตัดสินใจสำหรับการว่าจะใช้"p"หรือ"P"ไม่ว่าคุณต้องการอาร์กิวเมนต์เริ่มต้นที่จะเป็นหรือ1nil

;; 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กว่า1แต่ไม่เคยว่ามีห่อเป็นที่นิยมยังไม่ได้เปิดint int(ไม่สามารถลงคะแนนได้จนกว่าฉันจะได้ 15 คะแนน btw)
24HrRevengeTherapist

@ 24HrRevengeTherapist: เพิ่งได้รับการโหวต ya 'พาคุณผ่านจุดมหัศจรรย์ 15 แต้ม ออกไปและลงคะแนนเสียงในรายการที่จะช่วยคุณ!
แดน

มันไม่เกี่ยวกับ ints ที่ยังไม่ได้ห่อ มันไม่เกี่ยวกับ ints เลย และ +1 ถึง @kaushalmodi สำหรับการเน้นว่าคุณสามารถบอกได้ว่าผู้ใช้ใช้คำนำหน้า arg เท่านั้นโดยใช้ raw arg (โดยตรวจสอบว่ามีค่าnilหรือไม่)
ดึง

7

เพียงเพิ่มรายละเอียดเพิ่มเติมให้กับคำตอบของ @ kaushalmodi (และกรณีทดสอบที่มีประโยชน์):

อาร์กิวเมนต์ดิบช่วยให้คุณสามารถแยกแยะความแตกต่างระหว่างการขัดแย้งให้กับและuniversal-argumentdigit-argument

ด้วยคำนำหน้าตัวเลขหาเรื่องไม่มีทางที่จะแยกแยะอาร์กิวเมนต์สากลC-uจากคำนำหน้าอาร์กิวเมนต์ของ 4 (เช่นC-4) ด้วยอาร์กิวเมนต์ดิบเหล่านี้มีความแตกต่างกัน: VS(4)4

negative-argumentเช่นเดียวกับกับ เป็นอาร์กิวเมนต์ดิบคุณสามารถแยกแยะความแตกต่างระหว่างC--และC-- 1: ครั้งแรกที่จะทำให้คุณในขณะที่สอง- เมื่อแปลงเป็นอาร์กิวเมนต์ที่เป็นตัวเลขพวกเขาทั้งสองจะเป็น -1-1

ดังนั้นข้อดีของการใช้อากิวเมนต์ raw คือให้ค่าที่เป็นไปได้มากกว่า คุณสามารถเขียนคำสั่งที่ทำงานแตกต่างกันไปขึ้นอยู่กับวิธีการระบุอาร์กิวเมนต์

เป็นตัวอย่างให้ดูที่สตริง doc yankสำหรับ คำสั่งนี้ปฏิบัติC-uและC-4แตกต่าง:

ด้วยเพียง Cu เป็นอาร์กิวเมนต์ใส่จุดเริ่มต้นและทำเครื่องหมายที่สิ้นสุด ด้วยอาร์กิวเมนต์ N ให้แทรกการสังหารล่าสุดของ N อีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.