jak zapobiec krwawieniu twarzy na otaczające obszary bufora?

20

P: Jak uchronić org-modetwarze linków przed wykrwawieniem się do ...selektywnych wyświetlanych znaków na końcu złożonego nagłówka?

To wizualne tik, który doprowadza mnie do szału. Kiedy, w org-mode, link jest ostatnią rzeczą w linii, powierzchnia łącza krwawi do oznaczenia ..., że nagłówek jest złożony. Jeśli za linkiem jest, powiedzmy, spacja, nie ma krwawienia.

Zrzut ekranu, który opublikowałem, pokazuje problem. Linia trzecia to problematyczna linia bez znaków między końcem linku a końcem linii, natomiast linia czwarta pokazuje link, a po nim spację:

dziwne zachowanie twarzy łącza

Po pierwsze, dlaczego tak się dzieje? Po drugie, i jeszcze bardziej do rzeczy, jak mogę to zatrzymać?

AKTUALIZACJA 1: Zgodnie z komentarzami zamieszczone poniżej zrzuty ekranu bufora z zamkniętymi i otwartymi nagłówkami. Otworzyłem Emacsa bez pliku inicjującego (tj. emacs -Q), requireTryb-org i otworzyłem ten przykładowy plik. Więc: nie wydaje mi się, żeby było to dziwne w mojej konfiguracji.

Wszystkie nagłówki zamknięte: dziwna twarz łącza zamknięta

Wszystkie nagłówki są otwarte: dziwna twarz otwarta

Motyw, którego użyłem powyżej, to kałamarz, chociaż mam ten sam problem, gdy używam motywu słonecznego, a także motywu domyślnego (jak w nowych zrzutach ekranu).

Wersja Emacsa to 24.3.1. Te same wyniki otrzymuję przy użyciu wersji org 7.9.3f (tj. Tej dołączonej do tej wersji Emacsa), a także wersji 8.3beta.

AKTUALIZACJA 2: oto minimalny działający przykład w odpowiedzi na prośbę o komentarz:

* 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
źródło
1
Trudno mi go odtworzyć w Emacsie 24.3.1 i dołączonym do niego trybie org. Nawet przy wspomnianych krokach reprodukcji. Czy możesz pokazać surowy bufor w trybie org? (To powiedziawszy, zakładam, że jest to błąd w trybie org. Czy dodanie dodatkowej nowej linii pomaga?)
aerique
Podobnie jak @aerique, nie widzę tego tutaj. Może to zależy od wersji Emacsa lub szczegółów bufora trybu Org.
Stefan
@Dan, z ciekawości, jakiego motywu używasz?
Łukasz
1
@ Czy możesz podać źródło przykładowego pliku org do testowania?
Wilfred Hughes
2
@ Dan Mogę to odtworzyć na Emacsie 24.4 z podanym plikiem.
rekado

Odpowiedzi:

10

To wygląda jak błąd wywołany przez org-mode„s org-activate-bracket-linksfunkcji.

Tak wygląda ta funkcja:

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

Wyszukuje dopasowanie do nawiasów linkowych (np. [[target][label]]Ukrywa [[target][część, dodając ipdo właściwości tekstu, następnie łączy linki label, dodając vpdo właściwości tekstu, i na koniec usuwa końcowe ]], dodając ipponownie do właściwości tekstu.

To wszystko wygląda dobrze. org-rear-nonsticky-atpowinien zająć się krwawieniem z nieruchomości.

To zachowanie jest wywoływane przez (add-text-properties (match-end 3) (match-end 0) ip), co ukrywa końcowe ]]. Tylko 'invisible 'org-linkwłaściwość wyzwala to zachowanie, pozostałe właściwości wydają się niewinne.

Możesz nadpisać org-activate-bracket-links, aby ipnie ustawiał już, 'invisibleale 'display ""ma ten sam efekt:

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

Oczywiście jest to brzydki hack. Ale to działa dla mnie i może działać dla ciebie. Nadal polecam złożenie raportu o błędzie.

rekado
źródło
Dziękuję za wysiłek (+1 za to!), Ale to rozwiązanie nie działa dla mnie. Zamiast sugerować [[~/somefile.txt][link label]]jako link label(gdzie kursywą wskazuje standardową powierzchnię dla linku), staje się link label]](bez zmiany twarzy). Złożę raport o błędzie.
Dan
Hmm, dziwne. Jedyną zmianą w mojej definicji org-activate-bracket-linksjest zastąpienie 'invisible non-nilgo 'display "", więc nadal powinno ono stosować twarz łącza jak poprzednio. Z pewnością działa dla mnie w Emacs 24.4, ale myślę, że lepiej jest wydawać energię na raport o błędzie, niż próbować zmusić mojego
hacka