วิธีการใช้ defcustom อย่างถูกต้อง?


15

เช่นเดียวกับผู้ใช้ Emacs ส่วนใหญ่ฉันได้ปรับแต่งโหมดด้วยการเปลี่ยนตัวแปร สิ่งที่ไม่เคยเกิดขึ้นกับฉันคือความคิดการเขียนโปรแกรมทั้งหมดที่อยู่เบื้องหลังการปรับแต่งสิ่งนี้และสิ่งนั้น ฉันรู้เรื่องนี้เมื่อฉันเริ่มดูซอร์สโค้ดของ eshell ฉันไม่ใช่โปรแกรมเมอร์เอลลิส แต่em-ls.elดูเหมือนว่าจะใช้defcustomเป็นdefgroupพิเศษ ฯลฯ ดูเหมือนว่านี่จะเป็นโลกเงาของตัวแปรที่กำหนดทั่วโลกซึ่งโค้ด elisp ใช้ ดังนั้นคำถามหนึ่งก็คือการใช้defcustomตัวแปรระดับโลก (ปรับแต่ง) อีกวิธีหนึ่งได้หรือไม่?

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


คุณช่วยอธิบายสิ่งที่คุณถามได้หรือไม่? คุณต้องการที่จะรู้ว่าเมื่อใดที่จะใช้customizeสิ่งอำนวยความสะดวกเมื่อเทียบกับเมื่อต้องการปรับแต่งด้วยมือ? หรือคุณสนใจที่จะเขียนโหมดหรือไม่? หลังคือสถานการณ์ที่คุณอาจพบว่าตัวเองใช้สิ่งที่ชอบdefcustomและไม่ชอบ
แดน

คำตอบ:


20

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

จุดเริ่มต้นหลักของฟังก์ชันการปรับแต่งคือM-x customize RET(หรือOptions > Customize Emacs > Top-level Customization Groupจากเมนู) จากนั้นคุณจะเห็นระบบเมนูแบบโต้ตอบสำหรับการปรับการตั้งค่า อินเตอร์เฟสนี้บังคับให้การตั้งค่าทั้งหมดเป็นประเภทที่ถูกต้อง (หมายเลข, สตริง, สี, ฯลฯ ) หลีกเลี่ยงแหล่งที่มาของข้อผิดพลาดที่พบเมื่อผู้ใช้กำหนดค่า Emacs โดยทางโปรแกรม หากเลือกที่ผู้ใช้จะยังคงมีการเปลี่ยนแปลงใด ๆ ที่พวกเขาทำผ่าน UI การตั้งค่าจะถูกเก็บไว้กับส่วนพิเศษในไฟล์เริ่มต้นของผู้ใช้ (อ่าน: .emacs)

defcustomเป็น wrapper รอบฟังก์ชั่น Emacs Lisp ระดับล่างอย่างdefvarที่ทั้งคู่ประกาศตัวแปรและทำให้มองเห็นได้ภายในส่วนต่อประสานการปรับแต่ง นอกจากนี้ยังช่วยให้นักพัฒนาซอฟต์แวร์สามารถให้ข้อมูลเมตาเพิ่มเติมที่จำเป็นในการแสดงการควบคุมเชิงโต้ตอบที่เหมาะสมเช่นค่าประเภทใดที่เก็บอยู่ในตัวแปรนี้ สตริงใดก็ได้? หมายเลข? ทางเลือกจากชุดตัวเลือกคงที่? เป็นต้นdefgroupเป็นโครงสร้างการจัดกลุ่มสำหรับตัวเลือกที่ปรับแต่งได้เหล่านี้เพื่อให้สามารถจัดเรียงเป็นลำดับชั้นที่ดี

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

นี่เป็นตัวอย่างง่ายๆที่ถูกเปลื้องจากห้องสมุดเล็ก ๆ ของฉัน:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

