ข้อดีของการตั้งค่าตัวแปรด้วย setq แทนที่จะเป็น custom.el?


69

ฉันเห็นคนจำนวนมาก (ผู้เขียนส่วนขยายและคนอื่น ๆ ) ให้ตัวอย่างการกำหนดค่าด้วยsetq:

(setq foo 'bar)

พารามิเตอร์เหล่านี้มักจะถูกกำหนดด้วยทำให้พวกเขาสามารถใช้ได้สำหรับการปรับแต่งผ่านdefcustomcustom.el

ฉันมักจะใช้custom.elเพื่อตั้งค่าพวกเขา จะมีข้อได้เปรียบใด ๆ ในการใช้งานsetqแทนหรือว่าทั้งสองวิธีนั้นเทียบเท่ากันหรือไม่

คำตอบ:


86

setqบางคนอาจจะคิดว่ามันเป็นง่ายในการใช้ บางคนอาจคิดว่ามันเงียบกว่า ในความเป็นจริงมันไร้เดียงสาในกรณีทั่วไป

มันเป็นความจริงว่าสำหรับตัวเลือกผู้ใช้บางอย่างมันไม่สำคัญ แต่สำหรับคนอื่น ๆ มันสำคัญและsetqเป็นวิธีการที่ผิดสำหรับตัวเลือกเหล่านั้น ดังนั้นตามกฎทั่วไปแล้วsetqมันเป็นวิธีการที่ผิด

ถ้าคุณใช้custom-set-variablesหรือcustomize-set-variableแทนsetqหรือถ้าคุณใช้ส่วนติดต่อผู้ใช้กำหนดเอง (เช่นM-x customize-option) แล้วคุณจะแน่ใจว่ามีการเริ่มต้นตั้งใจหรือรหัสการปรับปรุงที่จำเป็นสำหรับค่าตัวเลือกที่จะได้รับการเรียกโดยอัตโนมัติและใช้เท่าที่จำเป็น หากคุณใช้setqสิ่งนี้จะไม่เกิดขึ้น

ตอนนี้ก็ยังเป็นกรณีที่ตัวเลือกของผู้ใช้ส่วนใหญ่โดยเฉพาะคนอีกจำนวนมากที่เขียนขึ้นสำหรับห้องสมุดของบุคคลที่ 3 ไม่ให้ใช้defcustomคำหลัก:setและ:initializeและการใช้setqไม่สำคัญสำหรับพวกเขา แต่ตัวเลือกวานิลลา Emacs จำนวนมากจะใช้คำหลักดังกล่าวและสำหรับผู้ที่ทำเช่นsetqนั้นไม่ใช่สิ่งที่ถูกต้อง ดังนั้นถ้าคุณต้องการที่จะใช้รหัสเสียงกระเพื่อมและไม่ปรับแต่ง UI ที่จะตั้งค่าตัวเลือกของคุณแล้วคุณจะดีกว่าการใช้custom-set-variablesหรือแทนcustomize-set-variable setqมันไม่เคยเจ็บปวดและบางครั้งก็ช่วยได้ (มาก)

แต่สิ่งที่ฉันแนะนำคือการทำสิ่งเหล่านี้ทั้งสอง:

  • ใช้ UI ที่กำหนดเองแทนการเขียน Lisp รหัสสำหรับสิ่งนี้

  • กำหนดตัวแปรcustom-fileเพื่อให้กำหนดเองเขียนการกำหนดเองไปยังไฟล์นั้นและไม่ไปยังไฟล์ init ของคุณ ( ~/.emacs) IOW เก็บรหัสการเริ่มต้นที่เขียนด้วยมือของคุณแยกจากรหัสอัตโนมัติที่เขียนโดยกำหนดเอง


1
คำตอบนี้ดีมากและฉันคิดว่ามีประโยชน์จริง ๆ สำหรับผู้เริ่มต้นมีวิธีส่งเสริมคำถาม / คำตอบแบบนี้หรือไม่?
Willyfrog

5
ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงว่าแม้จะมี: set และ: initialize parameters, setq ยังคงใช้งานได้หากได้รับการอ่านก่อนที่จะโหลดแพ็กเกจ
Malabarba

2
@Willyfrog คุณสามารถโหวตได้!
Zane Shelby

17
ไม่แน่ใจเกี่ยวกับ Drew นั้น สิ่งที่กำหนดเองทั้งหมดค่อนข้างซับซ้อน ก็ไม่มีระบบ emacs นั้นง่ายกว่ามาก การปรับแต่งเป็นเลเยอร์ที่ไม่สอดคล้องกับ elisp สำหรับสิ่งหนึ่งมันสั่ง vars ทั้งหมดด้วยตัวอักษร นอกจากนี้การปรับแต่งจำนวนมากไม่ได้เกี่ยวกับตัวแปร (เช่น hooks, keys) ดังนั้นจึงไม่สามารถใช้การปรับแต่งเองได้ ดังนั้นคุณมีสถานการณ์ของรหัส elisp ด้วยตนเองอยู่แล้ว
Xah Lee

4
@XahLee ฉันแน่ใจ ;-) แต่ใช่ปรับแต่งคือสิ่งที่มันเป็น มันไม่ใช่สิ่งที่ดีที่สุดสำหรับกุญแจ, ตะขอ, คำสำคัญแบบอักษรล็อค, ตารางแสดงผล ฯลฯ แต่สำหรับสิ่งที่มันทำ (ตัวเลือกและใบหน้า) มันค่อนข้างดี ไม่ว่าUIนั้นยอดเยี่ยม แต่การจัดการทริกเกอร์การตรวจสอบประเภท ฯลฯ นั้นมีประโยชน์ ฉันยังต้องการโปรแกรมเมอร์สามารถ (ขยะ) ใช้สิ่งที่ชอบ:typeด้วยdefvar- ฉันไม่คิดว่ามันควรจะ จำกัด ตัวเลือกของผู้ใช้ น่าเสียดายที่โปรแกรมเมอร์หลายคนขี้เกียจในการใช้งาน:typeและผลลัพธ์ไม่เป็นประโยชน์มาก (นั่นไม่ใช่ความผิดของการปรับแต่ง)
ดึง

