¿Cómo evitar que las caras sangran en las áreas circundantes de amortiguación?

20

P: ¿Cómo evito que las org-modecaras de enlace se deslicen hacia los ...caracteres de visualización selectiva al final de un encabezado plegado?

Este es un tic visual que me vuelve un poco loco. Cuando, en org-mode, un enlace es lo último en una línea, la cara del enlace se desborda en la ...que indica que el encabezado está plegado. Si hay, digamos, un espacio en blanco después del enlace, no hay sangrado.

La captura de pantalla que publiqué demuestra el problema. La línea tres es la línea problemática sin caracteres entre el final del enlace y el final de la línea, mientras que la línea cuatro muestra un enlace, seguido de un espacio:

comportamiento extraño de la cara de enlace

En primer lugar, ¿por qué sucede esto? En segundo lugar, y más al punto, ¿cómo hago para que pare?

ACTUALIZACIÓN 1: Según los comentarios, publicados a continuación son capturas de pantalla del búfer con los encabezados cerrados y abiertos. Abrí Emacs sin archivo de inicio (es decir, emacs -Q), required org-mode, y abrí este archivo de ejemplo. Entonces: no parece ser algo extraño en mi configuración.

Todos los encabezados cerrados: enlace extraño cara cerrada

Todos los encabezados abiertos: enlace extraño cara abierta

El tema que había estado usando arriba es inkpot, aunque tengo el mismo problema cuando uso el tema solarizado y el tema predeterminado (como en las nuevas capturas de pantalla).

La versión de Emacs es 24.3.1. Obtengo los mismos resultados cuando uso la versión de organización 7.9.3f (es decir, la que viene con esa versión de Emacs), así como 8.3beta.

ACTUALIZACIÓN 2: aquí hay un ejemplo de trabajo mínimo en respuesta a una solicitud de comentario:

* 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
fuente
1
Me está costando reproducirlo en Emacs 24.3.1 y el modo org que viene con él. Incluso con los pasos de reproducción que mencionaste. ¿Podría mostrar el búfer en modo org sin procesar? (Dicho esto, supongo que es un error en el modo org. ¿Ayuda agregar una nueva línea adicional?)
aerique
Igual que @aerique, no veo esto aquí. Entonces, tal vez esto depende de la versión de Emacs, o algún detalle del búfer del modo Org.
Stefan
@Dan, por curiosidad, ¿qué tema estás usando?
Lucas
1
@ ¿Podrías proporcionar la fuente de un archivo de organización de ejemplo para probar?
Wilfred Hughes
2
@ Dan, puedo reproducir esto en Emacs 24.4 con el archivo que proporcionaste.
rekado

Respuestas:

10

Esto parece un error provocado por org-modela org-activate-bracket-linksfunción de.

Así es como se ve esta función:

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

Busca una coincidencia para un enlace entre corchetes (por ejemplo [[target][label]], oculta la [[target][parte agregando ipa las propiedades de texto, luego vincula la labelagregando vpa las propiedades de texto y finalmente elimina el final ]]agregando ipnuevamente a las propiedades de texto.

Todo esto se ve bien. org-rear-nonsticky-atdebe cuidar el sangrado de la propiedad.

Este comportamiento se desencadena por (add-text-properties (match-end 3) (match-end 0) ip), lo que oculta el final ]]. Solo la 'invisible 'org-linkpropiedad activa este comportamiento, las otras propiedades parecen ser inocentes.

Puede sobrescribir de org-activate-bracket-linksmodo que ipya no se establezca , 'invisiblepero 'display ""que tiene el mismo efecto:

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

Claramente, este es un truco feo. Pero funciona para mí y podría funcionar para ti. Todavía recomiendo presentar un informe de error.

rekado
fuente
Gracias por el esfuerzo (¡+1 por eso!), Pero esta solución no me funciona. En lugar de apropiarse [[~/somefile.txt][link label]]como link label(donde las cursivas indican la cara estándar para el enlace), se convierte link label]](sin cambio en la cara). Presentaré un informe de error.
Dan
Mmm, extraño. El único cambio en mi definición de org-activate-bracket-linkses reemplazar 'invisible non-nilcon 'display "", por lo que aún debería aplicar la cara del enlace como antes. Ciertamente funciona para mí en Emacs 24.4, pero supongo que la energía está mejor gastado en el informe de error en lugar de tratar de hacer mi trabajo truco ... :)
rekado