และพวกเขาจะใช้อะไรได้บ้าง?
(interactive "p")ใช้อาร์กิวเมนต์ที่เป็นตัวเลขจากuniversal argumentด้านขวาหรือไม่ และข้อโต้แย้งสากลเป็นเพียงวิธีใดวิธีหนึ่งทุน(interactive "P")ทำอะไรได้บ้าง
และพวกเขาจะใช้อะไรได้บ้าง?
(interactive "p")ใช้อาร์กิวเมนต์ที่เป็นตัวเลขจากuniversal argumentด้านขวาหรือไม่ และข้อโต้แย้งสากลเป็นเพียงวิธีใดวิธีหนึ่งทุน(interactive "P")ทำอะไรได้บ้าง
คำตอบ:
ยากที่จะเชื่อว่าผู้คนอธิบายสิ่งนี้ที่นี่โดยไม่ได้ให้ลิงก์ไปยังคำอธิบายของ Emacs ในเรื่องนี้:
"ถาม 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
เมื่อใช้รหัส นำหน้าแบบดิบ"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หรือไม่)
เพียงเพิ่มรายละเอียดเพิ่มเติมให้กับคำตอบของ @ 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 อีกครั้ง
nilกว่า1แต่ไม่เคยว่ามีห่อเป็นที่นิยมยังไม่ได้เปิดintint(ไม่สามารถลงคะแนนได้จนกว่าฉันจะได้ 15 คะแนน btw)