ทำตามคำตอบของคำถามอีกข้อหนึ่งเกี่ยวกับระบบคำแนะนำใหม่ :
ในแบบเก่าadvice.el
มันเป็นไปได้ที่จะจัดการกับสมาชิกแต่ละคนของรายการอาร์กิวเมนต์ของฟังก์ชั่นที่แนะนำโดยไม่ต้องทำการยืนยันใด ๆ เกี่ยวกับสมาชิกเหล่านั้นที่ไม่ได้จัดการ ตัวอย่างเช่นคำแนะนำต่อไปนี้:
(defadvice ansi-term (around prompt-for-name last)
(let ((name (read-from-minibuffer "Tag: ")))
(and (not (string= name ""))
(ad-set-arg 1 (concat "Term: " name)))
ad-do-it))
อนุญาตให้มีการจัดเตรียม (เป็นทางเลือก) ของอาร์กิวเมนต์ชื่อบัฟเฟอร์ansi-term
ในขณะที่ansi-term
จะยังคงได้รับอาร์กิวเมนต์แรกโดยการพร้อมท์ตามรูปแบบโต้ตอบของตัวเอง
(สำหรับการอ้างอิงในภายหลังansi-term
ลายเซ็นของคือ(PROGRAM &optional BUFFER-NAME)
และรูปแบบการโต้ตอบของมันแจ้งให้ PROGRAM ที่มีค่าเริ่มต้นที่เป็นไปได้หลายประการ แต่ไม่ได้ทำอะไรเกี่ยวกับ BUFFER-NAME)
nadvice.el
ฉันไม่แน่ใจหรือไม่ว่านี้คือในความเป็นไปได้ หากเป็นเช่นนั้นฉันไม่แน่ใจว่าจะสามารถทำได้ ฉันพบสองวิธีในการแทนที่รายการอาร์กิวเมนต์ของฟังก์ชันที่แนะนำ
ตัวอย่างเช่นจากcombinators คำแนะนำจาก* info * (elisp) :
`:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to pass to the old function. More specifically, the composition of the two functions behaves like: (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
combinators อื่น ๆ ให้ความสามารถที่คล้ายกันและด้ายที่พบบ่อยในหมู่พวกเขาคือว่าในขณะที่รายการอาร์กิวเมนต์ของฟังก์ชันอาจถูกแทนที่ตัดทอนขยาย, et al, ไม่มีวิธีที่ชัดเจนสำหรับคำแนะนำฟังก์ชั่นในการปรับเปลี่ยนการโต้แย้งในตำแหน่งที่ระบุในรายการโดยไม่ต้อง เข้าไปยุ่งอะไรเกี่ยวกับส่วนที่เหลือของมัน
ในกรณีภายใต้การสนทนาดูเหมือนว่าเป็นไปไม่ได้ที่ผู้สร้างคำแนะนำจะส่งผ่านansi-term
ชื่อบัฟเฟอร์เท่านั้นเนื่องจากไม่สามารถสร้างรายการที่มีค่าในตำแหน่งที่ 1 แต่ไม่มีอะไรเลยแม้แต่nil
ในตำแหน่งที่ 0 ในกรณีทั่วไป มันเป็นไปไม่ได้สำหรับผู้เขียนคำแนะนำในการแก้ไขข้อโต้แย้งโดยพลการเกินกว่าตำแหน่ง 0
ดูเหมือนว่าโชคร้ายในการที่จะสร้างเอฟเฟ็กต์ที่คล้ายกันก็จำเป็นต้องคัดลอกโค้ด: โดยเฉพาะอย่างยิ่งฉันสามารถคัดลอกansi-term
รูปแบบการโต้ตอบและขยายไปสู่รสนิยมของฉันหรือฉันสามารถคัดลอกansi-term
ทั้งหมดและขยายได้เช่นกัน ไม่ว่าในกรณีใดตอนนี้ฉันต้องกำหนดส่วนหนึ่งของการกระจาย Emacs Lisp ในไฟล์ init ซึ่งทำให้ฉันไม่พึงประสงค์ในแง่ของความทนทานและความสวยงาม
จากนั้นคำถามของฉันคือ: รายการอาร์กิวเมนต์ประเภทนี้สามารถสร้างด้วยอาร์กิวเมนต์ได้nadvice.el
หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร