bagaimana mencegah wajah agar tidak berdarah ke area penyangga sekitarnya

20

T: Bagaimana cara menjaga agar org-modetautan tidak berdarah ke ...karakter tampilan selektif di akhir header yang terlipat?

Ini adalah tanda centang visual yang membuat saya sedikit gila. Ketika, dalam org-mode, tautan adalah hal terakhir pada sebuah garis, permukaan tautan berdarah ke dalam ...yang menunjukkan bahwa header dilipat. Jika ada, katakanlah, ruang kosong setelah tautan, tidak ada pendarahan.

Tangkapan layar yang saya posting menunjukkan masalah tersebut. Baris tiga adalah baris bermasalah dengan tidak ada karakter antara ujung tautan dan ujung baris, sedangkan baris empat menunjukkan tautan, diikuti oleh spasi:

perilaku wajah tautan aneh

Pertama-tama, mengapa ini terjadi? Kedua, dan lebih tepatnya, bagaimana saya membuatnya berhenti?

UPDATE 1: Sesuai komentar, diposting di bawah ini adalah screenshot dari buffer dengan header tertutup dan terbuka. Saya telah membuka Emacs tanpa file init (yaitu, emacs -Q), required org-mode, dan membuka file contoh ini. Jadi: sepertinya bukan sesuatu yang kooky dalam pengaturan saya.

Semua tajuk ditutup: wajah tautan aneh ditutup

Semua header terbuka: wajah tautan aneh terbuka

Tema yang saya gunakan di atas adalah inkpot, meskipun saya mendapatkan masalah yang sama ketika menggunakan tema yang dilarutkan serta tema default (seperti pada screenshot baru).

Versi Emacs adalah 24.3.1. Saya mendapatkan hasil yang sama ketika menggunakan versi org 7.9.3f (yaitu, yang dibundel dengan versi Emacs), serta 8.3beta.

UPDATE 2: berikut ini contoh kerja minimum dalam menanggapi permintaan komentar:

* 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
Dan
sumber
1
Saya mengalami kesulitan mereproduksi pada Emacs 24.3.1 dan mode-org yang menyertainya. Bahkan dengan langkah-langkah reproduksi yang Anda sebutkan. Bisakah Anda menampilkan buffer mode mentah org? (Yang mengatakan, saya menganggap itu adalah bug dalam mode-org. Apakah menambahkan bantuan baris baru tambahan?)
aerique
Sama seperti @aerique, saya tidak melihat ini di sini. Jadi, mungkin ini tergantung pada versi Emacs, atau beberapa detail buffer mode org.
Stefan
@Dan, karena penasaran, tema apa yang Anda gunakan?
Luke
1
@ Bisakah Anda memberikan sumber contoh file org untuk pengujian?
Wilfred Hughes
2
@Dan saya bisa mereproduksi ini di Emacs 24.4 dengan file yang Anda berikan.
rekado

Jawaban:

10

Ini terlihat seperti bug dipicu oleh org-mode's org-activate-bracket-linksfungsi.

Seperti inilah fungsi ini:

(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)))

Ini mencari pertandingan untuk link tanda kurung (misalnya [[target][label]], menyembunyikan [[target][bagian dengan menambahkan ipke properti teks, maka linkifies yang labeldengan menambahkan vpke properti teks, dan akhirnya menghapus trailing ]]dengan menambahkan ipke properti teks lagi.

Ini semua terlihat benar. org-rear-nonsticky-atharus merawat pendarahan properti.

Perilaku ini dipicu oleh (add-text-properties (match-end 3) (match-end 0) ip), yang menyembunyikan trailing ]]. Hanya 'invisible 'org-linkproperti yang memicu perilaku ini, properti lainnya tampaknya tidak bersalah.

Anda bisa menimpa org-activate-bracket-linkssedemikian rupa sehingga iptidak lagi menetapkan 'invisibletetapi 'display "", yang memiliki efek yang sama:

(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)))

Jelas, ini adalah hack yang jelek. Tapi itu bekerja untuk saya dan mungkin bekerja untuk Anda. Saya masih merekomendasikan pengarsipan laporan bug.

rekado
sumber
Terima kasih atas usahanya (+1 untuk itu!), Tetapi solusi ini tidak berfungsi untuk saya. Alih-alih propertizing [[~/somefile.txt][link label]]sebagai link label(di mana huruf miring menunjukkan wajah standar untuk tautan), itu menjadi link label]](tanpa perubahan wajah). Saya akan mengajukan laporan bug.
Dan
Hmm, aneh. Satu-satunya perubahan dalam definisi saya org-activate-bracket-linksadalah mengganti 'invisible non-nildengan 'display "", sehingga masih harus menerapkan link wajah seperti sebelumnya. Ini pasti bekerja untuk saya di Emacs 24.4, tapi saya kira energi lebih baik dihabiskan untuk laporan bug daripada mencoba untuk membuat hack saya berfungsi ... :)
rekado