як запобігти обличчю від кровотечі на навколишні ділянки буфера?


20

Питання: Як я можу уберегти org-modeобличчя посилань від кровотечі в ...селективні символи відображення в кінці складеного заголовка?

Це візуальна галочка, яка мене трохи горіха. Коли, org-modeпосилання, є останньою справою у рядку, обличчя посилання переливається у те, ...що вказує на те, що заголовок складений. Якщо після посилання є, скажімо, порожнє місце, кровотечі немає.

На скріншоті, який я розмістив, демонструється проблема. Третій рядок - це проблематична лінія, що не містить символів між кінцем посилання та кінцем рядка, тоді як у четвертій рядці показано посилання, а потім пробіл:

дивна поведінка обличчя

Перш за все, чому це відбувається? По-друге, і до речі, як змусити його зупинитися?

ОНОВЛЕННЯ 1: Відповідно до коментарів, розміщені нижче - це скріншоти буфера із закритими та відкритими заголовками. Я відкрив Emacs без файлу init (тобто emacs -Q), required org-mode, і відкрив цей приклад. Отже: у моїх налаштуваннях це не здається чимось непоганим.

Усі заголовки закриті: дивне посилання обличчя закрите

Усі заголовки відкриті: дивне посилання обличчя відкрите

Тема, яку я використовував вище, - це чорнильниця, хоча у мене виникає така ж проблема при використанні соляризованої теми, як і тема за замовчуванням (як у нових знімках екрана).

Версія Emacs - це 24.3.1. Я отримую ті ж результати, коли використовую org версію 7.9.3f (тобто ту, що входить до цієї версії Emacs), а також 8.3beta.

ОНОВЛЕННЯ 2: ось мінімальний робочий приклад у відповідь на запит на коментар:

* 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

1
Мені важко відтворити його на Emacs 24.3.1 і орга-режим, який поставляється з ним. Навіть згаданими вами кроками відтворення. Не могли б ви показати необроблений буфер орга-режиму? (Це сказав, я припускаю, що це помилка в org-режимі. Чи додає додаткову допомогу в
новому рядку

Як і @aerique, я цього не бачу тут. Отож, можливо, це залежить від версії Emacs або якоїсь деталі буфера режиму Org.
Стефан

@Dan, з цікавості, яку тему ти використовуєш?
Лука

1
@Ди могли б ви надати джерело тесту з прикладу org для тестування?
Вілфред Х'юз

2
@Dan Я можу відтворити це на Emacs 24.4 із наданим вами файлом.
rekado

Відповіді:


10

Це схоже на помилку, викликану функцією org-mode's org-activate-bracket-links.

Ось як виглядає ця функція:

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

Він шукає відповідність для скореного посилання (наприклад [[target][label]], приховує [[target][частину, додаючи ipдо властивостей тексту, потім пов'язує labelдодавання vpдо властивостей тексту і, нарешті, видаляє трейлінг ]], додаючи ipдо властивостей тексту знову.

Це все виглядає правильно. org-rear-nonsticky-atслід подбати про майнову кровотечу.

Така поведінка викликається тим (add-text-properties (match-end 3) (match-end 0) ip), що приховує відставання ]]. Лише 'invisible 'org-linkвластивість запускає таку поведінку, інші властивості здаються невинніми.

Ви можете перезаписати org-activate-bracket-linksтак, що ipбільше не встановлюється, 'invisibleале 'display ""це має той же ефект:

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

Зрозуміло, що це некрасивий злом. Але це працює для мене і може працювати для вас. Я все ж рекомендую подати звіт про помилку.


Дякую за зусилля (+1 за це!), Але це рішення не працює для мене. Замість того, щоб виправити [[~/somefile.txt][link label]]як link label(де курсивом вказано стандартне обличчя для посилання), воно стає link label]](без зміни обличчя). Я подам звіт про помилку.
Дан

Хм, дивно. Єдина зміна в моєму визначенні слова org-activate-bracket-links- це заміна 'invisible non-nilна 'display "", тому воно все одно має застосовувати обличчя посилання, як раніше. Це, безумовно, працює для мене в Emacs 24.4, але я гадаю, що енергію краще витратити на звіт про помилки, а не на спроби змусити мій хакер працювати ... :)
rekado
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.