หากคุณต้องการแยก custom-set-variables
ของคุณออก แต่ต้องการอะไรที่เบากว่า initsplit.el
ให้ลองทำดังนี้:
(defmacro custom-set-variable (var value)
"Call `custom-set-variables' with a warning shown
when customizing using the customize GUI.
XXX: does not support setting the optional NOW and
REQUEST (dependency) fields."
(custom-set-variables
;; `load-file-name' is set by `load-file':
;; http://stackoverflow.com/a/1971376/470844
`(,var ,value nil nil
,(format "!!! CAREFUL: CUSTOM-SET IN %s !!!" load-file-name))))
ตอนนี้ ให้วางโมดูลการกำหนดค่าของคุณในไฟล์แยกกัน และโหลดโมดูลเหล่านั้นด้วย load-file
ใน ~/.emacs
ของคุณ ตามที่คนอื่นๆ แนะนำ ในแต่ละโมดูลการกำหนดค่า ให้ใช้
(custom-set-variable var value)
แทน
(custom-set-variables '(var value))
or
(setq-default var value)
เมื่อตั้งค่าตัวแปรที่จัดการโดยการปรับแต่ง จากนั้น หากคุณจำเป็นต้องปรับแต่งตัวแปรโดยใช้อินเทอร์เฟซการปรับแต่ง คุณจะเห็นคำเตือนที่แจ้งว่าควรเก็บการปรับแต่งไว้ในไฟล์ใด:
"!!! CAREFUL: CUSTOM-SET IN <path to module file> !!!"
หากคุณควบคุมเวอร์ชันของไฟล์กำหนดค่า ส่วนต่างจะบอกบรรทัด ~/.emacs
ของคุณที่จะย้ายไปยังโมดูลแบบกำหนดเอง
การอภิปรายเกี่ยวกับปัญหาเกี่ยวกับการเรียก custom-set-variables
หลายสายอย่างไร้เดียงสา: http://www.dotemacs.de/custbuffer.html< /ก>
แก้ไข: ตอบคำถามของอลัน
ปัญหาที่แมโคร custom-set-variable
ด้านบนแก้ไขได้
อินเทอร์เฟซการปรับแต่งใน Emacs จะบันทึกตัวแปรชุดแบบกำหนดเองทั้งหมดใน ~/.emacs
ทุกครั้งที่คุณแก้ไขตัวแปรชุดแบบกำหนดเอง หากคุณทำให้ตัวแปรที่ตั้งค่าแบบกำหนดเองของคุณเป็นโมดูล โดยกระจายตัวแปรเหล่านั้นไปยังไฟล์หลายๆ ไฟล์ คุณจะต้องตระหนักว่าเมื่อใดที่ emacs แทรกการตั้งค่าที่ซ้ำกันใน .emacs ของคุณ และลบออก มาโคร custom-set-variable
ด้านบนช่วยให้คุณทำสิ่งนี้ได้
ตัวอย่างจริงจากไฟล์ปรับแต่งของฉัน
ฉันกำหนดตัวแปรที่เกี่ยวข้องกับช่องว่างในไฟล์ ~/.emacs.d/extensions/whitespace.el
ที่โหลดโดย ~/.emacs
. ตัวอย่างเช่น ฉันตั้งค่า search-whitespace-regexp
ตัวแปรเช่นนี้:
(nc:custom-set-variable search-whitespace-regexp "[ \t\r\n]+")
ตอนนี้มีสองสิ่งที่เกิดขึ้น อันดับแรก เมื่อฉันเจอตัวแปรนั้นในอินเทอร์เฟซการปรับแต่ง ฉันจะได้รับคำเตือน:
![คำเตือนที่สร้างขึ้นในกล่องโต้ตอบการปรับแต่งของ Emacs](https://i.stack.imgur.com/KDJMX.png)
ประการที่สอง ถ้าฉันแก้ไขตัวแปรใดๆ โดยใช้อินเทอร์เฟซการปรับแต่ง ~/.emacs
ของฉันจะทำให้เห็นได้ชัดเจนว่าฉันได้บดบังคำจำกัดความบางอย่าง ตัวอย่างเช่น หลังจากเปลี่ยน search-whitespace-regexp
และ global-whitespace-mode
ในอินเทอร์เฟซการปรับแต่ง ฉันจะได้รับ:
$ svn di --diff-cmd "diff" -x "-U0" ~/v/conf
Index: /home/collins/v/conf/dot.emacs
===================================================================
--- /home/collins/v/conf/dot.emacs (revision 267)
+++ /home/collins/v/conf/dot.emacs (working copy)
@@ -55,0 +56 @@
+ '(agda2-include-dirs (\` ("." (\, (file-truename "~/local/opt/agda-std-lib/src")))) nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/agda.el !!!")
@@ -58,0 +60,3 @@
+ '(global-whitespace-mode t)
+ '(indent-tabs-mode nil nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
+ '(indicate-empty-lines t nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -72,0 +77 @@
+ '(search-whitespace-regexp "" nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -74,0 +80 @@
+ '(tab-width 2 nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
มาโครไม่ได้ช่วยให้ฉันจำได้ว่าฉันเปลี่ยน search-whitespace-regexp
เพียงแต่ว่ามันถูกตั้งค่าไว้ที่อื่นแล้ว แต่มันช่วยให้ฉันรู้ว่าการตั้งค่าตัวแปรใดที่ฉันควรลบออกจาก ~/.emacs
ของฉัน (ทั้งหมดที่มีคำเตือน) และการตั้งค่าใดที่ฉันควรทิ้งไว้ my ~/.emacs
หรือย้ายไปยังไฟล์อื่นที่แยกจากกัน (ทั้งหมดโดยไม่มีคำเตือน)
บทสรุป
มาโครอาจใช้มากเกินไป แต่เมื่อมีอยู่แล้วจะใช้งานง่าย และทำให้ง่ายต่อการหลีกเลี่ยงการยิงตัวเองด้วยตัวแปรการตั้งค่าแบบกำหนดเองที่มีเงา
person
ntc2
schedule
10.06.2012