ประโยชน์ในทางปฏิบัติของระบบคำแนะนำใหม่ใน Emacs 24.4


53

Emacs 24.4 มาพร้อมกับระบบคำแนะนำใหม่ NEWSไฟล์พูดว่า:

** แพคเกจใหม่ให้nadvice.elบริการคำแนะนำที่มีน้ำหนักเบา มันเป็นชั้น:

*** add-function/ remove-functionซึ่งสามารถใช้เพื่อเพิ่ม / ลบรหัสในสถานที่ที่มีการทำงานเช่นตัวกรองกระบวนการหรือ<foo>-functionตะขอ

*** advice-add/ advice-removeเพื่อเพิ่ม / ลบคำแนะนำในฟังก์ชั่นที่ตั้งชื่อเหมือนที่defadviceทำ

ถาม:อะไรคือประโยชน์และการใช้งานจริงของแพ็คเกจใหม่นี้

ฉันสนใจเป็นพิเศษในคำตอบที่กล่าวถึงประเด็นต่อไปนี้:

  • หากฉันใช้เฉพาะคำแนะนำในการปรับแต่ง Emacs (ซึ่งแตกต่างจากการเขียนแพ็คเกจเสริม) ฉันต้องเปลี่ยนไปใช้ระบบใหม่หรือไม่? มันจะเข้ามาแทนที่ระบบเก่าในบางจุดหรือไม่?

  • สิ่งที่ว่าผมสามารถทำอะไรกับระบบใหม่ที่ฉันไม่สามารถประสบความสำเร็จด้วยdefadvice?

  • อะไรคือความสำคัญของความสามารถในการ "เพิ่ม / ลบรหัสในสถานที่ดำเนินการใด ๆ "

คำตอบ:


57

