วิธีการป้องกันไม่ให้ใบหน้ามีเลือดออกสู่บริเวณโดยรอบของบัฟเฟอร์?


20

ถาม:ฉันจะป้องกันไม่ให้org-modeใบหน้าลิงก์หลุดเข้าไปใน...ตัวละครที่เลือกได้ที่ส่วนท้ายของส่วนหัวแบบพับได้อย่างไร

นี่คือเห็บภาพที่ทำให้ฉันบ้าเล็กน้อย เมื่อในorg-modeการเชื่อมโยงเป็นสิ่งสุดท้ายในบรรทัดการเชื่อมโยงที่หน้าซีดลงใน...ที่ระบุว่าส่วนหัวจะพับขึ้น หากมีการพูดเว้นวรรคหลังลิงค์ไม่มีเลือดออก

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

พฤติกรรมการเชื่อมโยงหน้าแปลก

ก่อนอื่นทำไมสิ่งนี้ถึงเกิดขึ้น ประการที่สองและอีกหลายประเด็นฉันจะทำให้มันหยุดได้อย่างไร

ปรับปรุง 1:ตามความคิดเห็นโพสต์ด้านล่างเป็นภาพหน้าจอของบัฟเฟอร์ที่มีส่วนหัวปิดและเปิด ฉันเปิด Emacs โดยไม่มีไฟล์ init (เช่น, emacs -Q), required org-mode และเปิดไฟล์ตัวอย่างนี้ ดังนั้น: ดูเหมือนจะไม่เป็นสิ่งที่น่ากลัวในการตั้งค่าของฉัน

ส่วนหัวทั้งหมดปิด: ปิดลิงค์ลิงค์แปลก ๆ

ส่วนหัวทั้งหมดเปิดอยู่: ลิงค์เปิดหน้าประหลาด

ชุดรูปแบบที่ฉันใช้ด้านบนคือ inkpot ถึงแม้ว่าฉันจะได้รับปัญหาเดียวกันเมื่อใช้ชุดรูปแบบพลังงานแสงอาทิตย์รวมถึงชุดรูปแบบเริ่มต้น (เช่นในภาพหน้าจอใหม่)

รุ่น Emacs คือ 24.3.1 ฉันได้รับผลลัพธ์เดียวกันเมื่อใช้ org รุ่น 7.9.3f (เช่นที่มาพร้อมกับ Emacs เวอร์ชันนั้น) รวมถึง 8.3beta

UPDATE 2:นี่คือตัวอย่างการทำงานขั้นต่ำในการตอบกลับคำขอความคิดเห็น:

* here's a header with a [[~/somefile.txt][link at the end]]

  - This one's a problem
  - Interesting note:
    + put the cursor immediately *after* the *d* in "end" with the
      header closed/folded
      * the face no longer bleeds over into the dots
    + move the cursor anywhere else
      * the face bleeds over into the dots again

* here's another [[~/someotherfile.txt][go at it]]
  DEADLINE: <2014-10-26 Sun>

  - This one's also a problem

* here's another header with a [[~/anotherfile.txt][link followed by a space]] 

  - No bleed-over onto the dots with this one

1
ฉันมีช่วงเวลาที่ยากลำบากในการทำซ้ำบน Emacs 24.3.1 และโหมด org ที่มาพร้อมกับมัน แม้จะมีขั้นตอนการทำซ้ำที่คุณพูดถึง คุณสามารถแสดงบัฟเฟอร์โหมดองค์กรดิบได้หรือไม่ (ที่กล่าวว่าผมถือว่ามันเป็นข้อผิดพลาดใน org โหมดไม่เพิ่มความช่วยเหลือขึ้นบรรทัดใหม่พิเศษ.?)
aerique

เหมือนกับ @ aerique ฉันไม่เห็นสิ่งนี้ที่นี่ ดังนั้นอาจขึ้นอยู่กับเวอร์ชั่นของ Emacs หรือรายละเอียดของบัฟเฟอร์โหมด th Org
สเตฟาน

@ ด่านจากความอยากรู้คุณใช้ชุดรูปแบบอะไร
ลุค

1
@Dan คุณสามารถช่วยระบุแหล่งที่มาของไฟล์ตัวอย่างสำหรับการทดสอบได้หรือไม่?
Wilfred Hughes

2
@Dan ฉันสามารถทำซ้ำนี้ใน Emacs 24.4 ด้วยไฟล์ที่คุณให้
rekado

คำตอบ:


10

ลักษณะเช่นนี้ข้อผิดพลาดที่เกิดจากorg-modeของorg-activate-bracket-linksฟังก์ชั่น

นี่คือสิ่งที่ฟังก์ชั่นนี้มีลักษณะ:

