Wie kann verhindert werden, dass Gesichter auf die umliegenden Pufferbereiche bluten?

20

F: Wie verhindere ich, dass org-modeVerknüpfungsflächen in die ...selektiven Anzeigezeichen am Ende einer gefalteten Kopfzeile übergehen?

Dies ist eine visuelle Zecke, die mich ein wenig verrückt macht. Wenn org-modeein Link das allerletzte Element in einer Zeile ist, überläuft die Linkfläche die ..., die angibt, dass der Header zusammengefaltet ist. Wenn beispielsweise nach dem Link eine Leerstelle vorhanden ist, tritt kein Ausbluten auf.

Der Screenshot, den ich gepostet habe, zeigt das Problem. Zeile drei ist die problematische Zeile ohne Zeichen zwischen dem Ende des Links und dem Ende der Zeile, während Zeile vier einen Link gefolgt von einem Leerzeichen anzeigt:

seltsames Linkgesichtsverhalten

Zuallererst, warum passiert das? Zweitens und genauer gesagt, wie bringe ich es zum Stillstand?

UPDATE 1: Gemäß den Kommentaren unten sind Screenshots des Puffers mit geschlossenen und offenen Headern. Ich habe Emacs geöffnet ohne init - Datei (dh emacs -Q), required org-Modus, und diese Beispieldatei geöffnet. Also: es scheint nicht verrückt in meinem Setup zu sein.

Alle Header geschlossen: komisches Linkgesicht geschlossen

Alle Überschriften öffnen: komischer Link offen

Das Thema, das ich oben verwendet habe, ist inkpot, obwohl ich das gleiche Problem habe, wenn ich das solarisierte Thema sowie das Standardthema (wie in den neuen Screenshots) verwende.

Emacs-Version ist 24.3.1. Ich erhalte die gleichen Ergebnisse, wenn ich die org-Version 7.9.3f (dh die mit dieser Emacs-Version mitgelieferte) sowie 8.3beta verwende.

UPDATE 2: Hier ist ein minimales Arbeitsbeispiel als Antwort auf eine Kommentaranfrage:

* 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
quelle
1
Es fällt mir schwer, es auf Emacs 24.3.1 und dem damit verbundenen Org-Modus zu reproduzieren. Auch bei den von Ihnen genannten Wiedergabeschritten. Könnten Sie den unformatierten Organisationsmoduspuffer anzeigen? (Das heißt, ich nehme an, es ist ein Fehler im Org-Modus. Hilft das Hinzufügen eines zusätzlichen Zeilenumbruchs?)
Aerique
Das gleiche wie bei @aerique sehe ich hier nicht. Vielleicht hängt dies von der Emacs-Version oder einigen Details des Org-Modus-Puffers ab.
Stefan
@Dan, aus Neugier, welches Thema verwendest du?
Luke
1
@Dan könntest du bitte die Quelle einer Beispiel-Org-Datei zum Testen angeben?
Wilfred Hughes
2
@Dan Ich kann dies auf Emacs 24.4 mit der von Ihnen bereitgestellten Datei reproduzieren.
Rekado

Antworten:

10

Dies sieht aus wie ein Fehler, der durch org-modedie org-activate-bracket-linksFunktion von ausgelöst wird .

So sieht diese Funktion aus:

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

Es sucht nach einer Übereinstimmung für einen in Klammern gesetzten Link (z. B. [[target][label]]verbirgt das [[target][Teil durch Hinzufügen ipzu den Texteigenschaften, verknüpft das dann labeldurch Hinzufügen vpzu den Texteigenschaften und entfernt schließlich das Nachziehen ]]durch erneutes Hinzufügen zu den Texteigenschaften ip.

Das sieht alles richtig aus. org-rear-nonsticky-atsollte sich um das Ausbluten von Eigentum kümmern.

Ausgelöst wird dieses Verhalten durch (add-text-properties (match-end 3) (match-end 0) ip), welches das Trailing verbirgt ]]. Nur die 'invisible 'org-linkEigenschaft löst dieses Verhalten aus, die anderen Eigenschaften scheinen unschuldig zu sein.

Sie könnten überschreiben , org-activate-bracket-linksso dass ipnicht mehr Sätze 'invisibleaber 'display "", die die gleiche Wirkung hat:

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

Dies ist eindeutig ein hässlicher Hack. Aber es funktioniert für mich und könnte für Sie arbeiten. Ich empfehle weiterhin, einen Fehlerbericht einzureichen.

rekado
quelle
Vielen Dank für die Mühe (+1 dafür!), Aber diese Lösung funktioniert bei mir nicht. Anstatt propertizing [[~/somefile.txt][link label]]als link label(wo kursiv die Standardfläche für den Link angeben), wird es link label]](ohne Veränderung der Fläche). Ich werde einen Fehlerbericht einreichen.
Dan
Hmm, komisch. Die einzige Änderung in meiner Definition von org-activate-bracket-linksist das Ersetzen 'invisible non-nildurch 'display "". Daher sollte die Verknüpfungsfläche weiterhin wie zuvor angewendet werden. In Emacs 24.4 funktioniert das sicherlich, aber ich denke, Energie wird besser für den Fehlerbericht aufgewendet, als dafür, dass mein Hack funktioniert ... :)
rekado