การdefgroupสร้างกลุ่มใหม่ภายในส่วนติดต่อการปรับแต่งภายใต้convenienceรายการระดับบนสุด ฉันต้องการตัวแปรเพื่อเก็บสถานะช่องทำเครื่องหมายที่เป็นไปได้ ฉันจะได้ใช้แต่เนื่องจากผมต้องการนี้จะปรับแต่งได้ง่ายผมเลือกที่จะใช้งานdefvar ส่วนระบุว่าเป็นสมาชิกของกลุ่มก่อนหน้านี้ที่กำหนดไว้และแสดงให้เห็นว่ามันเป็นลำดับของสตริง นอกจากนี้ยังมีค่าเริ่มต้นและคำอธิบาย นอกจากนี้ยังมีสิ่งอำนวยความสะดวกเพิ่มเติม (ไม่แสดงที่นี่) สำหรับการเปลี่ยนค่าที่ป้อนโดยผู้ใช้defcustom:group:type

หากตอนนี้ฉันทำงานM-x customize RETและไปที่Convenience > Checkboxฉันเห็นสิ่งต่อไปนี้:

อินเตอร์เฟสการปรับแต่ง

ไม่ใช่อินเทอร์เฟซที่สวยที่สุดในโลก แต่ให้สังเกตว่ามีเครื่องมือแบบโต้ตอบสำหรับกำหนดค่าของ "Checkbox States" ( checkbox-statesภายใน) มันแสดงค่าสตริงปัจจุบันพร้อมกับปุ่มINS(แทรก) และDEL(ลบ) และช่วยให้เราสามารถแก้ไขค่าสตริงในกล่องแก้ไข เมื่อเสร็จแล้วเราสามารถตัดสินใจได้ว่าจะใช้การเปลี่ยนแปลงของเราคืนค่าเหล่านั้นหรือนำไปใช้และบันทึกไว้สำหรับเซสชันในอนาคต


2
โพสต์ที่ดี! ข้อได้เปรียบที่สำคัญที่สุดในการปรับแต่ง (และdefcustom) ที่ว่ามันจะดูแล : (1) ประเภทการตรวจสอบเพื่อช่วยป้องกันคุณจากการกำหนดค่าไม่ถูกต้องให้กับตัวแปร (ให้นักเขียนที่defcustomทำให้ความพยายามที่จะให้ชนิดที่เหมาะสม ตรวจสอบ), (2) การเริ่มต้น ( :initialize) และอัปเดต ctions (เรียกใช้) ( :set)
ดึง

ขอบคุณ! ฉันได้อัปเดตโพสต์เพื่อให้สอดคล้องกับข้อเสนอแนะของคุณ
camdez

7

การใช้ defcustom เป็นอีกวิธีหนึ่งในการทำ (ปรับแต่ง) ตัวแปรทั่วโลกหรือไม่?

ใช่. โดยเฉพาะอย่างยิ่งถ้าคุณต้องการให้ผู้ใช้รหัสของคุณสามารถเปลี่ยนตัวแปรได้อย่างง่ายดายผ่านทางอินเทอร์เฟซที่กำหนดเองของ Mx

defcustomให้ประโยชน์ที่สำคัญสองประการแก่ผู้ใช้ของคุณ: เอกสารและประเภทความปลอดภัย เอกสารยินดีที่ได้อยู่ตรงนั้น ความปลอดภัยของประเภทอนุญาตให้หนึ่งเพื่อระบุชนิดของค่าที่ถูกต้องที่ตัวแปรของคุณสามารถทำได้

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

ทุกคนสามารถชี้ให้ฉันรู้วิธีการใช้อย่างถูกต้อง ...

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

... ควรใช้เมื่อใดทำไมถึงไม่

ฉันพบว่าตัวเองยุ่งยากน้อยลงในระหว่างการพัฒนาเนื่องจากฉันไม่ต้องจัดการกับปัญหาการโหลดซ้ำกับ defvar และ setq

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