ระบบคำแนะนำใหม่มีข้อดีดังต่อไปนี้:

  • add-function: นี่คือฟังก์ชั่นใหม่ล่าสุดที่ไม่ได้เป็นส่วนหนึ่งของข้อเสีย มันเป็นชนิดของไฮบริดระหว่างและadd-hook defadviceในอนาคตคาดว่าจะมีfoo-functionตัวแปรเพิ่มเติม(แก้ไขผ่านadd-function) และน้อยกว่าfoo-functions(แก้ไขผ่านadd-hook) ฟังก์ชั่นนี้เป็นแรงจูงใจหลักในการนำระบบคำแนะนำใหม่มาใช้โดยรายงานข้อผิดพลาดที่ถามว่าจะ "แบ่งปัน" ตัวกรองกระบวนการระหว่างแพ็คเกจต่าง ๆ ได้อย่างไร

  • ความเรียบง่ายในการติดตั้งใช้งาน: เมื่อadd-functionใช้งานแล้วจะใช้เวลาเพียง 8KB เท่านั้นในการใช้งานadvice-addฟังก์ชั่นซึ่งนำฟังก์ชั่นการทำงานทั้งหมดของ 100KB ของคำแนะนำมาใช้

  • ความเรียบง่ายในการออกแบบ: ข้อเสียมีแนวคิดหลายอย่างที่โดยทั่วไปยากที่จะเข้าใจได้อย่างแม่นยำและ / หรือไม่ค่อยได้ใช้ เช่นความแตกต่างระหว่างคำแนะนำ "การเปิดใช้งาน" และ "การเปิดใช้งาน" หรือความหมายของ "pre" และ / หรือ "เรียบเรียง" นอกจากนี้ยังมีนิสัยใจคอในการจัดการad-do-itเช่นความจริงที่ว่ามันดูเหมือนตัวแปรอ้างอิงมากกว่าการโทรหรือความจริงที่ว่าคุณต้อง(setq ad-return-value ...)ชัดเจนมากกว่าเพียงแค่ส่งกลับค่า

  • ข้อบกพร่องได้รับความเดือดร้อนจากปัญหาต่าง ๆ ที่เกิดขึ้นกับการขยายและการรวบรวม: คำแนะนำไม่ได้รับการเปิดเผยว่าเป็น "รหัส" (ซึ่งคอมไพเลอร์และ macroexpander มองเห็น) แต่เป็น "ข้อมูล" ซึ่งต่อมารวมกันเพื่อสร้างนิพจน์ ดังนั้นการขยายมาโครเกิดขึ้นช้า (ซึ่งอาจทำให้เกิดความประหลาดใจถ้าคุณใช้สิ่งต่าง ๆ เช่นนี้(eval-when-compile (require 'foo))) และการกำหนดขอบเขตคำศัพท์ยากที่จะรักษาอย่างถูกต้อง

สำหรับว่าคุณจำเป็นต้องเปลี่ยนไปใช้ระบบใหม่: ฉันตั้งใจจะกำจัดข้อเสียเก่าในบางจุดในอนาคต แต่ฉันคิดว่าอนาคตนี้ค่อนข้างห่างไกล (และมันจะต้องย้ายไปlisp/obsoleteก่อนในภายหลัง ถึง GNU ELPA)


1
มีแผนจะเพิ่ม nadvice.el ในฟังก์ชั่นแก้ไขข้อโต้แย้งเดียวกันที่เสนอโดยระบบคำแนะนำเก่าหรือไม่?
แอรอนมิลเลอร์

ไม่สวยมากที่ไม่มีความหมายในบริบทของ nadvice.el ที่ฟังก์ชั่นการแนะนำเป็นฟังก์ชั่นธรรมดาแบบเก่า แต่คุณสามารถใช้:aroundคำแนะนำ ( :filter-argsหรือ:filter-resultคำแนะนำ) เพื่อให้ได้ผลเช่นเดียวกัน
Stefan

2
แต่ฉันก็ทำไม่ได้ สมมติว่าฉันต้องการที่จะแนะนำฟังก์ชั่นของสองข้อโต้แย้งแทนที่เพียงข้อโต้แย้งที่สองเพื่อให้ฟังก์ชั่นที่แนะนำจะยังคงพร้อมท์ตามรูปแบบการโต้ตอบสำหรับคนแรก คำแนะนำใหม่ดูเหมือนจะให้วิธีการที่หลากหลายในการแทนที่รูปแบบอินเทอร์แอคทีฟของฟังก์ชั่นที่แนะนำ แต่ฉันไม่เห็นอะไรที่ให้ความแตกต่างมากกว่านี้
Aaron Miller

@AaronMiller: โปรดตั้งคำถามแยกต่างหากเพื่อให้สามารถพูดคุยได้โดยไม่ จำกัด ขอบเขตความคิดเห็นของ SX
Stefan

เสร็จสิ้นที่emacs.stackexchange.com/q/19233/2162 ฉันขอขอบคุณการติดตามของคุณ (ฉันอยากรู้อยากเห็นเพื่อดูรายงานข้อผิดพลาดที่คุณพูดถึงในคำตอบของคุณ แต่ไม่สามารถค้นหาได้ผ่านทาง Google หรือการค้นหารายการที่เก็บถาวรจดหมายคุณต้องการลิงค์หรือไม่?)
Aaron Miller

9

find-functionหนึ่งในผลประโยชน์ที่ชัดเจนของคำแนะนำเป็นหน้าที่ตามปกติคือการที่คุณสามารถเยี่ยมชมความหมายด้วย

ในปัจจุบันเมื่อดูวิธีใช้สำหรับฟังก์ชั่นที่แนะนำ (รูปแบบใหม่) จะมีลิงก์ไปยังวิธีใช้สำหรับฟังก์ชั่นคำแนะนำและจากนั้นจะมีลิงก์ไปยังแหล่งข้อมูล (ตามปกติสำหรับวิธีใช้ฟังก์ชั่น)

ระบบเก่าให้คำแนะนำในการ docstring แบบอินไลน์ แต่ไม่มีวิธีที่จะดูรหัส (ฉันมักจะหันไปrgrep)

(โดยส่วนตัวแล้วฉันต้องการเห็นการผสมผสานของวิธีการแบบเก่าและใหม่ในการแสดงความช่วยเหลือเนื่องจากฉันชอบที่มีสตริงอินไลน์ แต่ฉันแน่ใจว่ามันเป็นไปได้ที่จะติดตาม)


2
ใช่มันแย่เกินไปที่ระบบคำแนะนำใหม่จะไม่ยอมให้คุณเพิ่มไปยังสตริงเอกสารที่มีอยู่เช่นdefadviceนั้น ดูรายงานข้อผิดพลาดของ Emacsนี้ นี่คือข้อบกพร่อง
ดึง

8

จากส่วนหัวของไฟล์:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

ขณะที่ฉันอ่านมันเป้าหมายหลักคือจะง่ายกว่าระบบคำแนะนำแบบเก่าเพื่อไม่ให้มีความสามารถมากขึ้น อ่านเอกสารดูเหมือนว่าadvice-addมีdefadviceฟังก์ชั่นย่อยadd-functionบางส่วนในขณะที่มีฟังก์ชั่นที่ดีสำหรับการให้คำแนะนำฟังก์ชั่นที่ไม่ใช่แบบดั้งเดิมเช่นตัวกรองกระบวนการ (ซึ่งอาจเป็นไปได้ด้วยdefadviceแต่ฉันไม่แน่ใจว่า)

เท่าที่ฉันรู้defadviceไม่ได้เลิกใช้อย่างเป็นทางการดังนั้นคุณควรจะใช้มันต่อไปในตอนนี้ (และหากคุณเป็นผู้เขียนแพ็คเกจคุณอาจต้องการใช้ต่อไปจนกว่า 24.4 จะกลายเป็นลูกบุญธรรมอย่างกว้างขวางมากขึ้น) อย่างไรก็ตามดูเหมือนว่าผู้เขียน Emacs ต้องการที่จะโยกย้ายไปยังระบบใหม่อย่างสมบูรณ์ในที่สุดดังนั้นจึงอาจเหมาะสมที่จะสลับไปช้า



ใช่. ใหม่มีความแตกต่างไม่มาก และใช่มีการใช้งานมากมายที่defadviceนั่น (และจะมีต่อไป)
ดึง

0

สิ่งหนึ่งที่ฉันไม่ได้เห็นได้กล่าวถึงที่นี่ - ในบางวิธีมันเป็นเพราะวิธีการที่ง่ายกว่า (ดีกว่าแบบแยกส่วนและ "กาว") ของระบบคำแนะนำ "ใหม่" ซึ่งได้รับการกล่าวถึงในคำตอบอื่น ๆ - นี่คือ: มันง่ายกว่ามากในการเพิ่มรวมเอาออกจัดเรียงใหม่และอื่น ๆ

เป็นไปได้ที่จะทำเช่นนั้นโต้ตอบแบบไดนามิกแม้ว่า nadvice ต้องการความช่วยเหลือเล็กน้อยเพื่ออำนวยความสะดวกนี้ ฉันไม่ได้ตระหนักถึงการใช้ nadvice ด้วยวิธีนี้อื่น ๆ (องค์ประกอบการโต้ตอบของคำแนะนำ) แต่มีอย่างน้อยหนึ่งแอปพลิเคชันดังกล่าว ฉันใช้ประโยชน์จากมันในIsearch +เพื่อให้คุณเพิ่มและลบชุดของตัวกรอง Isearch โดยพลการ (ตัวกรอง) ในขณะที่ค้นหา

IOW เช่นเดียวกับที่คุณเปลี่ยนรูปแบบการค้นหาของคุณแบบค่อยเป็นค่อยไปดังนั้นคุณสามารถปรับแต่งการค้นหาของคุณได้ทันทีโดยใช้ตัวกรองหลายตัว

การกรอง Isearch เสร็จสิ้นโดยใช้ตัวแปรisearch-filter-predicateซึ่งมีให้ใช้ระยะหนึ่งแล้ว แต่ตัวกรอง Isearch ไม่ได้ถูกกำหนดบ่อยครั้ง พวกเขามักจะคงที่และกำหนดไว้ล่วงหน้าสำหรับบริบทที่กำหนด (เช่น Wdired) ผู้ใช้สามารถกำหนดและใช้งานได้อย่างไม่ยากนัก

มีเพียงอย่างเดียวคือหนึ่งในตัวแปรisearch-filter-predicateที่เปลี่ยนกรองจริงๆหมายถึงการเปลี่ยนแปลงกริยากรองเดียวซึ่งจะมีจำนวนการแต่งฟังก์ชั่นการรวมภาคเพื่อทำการขยายหรือปรับเปลี่ยนการค้นหา

แต่นั่นเป็นสิ่งที่ดีที่สุด โดยรวมแล้ว nadvice มีประโยชน์มากสำหรับการรวมฟังก์ชั่นที่ทำให้ง่ายต่อการปรับแต่งการกรองการค้นหา (ดูเพิ่มเติมที่การกรอง Isearch แบบไดนามิกสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้)

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