ฉันไม่ชัดเจนเกี่ยวกับรูปแบบทั้งหมดของตัวแปรบัฟเฟอร์ภายในแม้ว่าหลังจากอ่านเอกสารทั้งหมดและการโพสต์มากมายที่นี่ใน SX
นี่คือบทสรุปของความเข้าใจของฉัน:
(defvar foo ..)
ประกาศตัวแปรแบบไดนามิกสำหรับไฟล์ แต่ตัวแปรคือ (1) ไม่รู้จักไฟล์อื่นนอกจากว่าพวกเขาจะมีdefvar
คำสั่งเช่นกันและ (2) ตัวแปรนั้นเป็นโกลบอลในขอบเขตไม่ใช่บัฟเฟอร์ในเครื่อง
(make-variable-buffer-local foo)
หลังจากที่defvar
ด้านบนบอกคอมไพเลอร์และทุกคนอื่นว่าตัวแปร foo นั้นจะได้รับการปฏิบัติเสมือนบัฟเฟอร์ในทุก ๆ ที่มันถูกตั้งค่าเมื่อมันถูกตั้งค่า ดังนั้นรูปแบบนี้เป็นรูปแบบที่ดีสำหรับการประกาศตัวแปรบัฟเฟอร์ในเครื่องโดยวางทั้งสองข้อความกลับไปด้านหลัง
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
เพื่อความสะดวก(defvar-local xxx ...)
แบบฟอร์มสามารถใช้เป็นหนึ่งบรรทัดแทนที่สองบรรทัดด้านบน:
(defvar-local xxx ...) ;make xxx buffer local everywhere
เมื่อประกาศไว้ข้างต้นตัวแปร xxx สามารถใช้เหมือนกับตัวแปรอื่น ๆ ในคำสั่ง setq
ถ้าฉันต้องการมีอินสแตนซ์เดียวของตัวแปรบัฟเฟอร์ในตัวที่เป็นตัวแปรแบบไดนามิกทั่วโลกอยู่แล้วฉันจะใช้การประกาศต่อไปนี้ อันแรกประกาศตัวแปรขอบเขตทั่วโลกแบบไดนามิกและคำสั่งที่สองทำให้เพียงหนึ่งอินสแตนซ์ของรุ่นบัฟเฟอร์ท้องถิ่นของตัวแปรนั้นในบัฟเฟอร์ปัจจุบัน:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
ตอนนี้สำหรับคำถามที่อธิบายของฉัน (ทั้งหมดข้างต้นเป็นคำถามโดยนัยว่าความเข้าใจของฉันถูกต้องหรือไม่)
เมื่อตั้งค่าของตัวแปรที่ฉันสามารถใช้หรือsetq
setq-local
ควรsetq-local
ใช้เมื่อใด ทำไม?
จะเกิดอะไรขึ้นถ้าฉันใช้setq-local
กับ vars บัฟเฟอร์ภายในเครื่องหรือไม่ใช่ vars บัฟเฟอร์ภายในเครื่อง
เป็นที่setq-local
จำเป็นสำหรับการdefvar-local
ประกาศตัวแปร?
จะsetq-local
อยู่บนปกติdefvar
ตัวแปรประกาศเปิดเป็นตัวแปรบัฟเฟอร์ท้องถิ่น? (ในคำอื่น ๆsetq-local
อย่างใดเทียบเท่าของการ(make-variable-local xxx)
ประกาศหรือไม่
(setq-local VAR VALUE)
เป็นเพียงการจดชวเลข(set (make-local-variable VAR) VALUE)
ซึ่งเป็น (และยังคงเป็น) สำนวนร่วมกัน