Làm thế nào để ngăn chặn khuôn mặt chảy máu vào các khu vực xung quanh của bộ đệm?


20

H: Làm cách nào để giữ cho các org-modemặt liên kết không bị chảy máu vào các ...ký tự hiển thị chọn lọc ở cuối tiêu đề được gấp lại?

Đây là một đánh dấu trực quan khiến tôi có một chút hạt dẻ. Khi, trong org-mode, một liên kết là điều cuối cùng trên một dòng, mặt liên kết chảy vào trong ...đó chỉ ra rằng tiêu đề được gấp lại. Nếu có, giả sử, một khoảng trống sau liên kết, không có chảy máu.

Ảnh chụp màn hình tôi đã đăng cho thấy vấn đề. Dòng ba là dòng có vấn đề không có ký tự giữa cuối liên kết và cuối dòng, trong khi dòng bốn hiển thị một liên kết, theo sau là khoảng trắng:

hành vi liên kết khuôn mặt kỳ lạ

Trước hết, tại sao điều này xảy ra? Thứ hai, và hơn thế nữa, làm thế nào để tôi dừng lại?

CẬP NHẬT 1: Theo nhận xét, được đăng dưới đây là ảnh chụp màn hình của bộ đệm với các tiêu đề đóng và mở. Tôi đã mở Emacs không có tệp init (nghĩa là emacs -Q), requirechế độ org và mở tệp ví dụ này. Vì vậy: nó dường như không phải là một cái gì đó kooky trong thiết lập của tôi.

Tất cả các tiêu đề đóng cửa: khuôn mặt liên kết kỳ lạ đóng cửa

Tất cả các tiêu đề mở: liên kết lạ mặt mở

Chủ đề tôi đang sử dụng ở trên là inkpot, mặc dù tôi gặp vấn đề tương tự khi sử dụng chủ đề năng lượng mặt trời cũng như chủ đề mặc định (như trong ảnh chụp màn hình mới).

Phiên bản Emacs là 24.3.1. Tôi nhận được kết quả tương tự khi sử dụng phiên bản org 7.9.3f (nghĩa là phiên bản đi kèm với phiên bản Emacs đó), cũng như 8.3beta.

CẬP NHẬT 2: đây là một ví dụ hoạt động tối thiểu để đáp ứng yêu cầu bình luận:

* 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
Tôi đang gặp khó khăn khi tái tạo nó trên Emacs 24.3.1 và chế độ org đi kèm với nó. Ngay cả với các bước sinh sản mà bạn đề cập. Bạn có thể hiển thị bộ đệm chế độ org thô? (Điều đó nói rằng, tôi cho rằng đó là một lỗi trong chế độ org. Có thêm trợ giúp về dòng mới không?)
aerique

Giống như @aerique, tôi không thấy điều này ở đây. Vì vậy, có thể điều này phụ thuộc vào phiên bản Emacs hoặc một số chi tiết của bộ đệm chế độ Org.
Stefan

@Dan, vì tò mò, bạn đang sử dụng chủ đề gì?
Lu-ca

1
@Dan bạn có thể vui lòng cung cấp nguồn của một tệp org ví dụ để thử nghiệm không?
Wilfred Hughes

2
@Dan Tôi có thể sao chép này trên Emacs 24.4 với tệp bạn cung cấp.
rekado

Câu trả lời:


10

Đây trông giống như một lỗi kích hoạt bởi org-mode's org-activate-bracket-linkschức năng.

Đây là những gì chức năng này trông giống như:

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

Nó tìm kiếm sự trùng khớp cho một liên kết được đặt trong ngoặc đơn (ví dụ: [[target][label]]ẩn [[target][phần đó bằng cách thêm ipvào các thuộc tính văn bản, sau đó liên kết labelbằng cách thêm vpvào các thuộc tính văn bản và cuối cùng xóa dấu vết ]]bằng cách thêm iplại vào thuộc tính văn bản.

Tất cả điều này có vẻ đúng. org-rear-nonsticky-atNên chăm sóc chảy máu tài sản.

Hành vi này được kích hoạt bởi (add-text-properties (match-end 3) (match-end 0) ip), trong đó ẩn dấu vết ]]. Chỉ có 'invisible 'org-linktài sản kích hoạt hành vi này, các thuộc tính khác dường như vô tội.

Bạn có thể ghi đè lên org-activate-bracket-linkssao cho ipkhông còn thiết lập 'invisiblenhưng 'display "", có tác dụng tương tự:

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

Rõ ràng, đây là một hack xấu xí. Nhưng nó làm việc cho tôi và có thể làm việc cho bạn. Tôi vẫn khuyên bạn nên nộp báo cáo lỗi.


Cảm ơn bạn đã nỗ lực (+1 cho điều đó!), Nhưng giải pháp này không hiệu quả với tôi. Thay vì điều chỉnh [[~/somefile.txt][link label]]đúng như link label(trong đó chữ nghiêng chỉ ra khuôn mặt chuẩn cho liên kết), nó trở thành link label]](không có thay đổi về mặt). Tôi sẽ nộp báo cáo lỗi.
Dan

Hừm, lạ thật. Thay đổi duy nhất trong định nghĩa của tôi org-activate-bracket-linkslà thay thế 'invisible non-nilbằng 'display "", vì vậy nó vẫn nên áp dụng mặt liên kết như trước. Nó chắc chắn hoạt động với tôi trong Emacs 24.4, nhưng tôi đoán năng lượng được sử dụng tốt hơn cho báo cáo lỗi thay vì cố gắng để hack của tôi hoạt động ... :)
rekado
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.