โอเวอร์เลย์คืออะไร
ก่อนอื่นพวกมันคือวัตถุเอลิค สิ่งนี้จะเกี่ยวข้องในภายหลัง
ดังที่คุณพูดถึงตัวเองมันเป็นเลเยอร์ที่ใช้กับส่วนบนของพื้นที่ของบัฟเฟอร์ เลเยอร์เหล่านี้มีคุณสมบัติข้อความเช่นเดียวกับข้อความจริงในบัฟเฟอร์ คุณสมบัติปกติใด ๆ ที่มีการซ้อนทับนำไปใช้กับข้อความด้านล่าง อย่างไรก็ตามมีคุณสมบัติบางอย่างที่พิเศษสำหรับการวางซ้อน (พวกเขาจะไม่ทำอะไรเลยหากนำไปใช้กับข้อความ)
ทำไมจึงมีประโยชน์
ด้วยเหตุผลสองประการที่ฉันได้กล่าวไว้ข้างต้น:
พวกเขาเป็นวัตถุ
ซึ่งหมายความว่าคุณสามารถเก็บไว้ในรายการและจัดการได้อย่างง่ายดาย คุณสามารถเปลี่ยนคุณสมบัติได้โดยไม่ต้องติดตามว่าพวกเขาอยู่ที่ไหนในตอนนี้ ยิ่งไปกว่านั้นคุณสามารถใช้มันเพื่อติดตามสิ่งที่อยู่ในบัฟเฟอร์
คำตอบของ Stefanนี้เป็นตัวอย่างที่ดีของการซ้อนทับที่ใช้ในการติดตามขอบเขตบัฟเฟอร์ นี่เป็นตัวอย่างสั้น ๆ ของมัน
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
มันใช้การซ้อนทับเพื่อบันทึกว่าจะจัดตำแหน่งภูมิภาคใดและ regexp ใดที่จะใช้ในแต่ละพื้นที่ my--auto-align-overlays
คือ
รายการที่จัดเก็บซ้อนทับและสามารถเข้าถึงได้อย่างสะดวกสบายโดยดูจากรายการนี้
ในทางตรงกันข้ามถ้าเราใช้คุณสมบัติข้อความสำหรับสิ่งนี้ (ซึ่งเป็นไปได้) เราจะไม่มีวิธีเข้าถึงที่ง่าย คุณต้องแยกวิเคราะห์บัฟเฟอร์เพื่อค้นหาคุณสมบัติข้อความ
พวกมันมีพลังมากกว่าเล็กน้อย
มีคุณสมบัติข้อความสองสามอันเท่านั้นที่มีผลต่อการซ้อนทับเท่านั้น คุณสามารถค้นหารายชื่อทั้งหมด
ในคู่มือการใช้งาน มันใหญ่เกินไปที่จะรวมไว้ที่นี่ แต่นี่เป็นไฮไลต์สั้น ๆ
before-string
ค่าของคุณสมบัตินี้เป็นสตริงที่จะเพิ่มไปยังจอแสดงผลที่จุดเริ่มต้นของการซ้อนทับ สตริงไม่ปรากฏในบัฟเฟอร์ในแง่ใด ๆ - เฉพาะบนหน้าจอ
line-prefix
คุณสมบัตินี้ระบุข้อกำหนดการแสดงผลเพื่อผนวกเข้ากับแต่ละบรรทัดที่ไม่ต่อเนื่อง ณ เวลาที่แสดง ดูที่การตัดปลาย
wrap-prefix
คุณสมบัตินี้ระบุข้อกำหนดการแสดงผลเพื่อผนวกเข้ากับแต่ละบรรทัดการต่อเนื่อง ณ เวลาแสดง ดูที่การตัดปลาย
โดยเฉพาะอย่างยิ่งbefore-string
คุณสมบัติช่วยให้คุณสามารถส่งผลกระทบต่อการแสดงของบัฟเฟอร์แม้จะมีการซ้อนทับความกว้าง 0 สิ่งใดที่คุณไม่สามารถทำได้ด้วยคุณสมบัติข้อความ ทุกสิ่งที่คุณทำกับคุณสมบัติข้อความต้องผ่านข้อความที่มีอยู่ (ซึ่งอาจซ่อนข้อความนี้) หรืออ่านข้อความใหม่ที่คุณใส่เข้าไป (ซึ่งจะเปลี่ยนแปลงเนื้อหาจริงของบัฟเฟอร์)
นี่เป็นตัวอย่างข้อมูลเกี่ยวกับสิ่งนั้น ประเมินบนบัฟเฟอร์ชั่วคราว
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
พวกเขาไม่ดีเมื่อไหร่
การซ้อนทับมีความต้องการมากกว่า (การประมวลผลอย่างชาญฉลาด) มากกว่าคุณสมบัติข้อความ การดำเนินการที่เกี่ยวข้องบางอย่าง (เช่นการแทรกข้อความหากฉันไม่เข้าใจผิด) ใช้เวลาเป็นสัดส่วนกับจำนวนของการวางซ้อนในบัฟเฟอร์ ด้วยเหตุนี้จึงไม่เหมาะสมเมื่อคุณต้องการใช้จำนวนมาก ในกรณีนี้คุณควรลาออกไปยังคุณสมบัติข้อความ
i text properties
แน่นอน