(defun org-activate-bracket-links (limit)
  "Run through the buffer and add overlays to bracketed links."
  (if (and (re-search-forward org-bracket-link-regexp limit t)
       (not (org-in-src-block-p)))
      (let* ((hl (org-match-string-no-properties 1))
         (help (concat "LINK: " (save-match-data (org-link-unescape hl))))
         (ip (org-maybe-intangible
          (list 'invisible 'org-link
            'keymap org-mouse-map 'mouse-face 'highlight
            'font-lock-multiline t 'help-echo help
            'htmlize-link `(:uri ,hl))))
         (Vp (list 'keymap org-mouse-map 'mouse-face 'highlight
               'font-lock-multiline t 'help-echo help
               'htmlize-link `(:uri ,hl))))
    ;; We need to remove the invisible property here.  Table narrowing
    ;; may have made some of this invisible.
    (org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0))
    (remove-text-properties (match-beginning 0) (match-end 0)
                '(invisible nil))
    (if (match-end 3)
        (progn
          (add-text-properties (match-beginning 0) (match-beginning 3) ip)
          (org-rear-nonsticky-at (match-beginning 3))
          (add-text-properties (match-beginning 3) (match-end 3) vp)
          (org-rear-nonsticky-at (match-end 3))
          (add-text-properties (match-end 3) (match-end 0) ip)
          (org-rear-nonsticky-at (match-end 0)))
      (add-text-properties (match-beginning 0) (match-beginning 1) ip)
      (org-rear-nonsticky-at (match-beginning 1))
      (add-text-properties (match-beginning 1) (match-end 1) vp)
      (org-rear-nonsticky-at (match-end 1))
      (add-text-properties (match-end 1) (match-end 0) ip)
      (org-rear-nonsticky-at (match-end 0)))
    t)))

มันค้นหาการจับคู่สำหรับลิงค์ที่มีวงเล็บ (เช่น[[target][label]]ซ่อน[[target][ส่วนโดยการเพิ่มipคุณสมบัติข้อความแล้วเชื่อมโยงlabelโดยการเพิ่มvpคุณสมบัติข้อความและในที่สุดก็ลบการติดตาม]]โดยการเพิ่มipคุณสมบัติข้อความอีกครั้ง

ทั้งหมดนี้ดูถูกต้อง org-rear-nonsticky-atควรดูแลทรัพย์สินที่มีเลือดออก

ลักษณะการทำงานนี้จะเรียกจากที่ซ่อนท้าย(add-text-properties (match-end 3) (match-end 0) ip) ]]เฉพาะ'invisible 'org-linkสถานที่ให้บริการที่ก่อให้เกิดพฤติกรรมนี้คุณสมบัติอื่น ๆ ดูเหมือนจะบริสุทธิ์

คุณสามารถเขียนทับorg-activate-bracket-linksสิ่งที่ipไม่ได้ตั้งค่าอีกต่อไป'invisibleแต่'display ""มีผลเหมือนกัน:

(defun org-activate-bracket-links (limit)
  "Run through the buffer and add overlays to bracketed links."
  (if (and (re-search-forward org-bracket-link-regexp limit t)
       (not (org-in-src-block-p)))
      (let* ((hl (org-match-string-no-properties 1))
         (help (concat "LINK: " (save-match-data (org-link-unescape hl))))
         (ip (org-maybe-intangible
          (list 'display ""
            'keymap org-mouse-map 'mouse-face 'highlight
            'font-lock-multiline t 'help-echo help
            'htmlize-link `(:uri ,hl))))
         (Vp (list 'keymap org-mouse-map 'mouse-face 'highlight
               'font-lock-multiline t 'help-echo help
               'htmlize-link `(:uri ,hl))))
    ;; We need to remove the invisible property here.  Table narrowing
    ;; may have made some of this invisible.
    (org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0))
    (remove-text-properties (match-beginning 0) (match-end 0)
                '(invisible nil))
    (if (match-end 3)
        (progn
          (add-text-properties (match-beginning 0) (match-beginning 3) ip)
          (org-rear-nonsticky-at (match-beginning 3))
          (add-text-properties (match-beginning 3) (match-end 3) vp)
          (org-rear-nonsticky-at (match-end 3))
          (add-text-properties (match-end 3) (match-end 0) ip)
          (org-rear-nonsticky-at (match-end 0)))
      (add-text-properties (match-beginning 0) (match-beginning 1) ip)
      (org-rear-nonsticky-at (match-beginning 1))
      (add-text-properties (match-beginning 1) (match-end 1) vp)
      (org-rear-nonsticky-at (match-end 1))
      (add-text-properties (match-end 1) (match-end 0) ip)
      (org-rear-nonsticky-at (match-end 0)))
    t)))

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


ขอบคุณสำหรับความพยายาม (+1 สำหรับสิ่งนั้น!) แต่วิธีนี้ไม่ได้ผลสำหรับฉัน แทนที่จะปรับ[[~/somefile.txt][link label]]ให้เหมาะสมเป็นlink label(โดยที่ตัวเอียงระบุใบหน้ามาตรฐานสำหรับลิงก์) มันจะกลายเป็นlink label]](โดยไม่มีการเปลี่ยนแปลงใบหน้า) ฉันจะรายงานข้อผิดพลาด
แดน

อืมแปลกมาก การเปลี่ยนแปลงเพียงคำจำกัดความของฉันorg-activate-bracket-linksคือการแทนที่'invisible non-nilด้วย'display ""ดังนั้นจึงควรใช้ลิงค์ของหน้าเหมือนเดิม แน่นอนมันทำงานสำหรับฉันใน Emacs 24.4 แต่ผมคิดว่าพลังงานคือการใช้จ่ายที่ดีขึ้นในรายงานข้อผิดพลาดมากกว่าการพยายามที่จะทำให้การทำงานสับของฉัน ... :)
rekado
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.