comment empêcher les visages de saigner sur les zones environnantes de tampon?

20

Q: Comment empêcher les org-modefaces de lien de déborder dans les ...caractères d'affichage sélectif à la fin d'un en-tête plié?

C'est une tique visuelle qui me rend un peu fou. Lorsque, dans org-mode, un lien est la toute dernière chose sur une ligne, la face du lien déborde dans le ...qui indique que l'en-tête est replié. S'il y a, disons, un espace vide après le lien, il n'y a pas de saignement.

La capture d'écran que j'ai publiée montre le problème. La ligne trois est la ligne problématique sans caractère entre la fin du lien et la fin de la ligne, tandis que la ligne quatre montre un lien, suivi d'un espace:

comportement de visage de lien étrange

Tout d'abord, pourquoi cela se produit-il? Deuxièmement, et plus précisément, comment puis-je l'arrêter?

MISE À JOUR 1: Selon les commentaires, les captures d'écran du tampon sont affichées ci-dessous avec les en-têtes fermés et ouverts. J'ai ouvert Emacs sans fichier init (c'est-à-dire, emacs -Q), required org-mode, et ouvert cet exemple de fichier. Donc: cela ne semble pas être quelque chose de bizarre dans ma configuration.

Tous les en-têtes fermés: visage de lien étrange fermé

Tous les en-têtes ouverts: visage de lien étrange ouvert

Le thème que j'avais utilisé ci-dessus est encrier, bien que j'obtienne le même problème lors de l'utilisation du thème solarisé ainsi que du thème par défaut (comme dans les nouvelles captures d'écran).

La version d'Emacs est 24.3.1. J'obtiens les mêmes résultats lorsque j'utilise la version 7.9.3f de l'organisation (c'est-à-dire celle fournie avec cette version d'Emacs), ainsi que la version 8.3beta.

MISE À JOUR 2: voici un exemple de travail minimum en réponse à une demande de commentaire:

* 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
la source
1
J'ai du mal à le reproduire sur Emacs 24.3.1 et le mode org qui l'accompagne. Même avec les étapes de reproduction que vous avez mentionnées. Pourriez-vous montrer le tampon brut en mode org? (Cela dit, je suppose que c'est un bug en mode org. L'ajout d'une nouvelle ligne supplémentaire aide-t-il?)
aerique
Comme @aerique, je ne vois pas ça ici. Donc, cela dépend peut-être de la version d'Emacs, ou de certains détails du tampon du mode Org.
Stefan
@Dan, par curiosité, quel thème utilisez-vous?
Luke
1
@Dan pourriez-vous s'il vous plaît fournir la source d'un exemple de fichier org pour les tests?
Wilfred Hughes
2
@Dan Je peux reproduire ceci sur Emacs 24.4 avec le fichier que vous avez fourni.
rekado du

Réponses:

10

Cela ressemble à un bug déclenché par org-modela org-activate-bracket-linksfonction de.

Voici à quoi ressemble cette fonction:

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

Il recherche une correspondance pour un lien entre crochets (par exemple [[target][label]], masque la [[target][partie en l'ajoutant ipaux propriétés du texte, puis le relie en l' labelajoutant vpaux propriétés du texte, et enfin supprime la fin ]]en ajoutant ipà nouveau aux propriétés du texte.

Tout semble correct. org-rear-nonsticky-atdevrait prendre soin des saignements de la propriété.

Ce comportement est déclenché par (add-text-properties (match-end 3) (match-end 0) ip), qui masque la fin ]]. Seule la 'invisible 'org-linkpropriété déclenche ce comportement, les autres propriétés semblent innocentes.

Vous pouvez écraser de org-activate-bracket-linkstelle sorte que ipne définit plus 'invisiblemais 'display "", ce qui a le même effet:

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

De toute évidence, c'est un hack laid. Mais cela fonctionne pour moi et pourrait fonctionner pour vous. Je recommande toujours de déposer un rapport de bogue.

rekado
la source
Merci pour l'effort (+1 pour ça!), Mais cette solution ne fonctionne pas pour moi. Plutôt que de proposer [[~/somefile.txt][link label]]comme link label(où l'italique indique le visage standard pour le lien), il devient link label]](sans changement de visage). Je déposerai un rapport de bogue.
Dan
Hmm, étrange. Le seul changement dans ma définition de org-activate-bracket-linksremplace 'invisible non-nilpar 'display "", il devrait donc toujours appliquer la face du lien comme précédemment. Cela fonctionne certainement pour moi dans Emacs 24.4, mais je suppose que l'énergie est mieux dépensée pour le rapport de bogue plutôt que d'essayer de faire fonctionner mon hack ... :)
rekado