37

ฉันชอบsetqมากกว่าcustomizeด้วยเหตุผลหลายประการ:

  1. สิ่งสำคัญอันดับแรกคืออนุญาตให้ตัวแปรถูกตั้งค่าแบบเป็นโปรแกรม (เหมือนใน(setq foo (calculate-foo))) ฉันใช้พลังงานนี้ตลอดเวลาในการกำหนดค่าของฉันเพื่อเก็บสิ่งที่แห้ง สำหรับฉันแล้วจุดที่ใช้ Emacs ทั้งหมดคือความสามารถในการโปรแกรมและcustomizeส่วนต่อประสานไม่ทำอะไรเลย
  2. setqยืมตัวเองดีกว่าการควบคุมเวอร์ชันและรหัสองค์กร ฉันแบ่งการเริ่มต้นของฉันระหว่างไฟล์หลายสิบ หากทุกอย่างอยู่ในcustom.elไฟล์ขนาดใหญ่ไฟล์เดียวมันจะยากกว่ามากในการค้นหาและแก้ไขการตั้งค่า
  3. นี่เป็นเรื่องส่วนตัว แต่สำหรับฉันแล้วcustomizeอินเทอร์เฟซทั้งหมดให้ความรู้สึกว่าน่ากลัวมากจาก UIs ที่เลวร้ายที่สุดในยุค 90 ฉันต้องการแก้ไขข้อความด้วยพลังของ Emacs ทุกวัน

@Drew ทำให้จุดที่ดีบางอย่างเกี่ยวกับรายละเอียดปลีกย่อยบางอย่างกับและ:set :initializeฉันใช้ Emacs มานานหลายปีและไม่ค่อยพบปัญหาเช่นนั้น เมื่อฉันทำมันง่ายที่จะสลับออกsetqสำหรับcustom-set-variableในกรณีที่เฉพาะเจาะจง


10
1. คุณสามารถตั้งค่าตัวแปรที่กำหนดเองโดยใช้โปรแกรมได้customize-set-variable(s)และจะดีกว่าเนื่องจากทริกเกอร์ที่เรียกใช้โดยอัตโนมัติ 2. คุณสามารถใช้คำสั่งปรับแต่งต่าง ๆ เพื่อดูชุดและ / หรือตัวแปรที่บันทึกไว้ทั้งหมดในลำดับชั้นที่แตกต่างกันดังนั้นคุณจะได้รับการจัดระเบียบกลุ่มต่าง ๆ โดยอัตโนมัติโดยไม่ต้องใช้ไฟล์แยกต่างหากในการควบคุมเวอร์ชัน 3. มันดีขึ้นมาก หากคุณไม่ชอบ UI คุณยังคงสามารถใช้การปรับแต่งแบบเป็นโปรแกรมและผ่านคำสั่งแบบโต้ตอบที่หลีกเลี่ยงโหมดการปรับแต่งเพื่อรับผลประโยชน์อื่น ๆ ทั้งหมดของการใช้การปรับแต่ง
Nick McCurdy

23

ข้อดีอย่างหนึ่งของการใช้setqแทนการcustomizeอ่านคือ หนึ่งมีอิสระในการเพิ่มความคิดเห็นแต่ละการปรับแต่งเพื่อความชอบของคนที่ IMO ช่วยเพิ่มความสามารถในการอ่าน ท่านสามารถจัดกลุ่มการปรับแต่งที่เกี่ยวข้องเข้าด้วยกันซึ่งจะช่วยปรับปรุงแบบแยกส่วน ในที่สุดฉันจะยืนยันว่าการนำทางผ่านบัฟเฟอร์ elisp นั้น "ง่ายขึ้น" จากนั้นนำทาง UI ที่กำหนดเองและวิดเจ็ต

