como impedir que os rostos sangrem nas áreas adjacentes do buffer?

20

P: Como evito que os org-moderostos dos links percam os ...caracteres de exibição seletiva no final de um cabeçalho dobrado?

Este é um sinal visual que me deixa um pouco maluco. Quando, em org-mode, um link é a última coisa em uma linha, a face do link passa para o ...que indica que o cabeçalho está dobrado. Se houver, por exemplo, um espaço em branco após o link, não haverá sangramento.

A captura de tela que publiquei demonstra o problema. A linha três é a linha problemática sem caracteres entre o final do link e o final da linha, enquanto a linha quatro mostra um link, seguido por um espaço:

comportamento estranho do rosto do link

Primeiro de tudo, por que isso acontece? Segundo, e mais ao ponto, como faço para parar?

ATUALIZAÇÃO 1: De acordo com os comentários, postadas abaixo estão as capturas de tela do buffer com os cabeçalhos fechados e abertos. Abri o Emacs sem o arquivo init (ie emacs -Q), required org-mode e abri este arquivo de exemplo. Então: não parece ser algo estranho na minha configuração.

Todos os cabeçalhos fechados: rosto estranho link fechado

Todos os cabeçalhos abertos: rosto estranho link aberto

O tema que eu estava usando acima é o inkpot, embora eu tenha o mesmo problema ao usar o tema solarizado e o tema padrão (como nas novas capturas de tela).

A versão do Emacs é 24.3.1. Eu obtenho os mesmos resultados ao usar a versão organizacional 7.9.3f (ou seja, aquela que acompanha a versão do Emacs), bem como a 8.3beta.

ATUALIZAÇÃO 2: veja um exemplo de trabalho mínimo em resposta a uma solicitação de comentário:

* 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
fonte
1
Estou tendo dificuldade em reproduzi-lo no Emacs 24.3.1 e no modo org que vem com ele. Mesmo com as etapas de reprodução que você mencionou. Você poderia mostrar o buffer bruto do modo organizacional? (Dito isto, eu suponho que é um bug no org-mode faz a adição de uma nova linha de ajuda extra.?)
aerique
Mesmo que @aerique, não vejo isso aqui. Portanto, talvez isso dependa da versão do Emacs ou de alguns detalhes do buffer do modo Org.
Stefan
@ Dan, por curiosidade, que tema você está usando?
Lucas
1
@ Dan, você poderia fornecer a fonte de um exemplo de arquivo organizacional para teste?
Wilfred Hughes
2
@ Dan Eu posso reproduzir isso no Emacs 24.4 com o arquivo que você forneceu.
rekado 27/10

Respostas:

10

Isto parece um erro desencadeado por org-mode's org-activate-bracket-linksfunção.

É assim que essa função se parece:

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

Ele procura por uma correspondência para um link entre colchetes (por exemplo [[target][label]], esconde a [[target][parte adicionando ipàs propriedades de texto, em seguida, linkifies o labeladicionando vpàs propriedades de texto, e, finalmente, remove a fuga ]]através da adição ipàs propriedades de texto novamente.

Tudo isso parece certo. org-rear-nonsticky-atdeve cuidar do sangramento da propriedade.

Esse comportamento é acionado por (add-text-properties (match-end 3) (match-end 0) ip), que oculta o final ]]. Somente a 'invisible 'org-linkpropriedade aciona esse comportamento, as outras propriedades parecem inocentes.

Você pode sobrescrever de org-activate-bracket-linksforma que ipnão seja mais definido , 'invisiblemas 'display ""que tenha o mesmo efeito:

(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 é um truque feio. Mas funciona para mim e pode funcionar para você. Eu ainda recomendo arquivar um relatório de bug.

rekado
fonte
Obrigado pelo esforço (+1 por isso!), Mas esta solução não está funcionando para mim. Em vez de afirmar [[~/somefile.txt][link label]]como link label(onde itálico indica a face padrão do link), ele se torna link label]](sem alterações na face). Vou registrar um relatório de bug.
Dan
Hmm, estranho. A única alteração na minha definição de org-activate-bracket-linksé substituir 'invisible non-nilpor 'display "", portanto, ainda deve aplicar a face do link como antes. Ele certamente funciona para mim no Emacs 24,4, mas eu acho que a energia é mais bem gasto no relatório de erro, em vez de tentar fazer o meu trabalho corte ... :)
rekado