TL; DR : ด้วยfind-file-noselect
คุณมีการควบคุมไม่เกี่ยวกับสิ่งที่เกิดขึ้นจริงและคุณอาจจะจบลงด้วยโหมดเล็ก ๆ น้อย ๆ init.el
โดยพลการเปิดใช้งานในบัฟเฟอร์ขึ้นอยู่กับสิ่งที่ผู้ใช้เปิดใช้งานในของพวกเขา นอกจากนี้การทำความสะอาดก็ยาก
ใช้with-temp-buffer
และinsert-file-contents
แทน หากคุณต้องการโหมดใหญ่หรือรายย่อยที่เฉพาะเจาะจงในบัฟเฟอร์ที่ช่วยให้พวกเขาอย่างชัดเจน ในการเขียนไฟล์ให้ใช้with-temp-file
แทนซึ่งแม้จะมีชื่อของมันก็ช่วยให้คุณสามารถเขียนไฟล์ต่าง ๆ ได้
ผลข้างเคียง
find-file-noselect
มีผลข้างเคียงมากมายรวมถึง
- การถามคำถามแบบโต้ตอบ
- เปิดใช้งานโหมดดูโดยอัตโนมัติสำหรับไฟล์แบบอ่านอย่างเดียว
- เข้าสู่โหมดปกติมิฉะนั้น
find-file-hook
และทำงาน
โหมดปกตินั้นเอง
- เลือกโหมดหลักที่เหมาะสมสำหรับบัฟเฟอร์ปัจจุบันโดยอัตโนมัติ
- รัน hooks โหมดหลักและรองที่สอดคล้องกันทั้งหมด
- และอ่านตัวแปรโลคัลทั้งหมดสำหรับบัฟเฟอร์ปัจจุบันเช่นตัวแปรไฟล์และตัวแปรไดเร็กทอรีซึ่งอาจถามคำถามแบบโต้ตอบเกี่ยวกับตัวแปรโลคัลที่ไม่ปลอดภัย
เนื่องจากมีการเรียกใช้ hooks ทั้งหมดคุณจะได้รับโหมดรองทั้งหมดและฟังก์ชั่น hookที่ผู้ใช้เปิดใช้งานinit.el
ซึ่งอาจทำให้ทุกอย่างจากความไม่สะดวกเล็กน้อย (หากเปิดใช้งานโหมดรองที่ไม่พึงประสงค์) ถึงความเสียหายหลัก (หากผู้ใช้เพิ่มฟังก์ชัน hook ที่คาดว่า ถูกเรียกจากบริบทเชิงโต้ตอบ)
ดูhttps://github.com/flycheck/flycheck/issues/366สำหรับตัวอย่าง การใช้find-file-noselect
ไฟล์ข้อมูลทำให้เกิดการตรวจสอบไวยากรณ์โดย Flycheck และเนื่องจากมันเกิดขึ้นที่การปิดระบบของ Emacs จึงไม่มีเวลาที่จะทำความสะอาดอีกครั้งโดยทิ้งไฟล์ชั่วคราวไว้ข้างหลัง
ทำความสะอาด
ด้วยfind-file-noselect
คุณจะต้องระมัดระวังเป็นพิเศษในการฆ่าบัฟเฟอร์อีกครั้ง find-file-noselect
ไม่ได้ทำเพื่อคุณ
คุณต้องจำบัฟเฟอร์ในบางสถานที่และใช้อย่างระมัดระวังunwind-protect
เพื่อให้แน่ใจว่าบัฟเฟอร์ถูกฆ่าแม้ว่าในกรณีที่ไม่ได้อยู่ในระบบ
ทางเลือก
หากต้องการอ่านไฟล์ให้ใช้with-temp-buffer
และinsert-file-contents
ทำสิ่งพื้นฐานที่สุดเท่านั้นเช่นการแปลงระบบโค้ด แต่ไม่ถามคำถามเปิดใช้ hooks หรือตั้งค่าตัวแปรโลคอล:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
ใช้ความระมัดระวังเพื่อฆ่าบัฟเฟอร์ชั่วคราวที่ส่วนท้ายของร่างกาย
ในการเขียนไฟล์ให้ใช้with-temp-file
ซึ่งสร้างบัฟเฟอร์ชั่วคราวและเขียนเนื้อหาไปยังชื่อไฟล์ที่กำหนดที่ส่วนท้ายของเนื้อหา:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
แท็กมาก่อน เป็นความคิดที่ดีที่จะใช้หรือไม่