และพวกเขาจะใช้อะไรได้บ้าง?
(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-1
C-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"
ไม่ว่าคุณต้องการอาร์กิวเมนต์เริ่มต้นที่จะเป็นหรือ1
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
หรือไม่)
เพียงเพิ่มรายละเอียดเพิ่มเติมให้กับคำตอบของ @ kaushalmodi (และกรณีทดสอบที่มีประโยชน์):
อาร์กิวเมนต์ดิบช่วยให้คุณสามารถแยกแยะความแตกต่างระหว่างการขัดแย้งให้กับและuniversal-argument
digit-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
แต่ไม่เคยว่ามีห่อเป็นที่นิยมยังไม่ได้เปิดint
int
(ไม่สามารถลงคะแนนได้จนกว่าฉันจะได้ 15 คะแนน btw)