ข้อความชั่วคราวในตำแหน่งหน้าต่างที่ไม่มีข้อความสำหรับปรับขนาด / ซ้อนทับใช่หรือไม่


9

ถาม:ฉันจะแสดงข้อความชั่วคราวในหน้าต่างที่ตำแหน่งหน้าจอโดยไม่มีข้อความสำหรับปรับขนาด / ซ้อนทับได้อย่างไร

ฉันคุ้นเคยกับแนวคิดพื้นฐานที่อยู่เบื้องหลังคุณสมบัติข้อความและภาพซ้อนทับ (ดูที่กระทู้นี้ ) ใช้มันสองสามครั้ง แต่ฉันไม่คุ้นเคยกับมันเลย ความเข้าใจที่ จำกัด ของฉันคือต้องมีข้อความเพื่อปรับขนาดหรือซ้อนทับ แต่ฉันสงสัยว่าจะใช้ส่วนต่าง ๆ ของหน้าต่างที่ไม่มีข้อความใด ๆ

นี่คือภาพหน้าจอสำหรับตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

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


ในระยะสั้นคุณสามารถใช้คุณสมบัติการแสดงผลเพื่อแสดงข้อความที่ไม่ได้อยู่ที่นั่น บางคนอาจให้คำตอบแบบเต็มก่อนที่ฉันจะกลับบ้าน
Malabarba

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

คุณสามารถไม่เพียงแค่insertใส่ข้อความลงในบัฟเฟอร์และปรับให้เหมาะสมใช่ไหม
rekado

คำตอบ:


6

ฉันได้ยกตัวอย่างการทำงานของฟังก์ชั่นที่ใช้สตริงและแสดงมันชั่วคราวด้วยการหมดเวลาหลังจากข้อความบัฟเฟอร์:

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

คาถาต่อไปนี้จะส่งผลให้ตัวอย่างกล่องสีแดงด้านล่างของคุณ:

(my-momentarily-display-after-buffer-end "Nothing to see here...")

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

ตัวอย่างอื่น ๆ สามารถใช้แนวคิดเดียวกันนี้เพื่อแสดงข้อความหลังจากสิ้นสุดบรรทัด:

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

การร้องขอต่อไปนี้จะส่งผลให้ตัวอย่างกล่องสีแดงด้านขวาของคุณ:

(my-momentarily-display-after-line-end "annotation")

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


2

momentary-string-displayคุณสามารถแสดงชั่วคราวข้อความในบัฟเฟอร์ที่มีฟังก์ชั่นที่ มันต้องใช้ข้อความเพื่อแสดงและตำแหน่งในบัฟเฟอร์

นี้:

(momentary-string-display "hello there" 200)

จะวางสตริง "hello there" ที่ตำแหน่ง 200 ในบัฟเฟอร์ มันจะย้ายข้อความอื่นทั้งหมด ณ จุดนี้ไปด้านข้างเพื่อให้มีที่ว่างสำหรับ "สวัสดีโลก" แต่ทุกอย่างจะกลับคืนสู่ที่เดิมเมื่อคุณกดปุ่มใด ๆ

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

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

โปรดทราบว่าการซ้อนทับนี้จะผลักข้อความบัฟเฟอร์ออกไป มันจะไม่ครอบคลุมข้อความในตำแหน่งที่กำหนด

ดูเหมือนจะเป็นไปไม่ได้ที่จะวางซ้อนทับที่ตำแหน่งใด ๆ ในบัฟเฟอร์ที่มากกว่าpoint-max/ buffer-sizeนั่นคือคุณอาจจะไม่สามารถวางข้อความที่ตำแหน่งเฉพาะด้านล่างข้อความบัฟเฟอร์เว้นแต่ว่าคุณจะแฮกรอบข้อ จำกัด นี้ แน่นอนคุณสามารถวางข้อความได้ทันทีหลังจากข้อความบัฟเฟอร์พร้อมด้วยafter-stringคุณสมบัติบนภาพซ้อนทับที่ตรึงไว้กับpoint-maxตำแหน่ง

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