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แท็กมาก่อน เป็นความคิดที่ดีที่จะใช้หรือไม่