ทับซ้อนกันคืออะไรและแตกต่างจากคุณสมบัติข้อความอย่างไร


23

คู่มือการใช้งาน :

คุณสามารถใช้การวางซ้อนเพื่อเปลี่ยนลักษณะที่ปรากฏของข้อความบัฟเฟอร์บนหน้าจอเพื่อคุณสมบัติการนำเสนอ

จากชื่อของมันแนะนำว่าสามารถใช้เพื่อสร้าง "เลเยอร์" เหนือข้อความที่มีอยู่ได้ แต่คำอธิบายข้างต้นดูเหมือนจะบ่งบอกว่ามันเปลี่ยนลักษณะที่ปรากฏของข้อความซึ่งให้ความรู้สึกคล้ายกับคุณสมบัติของข้อความ

การใช้การวางซ้อนอย่างเป็นรูปธรรมคืออะไร พวกเขาเสนออะไรที่คุณสมบัติข้อความไม่ได้ พวกเขาสามารถใช้เขียนข้อความทับข้อความในบัฟเฟอร์เช่นป๊อปอัพกล่องข้อมูล ฯลฯ ได้หรือไม่?


อ่านเพิ่มเติมในส่วนของคู่มือมากกว่าแค่ประโยคเดียว มันค่อนข้างชัดเจนอธิบาย IMO รวมถึงความแตกต่างจากคุณสมบัติข้อความ ดูเพิ่มเติม (ในคู่มือเดียวกัน) i text propertiesแน่นอน
Drew

คำตอบ:


10

โอเวอร์เลย์คืออะไร

ก่อนอื่นพวกมันคือวัตถุเอลิค สิ่งนี้จะเกี่ยวข้องในภายหลัง

ดังที่คุณพูดถึงตัวเองมันเป็นเลเยอร์ที่ใช้กับส่วนบนของพื้นที่ของบัฟเฟอร์ เลเยอร์เหล่านี้มีคุณสมบัติข้อความเช่นเดียวกับข้อความจริงในบัฟเฟอร์ คุณสมบัติปกติใด ๆ ที่มีการซ้อนทับนำไปใช้กับข้อความด้านล่าง อย่างไรก็ตามมีคุณสมบัติบางอย่างที่พิเศษสำหรับการวางซ้อน (พวกเขาจะไม่ทำอะไรเลยหากนำไปใช้กับข้อความ)

ทำไมจึงมีประโยชน์

ด้วยเหตุผลสองประการที่ฉันได้กล่าวไว้ข้างต้น:

พวกเขาเป็นวัตถุ

ซึ่งหมายความว่าคุณสามารถเก็บไว้ในรายการและจัดการได้อย่างง่ายดาย คุณสามารถเปลี่ยนคุณสมบัติได้โดยไม่ต้องติดตามว่าพวกเขาอยู่ที่ไหนในตอนนี้ ยิ่งไปกว่านั้นคุณสามารถใช้มันเพื่อติดตามสิ่งที่อยู่ในบัฟเฟอร์

คำตอบของ 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!")

พวกเขาไม่ดีเมื่อไหร่

การซ้อนทับมีความต้องการมากกว่า (การประมวลผลอย่างชาญฉลาด) มากกว่าคุณสมบัติข้อความ การดำเนินการที่เกี่ยวข้องบางอย่าง (เช่นการแทรกข้อความหากฉันไม่เข้าใจผิด) ใช้เวลาเป็นสัดส่วนกับจำนวนของการวางซ้อนในบัฟเฟอร์ ด้วยเหตุนี้จึงไม่เหมาะสมเมื่อคุณต้องการใช้จำนวนมาก ในกรณีนี้คุณควรลาออกไปยังคุณสมบัติข้อความ


12

คุณสมบัติการวางซ้อนและข้อความมีความสามารถเหมือนกันทุกประการ พวกเขาเพิ่มระยะขอบการเปลี่ยนแปลง, ปุ่ม, ใบหน้า, ไอคอนขอบ, เคล็ดลับเครื่องมือ, ภาพ, ไฮไลท์ ฯลฯ เพื่อส่วนที่เฉพาะเจาะจงของข้อความ อย่างไรก็ตามมีแนวคิดแตกต่างกันมาก:

การซ้อนทับเป็นอิสระคุณสมบัติของข้อความไม่ได้ Emacs มีประเภทการซ้อนทับที่แตกต่างกันแต่ไม่มี "ประเภทคุณสมบัติข้อความ" คุณสมบัติข้อความจะผูกติดอยู่กับสตริงที่ตั้งไว้ การวางซ้อนในทางกลับกันจะแนบกับบัฟเฟอร์

มีความหมายในทางปฏิบัติแตกต่างกันเล็กน้อยดังนี้:

  • คุณสามารถตั้งค่าคุณสมบัติข้อความบนสตริงที่ไม่ได้เป็นส่วนหนึ่งของบัฟเฟอร์ใด ๆ ในขณะที่คุณต้องการบัฟเฟอร์สำหรับการวางซ้อน
  • คุณไม่สามารถเก็บรายการคุณสมบัติข้อความที่คุณเพิ่มไว้ที่ไหนสักแห่งในขณะที่มันง่ายต่อการเก็บรายการของการซ้อนทับที่เพิ่มลงในบัฟเฟอร์และตัวอย่างเช่นลบการวางซ้อนทั้งหมดของคุณในคราวเดียว
  • คุณสามารถมีการซ้อนทับครั้งเดียวที่ตั้งค่าการวางซ้อนหลายครั้งบนข้อความ (เช่นใบหน้า, เคล็ดลับเครื่องมือและไอคอนที่ขอบ) ดังนั้นคุณสามารถใช้การซ้อนทับเพื่อจัดการ "กลุ่ม" คุณสมบัติเป็นหน่วยเดียวโดยที่ไม่มี สิ่งดังกล่าวสำหรับคุณสมบัติข้อความ คุณตั้งค่าแต่ละรายการและจัดการแต่ละรายการ

สาระสำคัญของทั้งหมดนี้คือคุณสามารถจัดการการวางซ้อนแยกต่างหากจากเนื้อหาข้อความ โดยทั่วไปแล้วคุณจะใช้เพื่อสิ่งต่าง ๆ ที่คุณจะแสดงในบัฟเฟอร์แม้ว่ามันจะเป็นอิสระจากข้อความ

ในทางปฏิบัติคุณจะใช้การวางซ้อนหากสิ่งที่คุณต้องการเพิ่มในการเปลี่ยนแปลงข้อความบ่อยครั้งในขณะที่คุณใช้คุณสมบัติข้อความถ้าสิ่งนั้นคงที่

ตัวอย่างเช่น Emacs ใช้คุณสมบัติข้อความเพื่อสร้างปุ่มและเครื่องมือป้อนข้อมูลในM-x customizeบัฟเฟอร์ วิดเจ็ตเหล่านี้ถูกสร้างขึ้นหนึ่งครั้งและอยู่ที่นั่นตราบใดที่บัฟเฟอร์ยังมีชีวิตอยู่ดังนั้นจึงไม่จำเป็นต้องมีการซ้อนทับ

อย่างไรก็ตามFlycheckใช้การวางซ้อนเพื่อเน้นข้อผิดพลาดในบัฟเฟอร์เนื่องจากบ่อยครั้งจำเป็นต้องลบและเพิ่มไฮไลต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.