Có thể có được các biểu tượng được chỉnh sửa trong các khối nguồn ở chế độ Org không?


7

Tôi có một vài biểu tượng prettify-symbols-alistđể cải thiện sự xuất hiện của mã elisp trong tệp cấu hình của tôi. Tôi đang di chuyển tệp cấu hình của mình từ Elisp sang chế độ Org và tôi muốn giữ các biểu tượng đã được chỉnh sửa. Điều này có thể đạt được trong chế độ Org 8.3 không?

Câu trả lời:


4

Nếu bạn muốn các ký hiệu được thêm vào trong toàn bộ tệp org, chỉ cần xác định prettify-symbols-alisttrong bộ đệm và bật prettify-symbols-mode.

Nhưng một giải pháp tốt hơn sẽ đảm bảo rằng các ký hiệu này chỉ được bổ sung trong các khối src (và theo chế độ ngôn ngữ). Lưu ý rằng chúng là khi chỉnh sửa khối nguồn thông qua org-edit-src-code(vì khối src được sao chép trong bộ đệm ở chế độ chính tương ứng).

Nhìn vào cách hoạt động của phông chữ khối src (chức năng org-src-font-lock-fontify-blocktrong tệp org-src.el:

  1. trích xuất khối dưới dạng chuỗi
  2. chèn nó vào một bộ đệm chuyên dụng
  3. đặt chế độ chính ngôn ngữ
  4. gọi font-lock-fontify-buffer
  5. sao chép 'thuộc tính khuôn mặt từ bộ đệm sang bộ đệm org
  6. đánh dấu văn bản trong bộ đệm org là phông chữ khóa

Và nhìn thấy (chức năng enter prettify-symbols-modetrong tập tin prog-mode.el) rằng sự hoàn thiện biểu tượng phụ thuộc vào 'compositioncác thuộc tính, người ta có thể suy luận rằng chúng ta chỉ cần thay đổi org-src-font-lock-fontify-blockđể làm cho nó sao chép 'compositioncác thuộc tính là tốt.

Đây là chức năng được sửa đổi (xem phần 'Bổ sung' được đánh dấu):

(defun org-src-font-lock-fontify-block (lang start end)
  "Fontify code block.
This function is called by emacs automatic fontification, as long
as `org-src-fontify-natively' is non-nil."
  (let ((lang-mode (org-src--get-lang-mode lang)))
    (when (fboundp lang-mode)
      (let ((string (buffer-substring-no-properties start end))
        (modified (buffer-modified-p))
        (org-buffer (current-buffer)) pos next)
    (remove-text-properties start end '(face nil))
    (with-current-buffer
        (get-buffer-create
         (concat " org-src-fontification:" (symbol-name lang-mode)))
      (delete-region (point-min) (point-max))
      (insert string " ") ;; so there's a final property change
      (unless (eq major-mode lang-mode) (funcall lang-mode))
      ;; Avoid `font-lock-ensure', which does not display fonts in
      ;; source block.
      (font-lock-fontify-buffer)
      (setq pos (point-min))
      (while (setq next (next-single-property-change pos 'face))
        (put-text-property
         (+ start (1- pos)) (1- (+ start next)) 'face
         (get-text-property pos 'face) org-buffer)
        (setq pos next))
      ;; Addition: also copy 'composition info for prettified symbols
      (setq pos (point-min))
      (while (setq next (next-single-property-change pos 'composition))
        (put-text-property
         (+ start (1- pos)) (1- (+ start next)) 'composition
         (get-text-property pos 'composition) org-buffer)
        (setq pos next))
      ;; End addition
      )
    (add-text-properties
     start end
     '(font-lock-fontified t fontified t font-lock-multiline t))
    (set-buffer-modified-p modified)))))

Bạn phải đảm bảo điều này được tải sau khi định nghĩa trong org-src.el.


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.