ในทางกลับกันการปรับแต่งช่วยให้คุณสามารถย้อนกลับไปสู่ค่าเริ่มต้นซึ่งอาจมีค่าเมื่อสิ่งต่าง ๆ ยุ่งเหยิง

แก้ไข: คำตอบของ Drew ให้เหตุผลที่ยอดเยี่ยมในการใช้customize-set-variablesซึ่งสามารถให้ประโยชน์ทั้งหมดที่ฉันได้ชี้ไป อย่างไรก็ตาม UI ที่กำหนดเองไม่ได้ให้ยืมตัวเองกับการกำหนดค่าแบบพกพาในแพลตฟอร์มที่แตกต่างกันเช่นเดียวกับ elisp ดิบ หากคุณต้องการตัวแปรที่จะต้องมีการตั้งค่าระบบปฏิบัติการคุณจะต้องย้อนกลับไปยัง elisp ในหลายกรณี จุดของฉันเกี่ยวกับการนำทางที่ง่ายขึ้นในบัฟเฟอร์ elisp ยังคงยืนอยู่


นอกจากนี้คุณยังสามารถเปลี่ยนกลับเป็นค่าเริ่มต้นได้ด้วยsetqเพียงแค่แสดงความคิดเห็นในsetqบรรทัดและรีสตาร์ท emacs
T. Verron

3
ใช่ แต่การปรับแต่งสามารถย้อนกลับโดยไม่ต้องรีสตาร์ทที่น่ารำคาญ มีประโยชน์อย่างยิ่งสำหรับทดลองใช้การตั้งค่าใหม่
Vamsi

2
เกี่ยวกับคำอธิบายประกอบอินเทอร์เฟซที่กำหนดเองจะช่วยให้คุณสามารถเพิ่มความคิดเห็นในแต่ละตัวแปรที่คุณเปลี่ยนแปลง
Andrew Swann

custom-set-variables คือ "raw elisp" และฉันใช้มันทุกวันกับเครื่องหลายเครื่อง เพียงคัดลอกออกจากสถานที่ที่กำหนดเองเขียน (ถ้าคุณไม่ได้เขียนเอง)
Croad Langshan

ส่วน <kbd> Mx ปรับแต่ง - * </kbd> อินเทอร์เฟซมีฟิลด์ "ความคิดเห็น" ที่ช่วยให้การจัดเก็บความคิดเห็นพร้อมกับตัวแปร
kdb

-1

อีกทางเลือกหนึ่งคือการใช้จอห์น Wiegley ของใช้แพคเกจ นี่เป็นวิธีการเขียนโปรแกรมเพื่อกำหนดค่าแพคเกจที่เล่นได้ดีกับกระบวนการเริ่มต้นแพ็คเกจ emacs 24+ นี่คือตัวอย่างการใช้งานจาก readme:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

ประเด็นก็คือแพคเกจการใช้งานเป็นมาโครและไม่ได้ประเมินอาร์กิวเมนต์ทันที :initและ:configพารามิเตอร์ที่ได้รับการประเมินในแต่ละขั้นตอนของกระบวนการเริ่มต้นที่ทำให้มันเป็นไปได้ที่จะมีการกำหนดค่าของแต่ละแพคเกจในสถานที่หนึ่ง แต่มีแต่ละส่วนดำเนินการในขั้นตอนที่เหมาะสมของการเริ่มต้น

หากไม่มีสิ่งที่ต้องการuse-packageแพคเกจบางอย่างต้องมีส่วนหนึ่งของรหัสการเริ่มต้นของพวกเขาไปก่อน(package-initialize)และส่วนอื่นที่จะไปหลังจาก หากคุณมีแพ็กเกจมากมายเช่นนั้นการกำหนดค่าเริ่มต้นของพวกเขาจะต้องมีการแทรก

ข้อดีอีกอย่างของuse-packageมันคือมันสามารถติดตั้งแพ็กเกจที่ขาดหายไปโดยอัตโนมัติจากการใช้ package.el ถ้าคุณนำคุณ. emacs ไปยังเครื่องใหม่หรือถ้าคุณแชร์การกำหนดค่าของคุณกับผู้ใช้รายอื่นและการเริ่มต้นทั้งหมด

นอกจากนี้ยังมีข้อโต้แย้งคำหลักเพิ่มเติมที่ช่วยให้การควบคุมกระบวนการเริ่มต้น

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


2
ไม่ได้ตอบคำถามจริงๆ ในคำตอบของคุณคุณใช้ setq โดยไม่มีคำอธิบายว่าทำไม
J David Smith

3
ฉันคิดว่าuse-packageตัวเองมีข้อดีของการกำหนดค่าแบบแยกส่วนและยังนำเข้าและกำหนดค่าแพ็คเกจได้ในที่เดียว setqแต่ใช่ตัวอย่างที่ใช้ เป็นไปได้customize-set-variableไหมที่จะใช้ที่นี่? ฉันไม่แน่ใจ. เราสามารถ / ควรจะเปลี่ยนมัน (หรือcustomize-set-value) เพื่อsetq?
ไมค์

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